Sqlftw
MySQL (pour l'instant) Lexer, l'analyseur, le modèle de langue et l'analyseur statique écrit en php
Il s'agit d'un analyseur de validation qui produit un objet implémentant l'interface de commande SQLFTW SQL pour chacune des environ 140 commandes SQL prises en charge. Les commandes modélisent l'aspect syntaxique du code SQL, et non l'aspect du domaine (les modèles exactement comment les requêtes sont écrites), mais ne suit pas l'espace blanc et ignore actuellement certains commentaires
Cet analyseur est destiné à la base de deux autres projets:
- L'une consiste à analyser une analyse statique du code SQL, en particulier la sécurité et les performances des migrations (en utilisant actuellement un analyseur SQL très basique du projet PhpMyAdmin)
- Un autre, nous espérons que le phpstan (outil d'analyse statique pour PHP) comprendra mieux les requêtes SQL et leurs résultats
Il peut être utilisé pour valider la syntaxe du code SQL (par exemple, les migrations)
Prise en charge de la syntaxe SQL:
Prend en charge toutes les commandes SQL de MySQL 5.x à MySQL 8.0.34 et presque toutes les fonctionnalités linguistiques
Les fonctionnalités non prises en charge ne parviendront pas à analyser:
- Prise en charge des encodages multi-monte incompatibles ASCII comme
shift-jis , gb18030 ou utf-16 (échoue à analyser) - les délimiteurs cités (non implémentés, probablement échoueront)
- Concaténation de chaîne implicite des noms à double cité en mode ANSI (
"foo" "bar" ; Ceci est pris en charge sur les chaînes, mais pas sur les noms)
Caractéristiques acceptées, mais ignorées (pas de modèle et sérialisation):
- Résolution de la priorité des opérateurs dans les expressions (pour l'instant les opérateurs du même niveau sont juste analysés de gauche à droite; seront mis en œuvre plus tard)
- Commentaires réguliers à l'intérieur des déclarations (commentaires avant la déclaration sont collectés)
- Caractéristiques du plugin Heatwave (Secondary_Engine)
-
SELECT ... PROCEDURE ANALYSE (...) - Supprimé dans MySQL 8 -
WEIGHT_STRING(... LEVEL ...) - supprimé dans mysql 8
fonctionnalités implémentées d'une autre manière que MySQL:
- Parser produit une erreur sur les commentaires non terminés comme PostgreSQL (MySQL est silencieux et selon les tests, cela pourrait être un bug)
- Parser produit une erreur lors de la lecture des variables utilisateur avec un nom non valide (MySQL les ignore et renvoie Null)
- Parser produit une erreur sur l'optimiseur avec une syntaxe non valide (MySQL produit un avertissement, AWS Aurora mysql une erreur)
Architecture:
Couches principales:
- Lexer - Tokenize SQL, renvoie un générateur de jetons d'analyse
- Analyseur (s) - valide la syntaxe et renvoie un générateur d'objets de commande analysés
- Commande (S) - Commandes SQL analysées du texte en clair à la représentation d'objets immuables. peut être sérialisé en texte en clair
- Plateforme - listes de fonctionnalités prises en charge par une plate-forme particulière
- Formateur - sérialiseur de relevés SQL configurable
- Analyseur - Règles et instrumentation d'analyse statique pour eux
Utilisation de base:
<?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();
...
}
...
}
État de développement actuel:
où nous en sommes maintenant:
- ☑ ~ 99,9% des fonctionnalités de langue MySQL implémentées
- ☑ Tests unitaires de base avec sérialisation
- ☑ testé contre plusieurs milliers de tables et migrations
- ☑ Parses presque tout de la suite de tests MySQL (pas de faux négatifs)
- ☑ échoue sur presque tous les tests d'erreur de la suite de tests MySQL (pas de faux positifs)
- ☑ Test de sérialisation sur la suite de tests MySQL (toutes les fonctionnalités SQL représentées comme prévu)
- ☐ Tests parallélisés et automatisés par rapport à plusieurs versions de la suite de tests MySQL
- ☐ Test de mutation (manipulation de SQL muté comme une DB réelle; Extension de la plage au-delà de la suite de tests MySQL)
- ☐ Distinguer les versions de plate-forme (analyse pour la version correcte du patch du serveur DB)
- ☐ Portage de mes outils d'analyse statique de migration vers cette bibliothèque
- ☐ Version de la première version stable?
- ☐ Autres plates-formes (MariaDB, SQLite, PostgreSQL ...)
Versioning:
Nous aimons tous le versioning sémantique, n'est-ce pas? :]
Mais, cette bibliothèque est une entreprise énorme et passe toujours par une phase de développement initiale rapide. J'ai décidé d'étiqueter et de publier des versions même à ce stade, car je pense que c'est mieux que rien et mieux que de publier des dizaines de versions alpha. Ne vous attendez donc pas à une compatibilité en arrière avant de quitter "0,1" . Concevoir un énorme système lors d'un premier essai est impossible, de nombreux concepts doivent se régler et cliquer à sa place et donc de nombreux changements arrivent encore
Lorsque vous utilisez Composer, verrouillez toujours votre dépendance à ce package dans une version exacte. par exemple sqlftw/sqlftw:0.1.14
Auteur:
Vlasta Neubauer, @paranoiq, https://github.com/paranoiq