Sqlftw
MySQL (vorerst) Lexer, Parser, Sprachmodell und statischer Analysator in PHP geschrieben
Es ist ein validierender Parser, der ein Objekt erzeugt, das die SQLFTW SQL Command -Schnittstelle für jede der ungefähr 140 unterstützten SQL -Befehle implementiert. Befehle modellieren den syntaktischen Aspekt des SQL -Codes, nicht den Domänenaspekt (Modelle genau, wie Abfragen geschrieben werden), verfolgt jedoch keinen weißen Raum und ignoriert derzeit einige Kommentare
Dieser Parser ist als Grundlage für zwei weitere Projekte gedacht:
- Man führt eine statische Analyse des SQL -Codes durch, insbesondere die Sicherheit und Leistung von Migrationen (derzeit verwendet SQL -Parser aus dem PHPMYADMIN -Projekt)
- Ein anderer wird Phpstan (statisches Analyse -Tool für PHP) hoffentlich besser verstehen, was die SQL -Abfragen und deren Ergebnisse besser verstehen
Es kann allein verwendet werden, um die Syntax des SQL -Code (z. B. Migrationen) zu validieren
Unterstützung der SQL -Syntax:
Unterstützt alle SQL -Befehle von MySQL 5.x bis MySQL 8.0.34 und fast allen Sprachfunktionen
Nicht unterstützte Funktionen, die nicht analysieren:
- Unterstützung für ascii-inkompatible Multibyte-Codierungen wie
shift-jis , gb18030 oder utf-16 (nicht analysiert) - Zitierte Grenzwerte (nicht implementiert, werden wahrscheinlich scheitern)
- Implizite String-Verkettung von doppelt zitierten Namen im ANSI-Modus (
"foo" "bar" ; dies wird auf Saiten unterstützt, aber nicht auf Namen)
Akzeptiert, aber ignorierte Merkmale (kein Modell und Serialisierung):
- Vorrang vor Angriffe in Ausdrücken (vorerst die Betreiber derselben Stufe werden nur von links nach rechts analysiert; wird später implementiert)
- Regelmäßige Kommentare in Aussagen (Kommentare vor der Erklärung werden gesammelt)
- Heatwave -Plugin -Funktionen (Secondary_Engine)
-
SELECT ... PROCEDURE ANALYSE (...) - in MySQL 8 entfernt -
WEIGHT_STRING(... LEVEL ...) - In MySQL 8 entfernt
Funktionen implementiert anders als MySQL:
- Parser erzeugt einen Fehler in nicht entleverten Kommentaren wie postgresql (MySQL ist still und nach Tests könnte dies ein Fehler sein)
- Parser erzeugt einen Fehler beim Lesen von Benutzervariablen mit ungültigem Namen (MySQL ignoriert sie still und gibt NULL zurück)
- Parser erzeugt einen Fehler bei Optimizer -Hinweis mit ungültiger Syntax (MySQL erzeugt eine Warnung, AWS Aurora MySQL Ein Fehler)
Architektur:
Hauptschichten:
- Lexer - Tokenizes SQL, gibt einen Generator von Parser -Token zurück
- Parser (s) - validiert die Syntax und gibt einen Generator von Parsen -Befehlsobjekten zurück
- Befehl (s) - SQL -Befehle, die von Klartext an unveränderliche Objektdarstellung analysiert werden. kann wieder in Klartext serialisiert werden
- Plattform - Listen der Funktionen, die von einer bestimmten Plattform unterstützt werden
- Formatierer - Konfigurierbare SQL -Anweisungen Serializer
- Analysator - Statische Analyseregeln und Instrumente für sie
Grundnutzung:
<?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();
...
}
...
}
Aktueller Entwicklungszustand:
wo wir jetzt sind:
- ☑ ~ 99,9% MySQL -Sprachfunktionen implementiert
- ☑ Basis -Unit -Tests mit Serialisierung
- ☑ getestet gegen mehrere tausend Tabellen und Migrationen
- ☑ Parsen fast alles von MySQL Test Suite (keine falschen Negative)
- ☑ fällt bei fast allen Fehlertests aus der MySQL -Testsuite (keine falsch positiven Aspekte).
- ☑ Serialisierungstests auf der MySQL -Testsuite (alle SQL -Funktionen wie erwartet dargestellt)
- ☐ Parallelisierte und automatisierte Tests gegen mehrere Versionen der MySQL Test Suite
- ☐ Mutationstest (Handling mutiertes SQL wie ein realer DB; Ausweitung des Bereichs über die MySQL -Testsuite hinaus)
- ☐ Unterscheidung von Plattformversionen (Parsen für die genaue Patch -Version des DB -Servers)
- ☐ Portierung meiner statischen Analyse -Tools meiner Migration in dieser Bibliothek
- ☐ Veröffentlichung der ersten stabilen Version?
- ☐ Andere Plattformen (Mariadb, SQLite, PostgreSQL ...)
Versioning:
Wir alle lieben semantische Versioning, nicht wahr? :]
Diese Bibliothek ist jedoch ein großes Unterfangen und durchläuft immer noch eine schnelle anfängliche Entwicklungsphase. Ich habe beschlossen, auch in dieser Phase Versionen zu markieren und zu veröffentlichen, weil ich denke, dass es besser als nichts und besser ist, als Dutzende von Alpha -Versionen zu veröffentlichen. Erwarten Sie also keine Rückwärtskompatibilität, bis wir "0,1" verlassen . Das Entwerfen eines riesigen Systems beim ersten Versuch ist unmöglich, viele Konzepte müssen sich niederlassen und an seinen Platz klicken, und daher kommen noch viele Änderungen
Wenn Sie Komponist verwenden, sperren Sie Ihre Abhängigkeit von diesem Paket immer auf eine genaue Version. zB sqlftw/sqlftw:0.1.14
Autor:
Vlasta Neubauer, @paranoiq, https://github.com/paranoiq