Sqlftw
MySQL (por ahora) Lexer, analizador, modelo de idioma y analizador estático escrito en PHP
Es un analizador de validación que produce un objeto que implementa la interfaz SQLFTW SQL Command para cada uno de los comandos SQL compatibles con aproximadamente 140. Los comandos modelan el aspecto sintáctico del código SQL, no el aspecto del dominio (modelos exactamente cómo se escriben las consultas), sin embargo, no rastrea el espacio en blanco y actualmente ignora algunos comentarios
Este analizador está destinado a ser una base para otros dos proyectos:
- Uno está haciendo un análisis estático del código SQL, especialmente la seguridad y el rendimiento de las migraciones (actualmente utilizando un analizador SQL muy básico del proyecto PhPMyadmin)
- Otro, con suerte, ayudará a PHPSTAN (herramienta de análisis estático para PHP) a comprender mejor las consultas SQL y sus resultados
por sí solo se puede usar para validar la sintaxis del código SQL (por ejemplo, migraciones)
Soporte de sintaxis SQL:
Admite todos los comandos SQL desde MySQL 5.x a MySQL 8.0.34 y casi todas las características del idioma
No se admiten características, que no pueden analizar:
- Soporte para codificaciones multibites incompatibles ascii como
shift-jis , gb18030 o utf-16 (no puede analizar) - delimitadores citados (no implementados, probablemente fallarán)
- Concatenación de cadena implícita de nombres de doble cotización en modo ANSI (
"foo" "bar" ; esto se admite en cadenas, pero no en los nombres)
características aceptadas pero ignoradas (sin modelo y serialización):
- Resolución de la precedencia del operador en expresiones (por ahora los operadores del mismo nivel se analizan de izquierda a derecha; se implementará más adelante)
- Comentarios regulares dentro de las declaraciones (los comentarios antes de la declaración se recopilan)
- Características del complemento Heatwave (Secundary_Engine)
-
SELECT ... PROCEDURE ANALYSE (...) - eliminado en MySQL 8 -
WEIGHT_STRING(... LEVEL ...) - eliminado en mysql 8
Características implementadas de otra manera que MySQL:
- Parser produce un error en los comentarios no terminados al igual que PostgreSQL (MySQL está en silencio y, según las pruebas, esto podría ser un error)
- El analizador produce un error al leer variables de usuario con un nombre no válido (MySQL las ignora y devuelve nulo)
- Parser produce un error en Optimizer Sugerencia con sintaxis no válida (MySQL produce una advertencia, AWS Aurora MySQL un error)
Arquitectura:
Capas principales:
- Lexer - Tokeniza SQL, devuelve un generador de tokens de analizador
- Parser (s): valida la sintaxis y devuelve un generador de objetos de comando analizados
- Comando (s): comandos SQL analizados desde texto sin formato a representación de objetos inmutables. puede ser serializado de nuevo en texto sin formato
- Plataforma: listas de características compatibles con una plataforma particular
- Formatero - Serializador de declaraciones SQL configurable
- Analizador - Reglas e instrumentación de análisis estático para ellos
Uso básico:
<?php
use ...
$platform = Platform::get(Platform::MYSQL, '8.0'); // version defaults to x.x.99 when no patch number is given
$config = new ParserConfig($platform);
$session = new Session($platform);
$parser = new Parser($config, $session);
// returns a Generator. will not parse anything if you don't iterate over it
$commands = $parser->parse('SELECT foo FROM ...');
foreach ($commands as $command) {
// Parser does not throw exceptions. this allows to parse partially invalid code and not fail on first error
if ($command instanceof InvalidCommand) {
$e = $command->getException();
...
}
...
}
Estado actual del desarrollo:
donde estamos ahora:
- ☑ ~ 99.9% Características del lenguaje MySQL implementadas
- ☑ Pruebas unitarias básicas con serialización
- ☑ Probado contra varios miles de tablas y migraciones
- ☑ analiza casi todo, desde MySQL Test Suite (sin falsos negativos)
- ☑ falla en casi todas las pruebas de error de MySQL Test Suite (sin falsos positivos)
- ☑ Pruebas de serialización en MySQL Test Suite (todas las características de SQL representadas como se esperaba)
- ☐ Pruebas paralelizadas y automatizadas contra múltiples versiones de MySQL Test Suite
- ☐ Prueba de mutación (manejo de SQL mutado igual que un DB real; extender el rango más allá del suite de prueba MySQL)
- ☐ Distinguir las versiones de la plataforma (analización para la versión de parche exacta del servidor DB)
- ☐ Portando mis herramientas de análisis estático de migración a esta biblioteca
- ☐ Lanzamiento de la primera versión estable?
- ☐ Otras plataformas (MariadB, SQLite, PostgreSQL ...)
Versión:
Todos amamos la versión semántica, ¿no? :]
Pero, esta biblioteca es una gran empresa y todavía está pasando por una rápida etapa de desarrollo inicial. He decidido etiquetar y lanzar versiones incluso en esta etapa, porque creo que es mejor que nada y mejor que liberar docenas de versiones alfa. Por lo tanto , no espere ninguna compatibilidad con versiones anteriores hasta que dejemos "0.1" . Diseñar un sistema enorme en un primer intento es imposible, muchos conceptos deben asentarse y hacer clic en su lugar y, por lo tanto.
Cuando use compositor, siempre bloquee su dependencia en este paquete a una versión exacta. por ejemplo, sqlftw/sqlftw:0.1.14
Autor:
Vlasta Neubauer, @paranoiq, https://github.com/paranoiq