Sqlftw
Mysql (untuk saat ini) lexer, parser, model bahasa dan penganalisa statis ditulis dalam php
Ini adalah parser yang memvalidasi yang menghasilkan objek yang menerapkan antarmuka perintah SQLFTW SQL untuk masing -masing sekitar 140 perintah SQL yang didukung. Perintah melakukan model aspek sintaksis kode SQL, bukan aspek domain (model persis bagaimana pertanyaan ditulis), namun tidak melacak ruang putih dan saat ini mengabaikan beberapa komentar
Parser ini dimaksudkan sebagai dasar untuk dua proyek lain:
- Seseorang melakukan analisis statis kode SQL, terutama keamanan dan kinerja migrasi (saat ini menggunakan parser SQL yang sangat dasar dari proyek phpMyadmin)
- Lainnya diharapkan akan membantu phpstan (alat analisis statis untuk php) lebih memahami kueri SQL dan hasilnya
Dengan sendirinya dapat digunakan untuk memvalidasi sintaksis kode SQL (misalnya migrasi)
Dukungan Sintaks SQL:
Mendukung semua perintah SQL dari MySQL 5.x ke MySQL 8.0.34 dan hampir semua fitur bahasa
Tidak didukung fitur, itu akan gagal untuk menguraikan:
- Dukungan untuk pengkodean multibit yang tidak kompatibel seperti ASCII seperti
shift-jis , gb18030 atau utf-16 (gagal diurai) - Pembatas yang dikutip (tidak diimplementasikan, mungkin akan gagal)
- Penggabungan string implisit dari nama yang dikutip ganda dalam mode ANSI (
"foo" "bar" ; ini didukung pada string, tetapi tidak pada nama)
Diterima, tetapi fitur yang diabaikan (tidak ada model dan serialisasi):
- Menyelesaikan prioritas operator dalam ekspresi (untuk saat ini operator dari tingkat yang sama hanya diuraikan dari kiri ke kanan; akan diimplementasikan nanti)
- Komentar reguler di dalam pernyataan (komentar sebelum pernyataan dikumpulkan)
- Fitur Plugin Heatwave (Secondary_Engine)
-
SELECT ... PROCEDURE ANALYSE (...) - Dihapus di MySQL 8 -
WEIGHT_STRING(... LEVEL ...) - Dihapus di MySQL 8
Fitur yang diimplementasikan dengan cara lain selain MySQL:
- Parser menghasilkan kesalahan pada komentar tanpa akhir yang sama seperti PostgreSQL (MySQL diam dan menurut tes, ini mungkin bug)
- Parser menghasilkan kesalahan saat membaca variabel pengguna dengan nama yang tidak valid (MySQL diam -diam mengabaikannya dan mengembalikan nol)
- Parser menghasilkan kesalahan pada petunjuk pengoptimal dengan sintaks yang tidak valid (MySQL menghasilkan peringatan, AWS Aurora MySQL kesalahan)
Arsitektur:
Lapisan utama:
- Lexer - tokenizes SQL, mengembalikan generator token parser
- Parser - memvalidasi sintaks dan mengembalikan generator objek perintah yang diuraikan
- Perintah - Perintah SQL diuraikan dari plaintext ke representasi objek yang tidak dapat diubah. dapat diserialisasi kembali ke plainxext
- Platform - Daftar fitur yang didukung oleh platform tertentu
- Formatter - Serializer Pernyataan SQL yang Dapat Dikonfigurasi
- Analisis - Aturan analisis statis dan instrumentasi untuk mereka
Penggunaan Dasar:
<?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();
...
}
...
}
Keadaan Pembangunan Saat Ini:
dimana kita sekarang:
- ☑ ~ 99,9% Fitur Bahasa MySQL Diimplementasikan
- ☑ Uji unit dasar dengan serialisasi
- ☑ Diuji terhadap beberapa ribu tabel dan migrasi
- ☑ Parses Hampir semuanya dari mysql test suite (tidak ada negatif palsu)
- ☑ gagal pada hampir semua tes kesalahan dari suite tes MySQL (tidak ada positif palsu)
- ☑ Pengujian Serialisasi pada MySQL Test Suite (semua fitur SQL diwakili seperti yang diharapkan)
- ☐ Tes Paralelisasi dan Otomatis terhadap beberapa versi MySQL Test Suite
- ☐ Pengujian mutasi (menangani SQL bermutasi sama dengan DB nyata; memperluas jangkauan di luar suite uji MySQL)
- ☐ Versi platform yang membedakan (parsing untuk versi tambalan yang tepat dari server DB)
- ☐ porting alat analisis statis migrasi saya ke perpustakaan ini
- ☐ Rilis versi stabil pertama?
- ☐ Platform lain (Mariadb, Sqlite, PostgreSQL ...)
Versi:
Kita semua menyukai versi semantik, bukan? :]
Tapi, perpustakaan ini adalah usaha besar dan masih melalui tahap pengembangan awal yang cepat. Saya telah memutuskan untuk menandai dan merilis versi bahkan pada tahap ini, karena saya pikir itu lebih baik daripada tidak sama sekali dan lebih baik daripada melepaskan lusinan versi alpha. Jadi jangan berharap kompatibilitas mundur sampai kita meninggalkan "0,1" . Merancang sistem besar pada percobaan pertama tidak mungkin, banyak konsep harus menyelesaikan dan mengklik ke tempatnya dan oleh karena itu banyak perubahan masih datang
Saat menggunakan komposer, selalu kunci ketergantungan Anda pada paket ini ke versi yang tepat. misalnya sqlftw/sqlftw:0.1.14
Pengarang:
VLASTA Neubauer, @paranoiq, https://github.com/paranoiq