SQLancer (Synthesized Query Lancer) es una herramienta para probar autom谩ticamente los sistemas de gesti贸n de bases de datos (DBMS) para encontrar errores l贸gicos en su implementaci贸n. Nos referimos a los errores l贸gicos como aquellos errores que hacen que el DBMS obtenga un conjunto de resultados incorrecto (por ejemplo, al omitir un registro).

SQLancer opera en las siguientes dos fases:

  • Generaci贸n de base de datos: El objetivo de esta fase es crear una base de datos poblada y hacer hincapi茅 en el DBMS para aumentar la probabilidad de causar un estado de base de datos inconsistente que podr铆a detectarse posteriormente. Primero, se crean tablas aleatorias. Luego, se eligen al azar sentencias SQL para generar, modificar y eliminar datos. Tambi茅n se env铆an al DBMS otras declaraciones, como aquellas para crear 铆ndices, as铆 como vistas y para establecer opciones espec铆ficas de DBMS.
  • Pruebas: el objetivo de esta fase es detectar los errores l贸gicos basados 鈥嬧媏n la base de datos generada. Vea los enfoques de prueba a continuaci贸n.

Empezando con SQLancer

Requisitos:

  • Java 11
  • Maven ( sudo apt install mavenen Ubuntu)
  • El DBMS que desea probar (SQLite es un DBMS incorporado y est谩 incluido)

Los siguientes comandos clonan SQLancer, crean un JAR e inician SQLancer para difuminar SQLite usando el Particionamiento de consultas l贸gicas ternarias (TLP):

git clone https://github.com/sqlancer/sqlancer
cd sqlancer
mvn package
cd target
java -jar SQLancer-0.0.1-SNAPSHOT.jar --num_threads 16 --num_tries 5 --max_expression_depth 3 --num_queries 100000 --max_num_inserts 30 sqlite3 --oracle query_partitioning

Si la ejecuci贸n imprime informaci贸n de progreso cada cinco segundos, la herramienta funciona como se esperaba. Tenga en cuenta que SQLancer puede encontrar errores en SQLite. Antes de informar sobre esto, aseg煤rese de verificar que todav铆a puedan reproducirse cuando use la 煤ltima versi贸n de desarrollo.

Si inicia SQLancer sin par谩metros, se muestran las opciones y comandos disponibles.

Prototipo de investigaci贸n

Este proyecto en esta etapa a煤n debe verse como un prototipo de investigaci贸n. Creemos que la herramienta no est谩 lista para ser utilizada. Sin embargo, hemos recibido muchas solicitudes de empresas, organizaciones y desarrolladores individuales, por lo que decidimos lanzar la herramienta prematuramente.

Espere errores, incompatibilidades, falta de documentaci贸n y calidad de c贸digo insuficiente. Dicho esto, estamos trabajando arduamente para abordar estos problemas y mejorar SQLancer para convertirnos en una pieza de software de calidad de producci贸n. Damos la bienvenida a cualquier informe de problemas, solicitudes de extensi贸n y contribuciones de c贸digo.

Enfoques de Pruebas

Acercarse Descripci贸n
S铆ntesis de consulta pivotada (PQS) PQS es la primera t茅cnica que dise帽amos e implementamos. Selecciona aleatoriamente una fila, llamada fila din谩mica, para la cual se genera una consulta que se garantiza que recuperar谩 la fila. Si la fila no est谩 contenida en el conjunto de resultados, se ha detectado un error. Se describe completamente aqu铆. PQS es la t茅cnica m谩s poderosa, pero tambi茅n requiere m谩s esfuerzo de implementaci贸n que las otras dos t茅cnicas. Actualmente est谩 sin mantenimiento.
Construcci贸n del motor de referencia sin optimizaci贸n (NoREC) NoREC tiene como objetivo encontrar errores de optimizaci贸n. Se describe aqu铆. Traduce una consulta que es potencialmente optimizada por el DBMS a una para la que casi ninguna optimizaci贸n es aplicable, y compara los dos conjuntos de resultados. Una falta de coincidencia entre los conjuntos de resultados indica un error en el DBMS.
Particionamiento l贸gico ternario (TLP) TLP divide una consulta en tres consultas de partici贸n, cuyos resultados se componen y se comparan con el conjunto de resultados de la consulta original. Una falta de coincidencia en los conjuntos de resultados indica un error en el DBMS. A diferencia de NoREC y PQS, puede detectar errores en funciones avanzadas como funciones agregadas.

DBMS Soportado

Dado que los dialectos de SQL difieren ampliamente, cada DBMS a probar requiere una implementaci贸n separada.

