SQLancer: Detección de errores lógicos en DBMS o sistema de gestión de bases de datos

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:

Una: 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.

Dos: Pruebas. El objetivo de esta fase es detectar los errores lógicos basados ​​en 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.
CockRoackDB 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ó.

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í.

? Quizás te interese: Cómo aprender Python 2021, ? ▷ Cómo aprender aprendizaje automático o machine learning 2021, ▷ Más de 200 de los mejores tutoriales de aprendizaje automático, PNL y Python

Relacionados

Deja un comentario