La herramienta de generación de SQL se puede utilizar para probar la compatibilidad de Parser con otros productos de bases de datos. Al analizar las producciones en el archivo de gramática YACC , se genera la declaración SQL correspondiente y luego se utiliza la base de datos para ejecutar el SQL . , se juzga si la declaración es compatible con la sintaxis de otra base de datos.
0 1 Uso de herramientas
Preprocesamiento de archivos gramaticales
El propósito del preprocesamiento es eliminar el contenido irrelevante en el archivo de gramática y retener solo las producciones de cada declaración. Puede obtener las reglas gramaticales en el archivo de gramática (sin Acción) mediante el comando bison -v sql.y y luego eliminarlas. El contenido generado en el archivo generado, como la lista de símbolos terminales, la lista de símbolos no terminales, la tabla de transición de estado, etc., son los siguientes:
El contenido del archivo sql.output generado es el siguiente, solo conservamos su sección " Sintaxis ":
Nota: Para la sección " Sintaxis " reservada, también es necesario eliminar su número de serie.
Para el proceso anterior, lo encapsulamos a través del script de preprocesamiento preprocess.sh para que los archivos procesados cumplan con los requisitos de la herramienta. El formato del archivo generado es el siguiente y el archivo .output de salida es el archivo gramatical preprocesado.
generación de declaraciones SQL
Después de generar un archivo de sintaxis que cumpla con las condiciones, puede usar la herramienta para generar SQL. La herramienta admite los siguientes parámetros:
•-b: especifica el archivo de sintaxis requerido. El archivo de sintaxis es el archivo generado después del procesamiento mediante el script preprocess.sh.
•-n: Especifica el nombre de la producción a generar, requerido
•-R: modo generado aleatoriamente, opcional, el valor predeterminado es el modo de enumeración
•-o: especifique el archivo guardado para generar declaraciones SQL, opcional, el valor predeterminado es report.csv
•-N: Limitar el número de sentencias SQL generadas, opcional, sin límite por defecto
0 2 implementación de herramientas
Esta herramienta contiene dos paquetes: yacc_parser y sql_generator, que son responsables de completar el análisis de tokens y la generación de SQL respectivamente.
Método de expresión de producción.
type SeqInfo struct {
Items []string
}
type Production struct {
Head string // 产生式头部
Alter []SeqInfo // 产生式 body
}
Análisis de tokens
La función Tokenize se utiliza para tokenizar los caracteres en el archivo de gramática leído, y cada llamada devolverá un Token. Esta función solo maneja delimitadores simples y comillas, y no implementa coincidencias regulares del analizador léxico estándar.
La función Parse llama a la función Tokenize y devuelve un token cada vez. Después de regresar, la función Parse ensambla una serie de tokens en producción según el estado actual y el tipo de token.
generación de SQL
Hay dos modos para la generación de SQL:
1. Recorra la lista de cuerpos de la producción especificada en Producción y enumere para generar declaraciones SQL;
2. Seleccione aleatoriamente la lista de cuerpos de la producción especificada en Producción y genere declaraciones SQL aleatoriamente.
1. Enumeración
La implementación de la enumeración es utilizar una lista vinculada para guardar el token que se resolverá cada vez que se toma un token del encabezado de la lista vinculada y se incrementa el número de apariciones del token, y luego en función de si el número. de apariciones del Token en el registro en cada subexpresión es mayor que las veces especificadas, filtra las subexpresiones que se pueden seguir deduciendo.
Por otro lado, se utilizan dos matrices para registrar el subíndice (elección) de la subexpresión actualmente tomada y el subíndice (máximo) de la subexpresión máxima actual a registrar, de modo que la siguiente expresión se pueda incrementar por elección.
Después del filtrado, seleccione la subexpresión correcta de la producción en la posición de elección e inserte todos sus tokens en el encabezado de la lista vinculada, y luego determine si el encabezado es literal o palabra clave. Si es así, saque el encabezado y colóquelo en el. Matriz SQL. Si no, continúe Recorriendo la lista enlazada.
Cuando el procesamiento llega al final de la producción actual (el método de juicio es elección> máximo), se intentará un "transporte" en este momento, es decir, se incrementa el último dígito de la matriz de posiciones registrada actualmente.
Por ejemplo: la matriz máxima es 1 2 1 3, la matriz de elección es 0 0 0 3, luego la matriz de elección después del acarreo es 0 0 1 0, lo que significa que se ha atravesado la última posición y ahora la penúltima posición debe incrementarse, y la última posición es Cero, continúe leyendo la siguiente permutación y combinación.
El proceso de generación se implementa mediante recursividad. Por ejemplo, para la siguiente producción, la lógica de procesamiento se muestra en la figura:
show_tables_stmt: MOSTRAR TABLAS DESDE el nombre '.' nombre con_comentario |
De acuerdo con el valor de elección registrado, seleccione la subexpresión de elección de la producción hasta que se genere un SQL. Luego lleve la matriz de elección y continúe con la siguiente ronda de selección.
2. Aleatorio
El modo de generación aleatoria es similar al modo de generación de enumeración, excepto que no atraviesa secuencialmente cada Token en la lista del cuerpo de producción, sino que selecciona aleatoriamente un Token como parte del SQL.
Decidí renunciar al software industrial de código abierto. Eventos importantes: se lanzó OGG 1.0, Huawei contribuyó con todo el código fuente y se lanzó oficialmente Ubuntu 24.04. El equipo de la Fundación Google Python fue despedido por la "montaña de código de mierda" . ". Se lanzó oficialmente Fedora Linux 40. Una conocida compañía de juegos lanzó Nuevas regulaciones: los obsequios de boda de los empleados no deben exceder los 100.000 yuanes. China Unicom lanza la primera versión china Llama3 8B del mundo del modelo de código abierto. Pinduoduo es sentenciado a compensar 5 millones de yuanes por competencia desleal. Método de entrada en la nube nacional: solo Huawei no tiene problemas de seguridad para cargar datos en la nube.