DBMS Estado Generaci贸n de expresiones Descripci贸n
SQLite Trabajando Sin tipo Actualmente, esta implementaci贸n se ve afectada por una regresi贸n significativa del rendimiento que a煤n debe investigarse
MySQL Trabajando Sin tipo La ejecuci贸n de esta implementaci贸n probablemente descubre errores adicionales no reportados.
PostgreSQL Trabajando Mecanografiado
MariaDB Preliminar Sin tipo La implementaci贸n de este DBMS es muy preliminar, ya que dejamos de extenderlo despu茅s de que se abordaron todos menos uno de nuestros informes de errores. Ejecutarlo probablemente descubre errores adicionales no reportados.
CucarachaDB Trabajando Mecanografiado
TiDB Trabajando Sin tipo
DuckDB Trabajando Sin tipo, Gen茅rico
ClickHouse Preliminar Sin tipo, Gen茅rico Implementar los diferentes motores de tabla no era conveniente, por lo que solo existe una implementaci贸n muy preliminar.
TDEngine Remoto Sin tipo Eliminamos la implementaci贸n de TDEngine, ya que todos menos uno de nuestros informes de errores a煤n no fueron abordados cinco meses despu茅s de que los informamos.

Integraci贸n continua y conjunto de pruebas

Para mejorar y mantener la calidad del c贸digo de SQLancer, utilizamos varias herramientas:

  • El formateador de c贸digo Eclipse, para garantizar un formato consistente (Ejecutar mvn formatter:formatpara formatear todos los archivos).
  • Checkstyle, para imponer un est谩ndar de codificaci贸n consistente.
  • PMD, que encuentra fallas de programaci贸n mediante an谩lisis est谩tico.
  • SpotBugs, que tambi茅n utiliza an谩lisis est谩tico para encontrar errores y fallas de programaci贸n.

Puede ejecutarlos con el siguiente comando:

mvn verify

Planeamos agregar pronto un CI para verificar autom谩ticamente los RP. Posteriormente, tambi茅n planeamos agregar pruebas de humo para cada DBMS para probar que la implementaci贸n de prueba respectiva no est谩 obviamente rota, vea aqu铆.

SQLancer actualmente no tiene un conjunto de pruebas. Descubrimos que los errores en SQLancer se encuentran r谩pidamente y son f谩ciles de depurar al probar el DBMS. La implementaci贸n de PQS ten铆a un conjunto de pruebas, que se elimin贸 en commit 36ede0c0c68b3856e03ef5ba802a7c2575bb3f12.

Registros de SQLancer

SQLancer almacena registros en el subdirectorio target/logs. De manera predeterminada, la opci贸n --log-each-select est谩 habilitada, lo que da como resultado que se registre cada instrucci贸n SQL que se env铆e al DBMS. Los nombres de los archivos correspondientes se posponen con -cur.log. Adem谩s, si SQLancer detecta un error l贸gico, crea un archivo con la extensi贸n .log, en el que se registran las declaraciones para reproducir el error.

Implementaci贸n de soporte para un nuevo DBMS

La implementaci贸n de DuckDB proporciona una buena plantilla para una nueva implementaci贸n. La clase DuckDBProvider es la clase central que gestiona la creaci贸n de las bases de datos y ejecuta los or谩culos de prueba seleccionados. Intente copiar su estructura para el nuevo DBMS que desea implementar y comience por generar bases de datos (sin implementar un or谩culo de prueba).

Como parte de esto, tambi茅n deber谩 implementar el equivalente de DuckDBSchema, que representa el esquema de la base de datos de la base de datos generada. Despu茅s de que pueda generar bases de datos con 茅xito, el siguiente paso es generar uno de los or谩culos de prueba. Por ejemplo, es posible que desee implementar NoREC (consulte DuckDBNoRECOracle o DuckDBQueryPartitioningWhereTester para TLP).

Como parte de esto, tambi茅n debe implementar un generador de expresiones aleatorias (consulte DuckDBExpressionGenerator) y un visitante para derivar la representaci贸n textual de una expresi贸n (ver DuckDBToStringVisitor).

SQLancer con Eclipse

Se espera que el desarrollo de SQLancer usando Eclipse funcione bien. Puede importar SQLancer con un solo paso:

File -> Import -> Existing Maven Projects -> Select the SQLancer directory as root directory -> Finish

Si no encuentra una opci贸n para importar proyectos de Maven, es posible que deba instalar el complemento M2Eclipse.

Comunidad de SQLancer

Hemos creado un espacio de trabajo de Slack para analizar SQLancer y las pruebas de DBMS en general. El identificador oficial de Twitter de SQLancer es @sqlancer_dbms.

Recursos adicionales

  • Una charla de S铆ntesis de consulta pivotada (anterior) (PQS) est谩 disponible en YouTube.
  • PingCAP ha implementado PQS en una herramienta llamada wreck-it.
  • M谩s informaci贸n sobre nuestros esfuerzos de prueba de DBMS y los errores que encontramos est谩 disponible aqu铆.

馃敟 Seguro tambi茅n te interesa: C贸mo aprender Python en 2020, 馃 鈻 C贸mo aprender aprendizaje autom谩tico o machine learning en 2020 馃, 鈻 M谩s de 200 de los mejores tutoriales de aprendizaje autom谩tico, PNL y Python

SQLancer (Synthesized Query Lancer) es una herramienta para probar autom谩ticamente los sistemas de gesti贸n de bases de datos (DBMS) para encontrar errores l贸gicos en su implementaci贸n. Nos referimos a los errores l贸gicos como aquellos errores que hacen que el DBMS obtenga un conjunto de resultados incorrecto (por ejemplo, al omitir un registro).

馃巵 Visita Nuestra Tienda 馃巵