왜 괜찮은 sql 파서가 없습니까?
저는 현재 오라클 sql 분석을 하고 있는데 여러 sql paraser에서 제대로 구문 분석할 수 없는 유효한 sql 문을 자주 접합니다.구문 분석에 실패하거나 생성된 추상 구문 트리가 어떻게든 엉망이 됩니다.Oracle sql을 실제로 처리할 수 있는 유일한 파서는 공개적으로 사용할 수 없고 독립 실행형 파서로 얻을 수 없는 자체 파서인 것 같습니다.
다른 sql 문법이 있고 모든 것을 준수할 수 없다는 것을 알고 있습니다.그러나 Oracle SQL 파서라고 주장하는 파서도 모든 경우에 성공하는 것은 아닙니다.
일반적으로 sql paraser를 구현하는 것을 어렵게 만드는 주요 이유가 무엇이라고 생각하십니까, 아니면 특히 oracle sql paraser를 구현하는 것을 어렵게 합니까?
베스트, 윌
좋은 파서는 쓰기 어렵습니다.파서 코드에 대한 코드 생성기(일반적으로 일부 (E)B를 먹음)로 시작합니다.고유한 한계가 있는 NF와 유사한 구문).
파서의 오류 처리는 그 자체로 연구 주제입니다.이것은 오류를 감지하는 것뿐만 아니라 무엇이 잘못될 수 있는지 그리고 어떻게 해결해야 하는지에 대한 유용한 정보를 제공하는 것입니다.일부 구문 분석기는 위치 정보를 제공하지도 않습니다("오류가 줄/열에서 발생했습니다").
다음으로 "표준 쿼리 언어"가 아닌 "구조화된 쿼리 언어"를 의미하는 SQL이 있습니다.SQL 표준은 몇 개라도 있지만, 그 중 하나도 구현하는 데이터베이스는 하나도 찾을 수 없습니다.
Oracle은 마지못해 VARCHAR를 제공하지만 VARCHAR2를 사용하는 것이 좋습니다.일부 데이터베이스는 재귀적/트리와 같은 쿼리를 제공합니다.그들 모두는 이것에 대해 그들만의 특별한 구문을 사용합니다.정의되어 다(join
,left join
, ...) 하지만 사용할 수 있다면 왜 신경을 쓰십니까?+
?
여기에 데이터베이스 버전마다 새로운 기능이 문법에 추가됩니다.
따라서 표준 사례를 읽을 수 있는 파서를 작성할 수는 있지만, 전 세계의 모든 데이터베이스가 제공하는 모든 기능을 지원할 수 있는 파서를 작성하는 것은 거의 불가능합니다.이 파서에서 마주칠 수 있는 버그에 대해서도 얘기하고 있지 않습니다.
한 가지 해결책은 모든 데이터베이스 공급업체가 문법 파일을 게시하는 것입니다.하지만 이것들은 왕관 보석(IP)입니다.따라서 파싱된 문자당 라이센스료를 지불하지 않고도 사용할 수 있다는 점에 만족해야 합니다. * CPU 수.
제조업체가 X 언어를 지원한다고 주장할 때, 그는 "X 표준과 비슷한 것"을 의미하지만 표준은 아닙니다.역사적인 이유로 제조업체들은 표준이 표준이 되기 전에 언어 X를 구현하기 때문에 잘못된 시작을 하게 됩니다. 버전을 표준과 일치시키려고 하면 대개 사용자 코드의 큰 기반이 깨지고, 사용자를 고정하기 위해 항상 자신의 제품을 추가하려고 합니다.
이것은 SQL, C, C++...에 해당됩니다.사람들이 표준에 맞추기 위해 정말 열심히 노력하는 언어는 아다뿐이고, 심지어 그것은 여러 방언으로 나옵니다.(브라우저가 허용하는 것을 보세요!)
따라서 기성품의 일반 SQL 파서가 PLSQL을 파싱할 것으로 기대할 수는 없습니다.정말로 PLSQL 파서가 있어야 합니다.그리고 이것들은 설명서가 빈약하기 때문에 작성하기가 어렵고, Oracle은 이를 고칠 이유가 없으며, 문법 작성자를 도울 동기도 분명히 없습니다.
저희 회사(Semantic Designs)는 10g을 꽤 잘 커버하는 PLSQL 파서를 보유하고 있습니다(Oracle의 문서는 빈약합니다...우리는 참조 문서에서 변형을 계속 발견하고 있습니다). 그리고 대부분의 11g을 합니다.수백만 개의 PLSQL 코드 라인에 걸쳐 실행했습니다.
그들이 잘못했다고요? :)..데이터베이스 엔진의 파서가 정상적으로 작동하기 때문에 이 작업을 수행할 수 있습니다;).아마 여러 가지 요인 때문일 겁니다.해당 구문이 제대로 기록되지 않았거나 해당 구문 분석기에 구현되지 않은 방언에 최근 변경이 있었을 수 있습니다.
메타데이터.
SELECT identifier_1.identifier_2 FROM table
의미할 수도 있습니다identifier_1
, 이며,identifier_2
함수 또는 함수의 동의어일 수 있습니다.
데이터베이스 개체에 대한 메타데이터가 없으면 문장이 정확하지만 이해할 수 없는 이유는 여러 가지가 있습니다.그런 한계를 감안하면 파서가 어디까지 갈 수 있을지는 한계가 있습니다.
파서가 코드의 80%를 해결할 수 있고 메타데이터 없이는 15%를 해결할 수 없는 경우, 누락된 "5%"에 대응하기 위해 파서를 확장하는 데 있어 수익이 감소합니다.
Oracle SQL 참조: http://docs.oracle.com/cd/B28359_01/server.111/b28286/toc.htm
모든 Oracle SQL 구문을 완벽하게 지원하는 SQL Parser를 만드는 것이 얼마나 어려운지 알게 될 것입니다. 거의 불가능합니다.
위에 나열된 문서에서도 Oracle SQL 파서를 만드는 데 사용할 수 있는 모든 구문을 정확하게 문서화하지 않았습니다.
모든 데이터베이스 버전에 대해 새 구문이 지속적으로 추가됩니다.
다양한 주요 데이터베이스의 가장 중요한 SQL 구문을 다루는 일반 SQL 파서와 같은 SQL 파서를 선택할 수 있다고 생각합니다.
언급URL : https://stackoverflow.com/questions/6014979/why-is-there-no-decent-sql-parser
'programing' 카테고리의 다른 글
mariadb 설치 문제 - ERROR 1524 (HY000):'caching_sha2_password' 플러그인이 로드되지 않았습니다. (0) | 2023.10.12 |
---|---|
워드프레스의 발췌문을 "더" 링크와 함께 사용하시겠습니까? (0) | 2023.10.12 |
여러 번의 패스를 통해 핵심 데이터 마이그레이션에 대한 예 또는 설명? (0) | 2023.10.12 |
메뉴가 여러 개일 때 li의 메뉴에 페이지 ID가 손실됨 (0) | 2023.10.07 |
최대 절전 모드 4 업그레이드 후 "찾았습니다: 비트, 예상: 부울" (0) | 2023.10.07 |