MySQL (현재) Lexer, 파서, 언어 모델 및 PHP로 작성된 정적 분석기
약 140 개의 지원되는 SQL 명령 각각에 대해 SQLFTW SQL 명령 인터페이스를 구현하는 객체를 생성하는 유효성있는 파서입니다. 명령은 도메인 측면이 아닌 SQL 코드의 구문 측면을 모델링합니다 (정확히 쿼리가 작성되는 방법) 그러나 공백을 추적하지는 않으며 현재 일부 주석을 무시합니다.
이 파서는 다른 두 프로젝트의 기초로 의도됩니다.
자체적으로 SQL 코드의 구문을 검증하는 데 사용될 수 있습니다 (예 : 마이그레이션).
MySQL 5.X에서 MySQL 8.0.34까지 모든 SQL 명령을 지원하고 거의 모든 언어 기능을 지원합니다.
지원되는 기능이 없으면 구문 분석에 실패합니다.
shift-jis , gb18030 또는 utf-16 과 같은 Ascii-Incatible Multibyte 인코딩 지원 (구문 분석 실패)"foo" "bar" ; 이것은 문자열에서는 지원되지만 이름은 아닙니다)허용되지만 무시 된 기능 (모델 및 직렬화 없음) :
SELECT ... PROCEDURE ANALYSE (...) - MySQL 8에서 제거WEIGHT_STRING(... LEVEL ...) - MySQL 8에서 제거되었습니다MySQL 이외의 다른 방법으로 구현 된 기능 :
메인 레이어 :
<?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();
...
}
...
}
우리가 지금있는 곳 :
우리는 모두 시맨틱 버전을 좋아합니다. :]
그러나이 도서관은 큰 사업이며 여전히 빠른 초기 개발 단계를 거치고 있습니다. 나는이 단계에서도 버전을 태그하고 릴리스하기로 결정했습니다. 왜냐하면 수십 개의 알파 버전을 출시하는 것보다 아무것도 낫고 낫다고 생각하기 때문입니다. 따라서 "0.1"을 떠날 때까지 거꾸로 호환성을 기대하지 마십시오 . 첫 번째 시도로 거대한 시스템을 설계하는 것은 불가능합니다.
Composer를 사용할 때는 항상이 패키지의 종속성을 정확한 버전으로 고정하십시오. 예 : sqlftw/sqlftw:0.1.14
Vlasta Neubauer, @paranoiq, https://github.com/paranoiq