Sqlftw
MySQL (por enquanto) Lexer, analisador, modelo de idioma e analisador estático escrito em PHP
É um analisador validador que produz um objeto que implementa a interface de comando SQLFTW SQL para cada um dos aproximadamente 140 comandos SQL suportados. Os comandos modelam o aspecto sintático do código SQL, não o aspecto do domínio (modelos exatamente como as consultas são escritas), no entanto, não rastreia o espaço em branco e atualmente ignora alguns comentários
Este analisador pretende -se como base para outros dois projetos:
- Um está fazendo uma análise estática do código SQL, especialmente a segurança e o desempenho das migrações (atualmente usando o analisador SQL muito básico do projeto Phpmyadmin)
- Esperamos que outro ajudará o Phpstan (ferramenta de análise estática para PHP) a entender melhor as consultas SQL e seus resultados
por si só, pode ser usado para validar a sintaxe do código SQL (por exemplo, migrações)
Suporte de sintaxe SQL:
Suporta todos os comandos SQL do MySQL 5.x para o MySQL 8.0.34 e quase todos os recursos do idioma
Recursos não suportados, que não conseguem analisar:
- Suporte
gb18030 utf-16 multibytes shift-jis ASCII - Delimitadores citados (não implementados, provavelmente falharão)
- Concatenação implícita de string de nomes com calotas duplas no modo ANSI (
"foo" "bar" ; isso é suportado em strings, mas não em nomes)
Recursos aceitos, mas ignorados (sem modelo e serialização):
- Resolução da precedência do operador em expressões (por enquanto, os operadores da mesma camada são analisados da esquerda para a direita; será implementada mais tarde)
- Comentários regulares Inside Declarações (comentários antes da declaração são coletados)
- Recursos de plug -in de onda de calor (secundário_engine)
-
SELECT ... PROCEDURE ANALYSE (...) - Removido no MySQL 8 -
WEIGHT_STRING(... LEVEL ...) - removido em mysql 8
Recursos implementados de outra maneira que não o MySQL:
- O Parser produz um erro nos comentários sem terminação, o mesmo que o PostgreSQL (MySQL é silencioso e, de acordo com os testes, isso pode ser um bug)
- O Parser produz um erro ao ler variáveis do usuário com nome inválido (MySQL silenciosamente as ignora e retorna nulo)
- Parser produz um erro no otimizador DINT com sintaxe inválida (MySQL produz um aviso, aws aurora mysql um erro)
Arquitetura:
Camadas principais:
- Lexer - Tokeniza SQL, retorna um gerador de tokens de pastor
- Analisador (s) - valida a sintaxe e retorna um gerador de objetos de comando analisado
- Comando (s) - comandos SQL analisados de texto simples para representação de objetos imutáveis. pode ser serializado de volta ao texto simples
- Plataforma - Listas de recursos suportados por plataforma específica
- Formatter - Setializer SQL Configurável
- Analisador - regras de análise estática e instrumentação para eles
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 atual de desenvolvimento:
onde estamos agora:
- ☑ ~ 99,9% Recursos de linguagem MySQL implementados
- ☑ Testes básicos de unidade com serialização
- ☑ testado contra vários milhares de mesas e migrações
- ☑ Paresia quase tudo, desde o MySQL Test Suite (sem falsos negativos)
- ☑ Falha em quase todos os testes de erro do MySQL Test Suite (sem falsos positivos)
- ☑ Teste de serialização no MySQL Test Suite (todos os recursos SQL representados como esperado)
- ☐ Testes paralelos e automatizados em várias versões do MySQL Test Suite
- ☐ Testes de mutação (manuseio SQL mutado igual a um banco de dados real; estendendo a faixa além do MySQL Test Suite)
- ☐ Versões de plataforma de distinção (analisando a versão exata de patch do servidor DB)
- ☐ Portando minhas ferramentas de análise estática de migração para esta biblioteca
- ☐ Lançamento da primeira versão estável?
- ☐ Outras plataformas (mariadb, sqlite, postgreSql ...)
Versão:
Todos nós amamos versões semânticas, não é? :]
Mas, essa biblioteca é um empreendimento enorme e ainda está passando por um rápido estágio de desenvolvimento inicial. Decidi marcar e lançar versões mesmo nesta fase, porque acho que é melhor do que nada e melhor do que lançar dezenas de versões alfa. Portanto, não espere compatibilidade com versões anteriores até deixarmos "0,1" . Projetar um sistema enorme em uma primeira tentativa é impossível, muitos conceitos devem se estabelecer e clicar em seu lugar e, portanto, muitas mudanças ainda estão chegando
Ao usar o Composer, sempre bloqueie sua dependência deste pacote em uma versão exata. Por exemplo, sqlftw/sqlftw:0.1.14
Autor:
Vlasta Neubauer, @paranoiq, https://github.com/paranoiq