SQLFTW
MySQL (на данный момент) Lexer, Parser, Language Model и статический анализатор, написанный на PHP
Это проверка анализатора, который создает объект, реализующий интерфейс команд SQLFTW SQL для каждого из приблизительно 140 поддерживаемых команд SQL. Команды выполняют моделирование синтаксического аспекта кода SQL, а не доменного аспекта (модели точно, как написаны вопросы), однако не отслеживает белое пространство и в настоящее время игнорирует некоторые комментарии
Этот анализатор предназначен как основа для двух других проектов:
- Один из них проводит статический анализ кода SQL, особенно безопасность и производительность миграций (в настоящее время используется очень базовый анализатор SQL из проекта PhpMyAdmin)
- Другой, надеюсь, поможет Phpstan (инструмент статического анализа для PHP) лучше понять запросы SQL и их результаты
Самостоятельно его можно использовать для проверки синтаксиса кода SQL (например, миграции)
Поддержка синтаксиса SQL:
Поддерживает все команды SQL от MySQL 5.x до MySQL 8.0.34 и почти все языковые функции
Не поддерживаемые функции, которые не будут проанализировать:
- Поддержка ASCI-Inclaintable Multibyte Encodings, таких как
shift-jis , gb18030 или utf-16 (не удается проанализировать) - Цитируемые делиминации (не реализованы, вероятно, потерпит неудачу)
- Неявная строковая конкатенация имен двойного цитирования в режиме ANSI (
"foo" "bar" ; это поддерживается на строках, но не на именах)
принято, но игнорируемые функции (без модели и сериализации):
- Решение приоритета оператора в выражениях (теперь операторы того же уровня просто проанализированы слева направо; будут реализованы позже)
- Регулярные комментарии внутри операторов (комментарии перед выпуском заявления)
- Функции плагина с тепловой волной (вторичная_ингин)
-
SELECT ... PROCEDURE ANALYSE (...) - удален в MySQL 8 -
WEIGHT_STRING(... LEVEL ...) - удален в MySQL 8
функции реализованы иначе, чем MySQL:
- Стоипсер произносит ошибку на неверно -концертных комментариях, так же, как и PostgreSQL (MySQL молчит, и, согласно тестам, это может быть ошибка)
- Счастчик создает ошибку при чтении пользовательских переменных с неверным именем (MySQL молча игнорирует их и возвращает NULL)
- Счастчик создает ошибку на подсказке оптимизатора с неверным синтаксисом (MySQL создает предупреждение, AWS Aurora MySQL ошибка)
Архитектура:
Основные слои:
- Lexer - Tokenices SQL, возвращает генератор токенов синхронизации
- Стоипсер (ы) - проверяет синтаксис и возвращает генератор объектов командных анализов
- Команда (ы) - команды SQL, проанализированные от открытого текста к неизменному представлению объекта. может быть сериализован обратно на открытый текст
- Платформа - списки функций, поддерживаемых конкретной платформой
- Форматер - настраиваемые операторы SQL Serializer
- Анализатор - Статические правила и инструменты для них
Основное использование:
<?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();
...
}
...
}
Текущее состояние развития:
Где мы сейчас:
- ☑ ~ 99,9% MySQL языковые функции реализованы
- ☑ Основные модульные тесты с сериализацией
- ☑ Протестировано на несколько тысяч таблиц и миграций
- ☑ Барсирует почти все из набора тестов MySQL (нет ложных негативов)
- ☑ Сбой практически на всех тестах ошибок из Test Suite MySQL (нет ложных срабатываний)
- ☑ Тестирование сериализации в наборе тестов MySQL (все функции SQL представлены, как и ожидалось)
- ☐ Параллелизированные и автоматизированные тесты против нескольких версий MySQL Test Suite
- ☐ Тестирование на мутации (обработка мутированного SQL, так же, как реальное DB; расширение диапазона за пределами MySQL Test Suite)
- ☐ Различительные версии платформы (анализ для точной паттерной версии сервера DB)
- ☐ Портирование моих инструментов статического анализа миграции в эту библиотеку
- ☐ Выпуск первой стабильной версии?
- ☐ Другие платформы (MariaDB, SQLite, PostgreSQL ...)
Версия:
Мы все любим семантическую версию, не так ли? :]
Но эта библиотека является огромным мероприятием и все еще проходит быструю начальную стадию разработки. Я решил пометить и выпустить версии даже на этом этапе, потому что я думаю, что это лучше, чем ничего и лучше, чем выпуск десятков альфа -версий. Так что не ожидайте никакой обратной совместимости, пока мы не оставим «0,1» . Проектирование огромной системы с первой попытки невозможно, много концепций должно урегулировать и нажимать на ее место, и поэтому много изменений все еще наступает
При использовании композитора всегда блокируйте свою зависимость от этого пакета до точной версии. Например, sqlftw/sqlftw:0.1.14
Автор:
Vlasta neubauer, @paranoiq, https://github.com/paranoiq