为什么没有像样的SQL解析器?

问题描述:

我目前正在做一些oracle sql分析,并经常遇到无法正确解析各种sql分析器的有效sql语句。要么他们解析它失败,要么他们的抽象语法树被搞乱了。看来,真正能够处理oracle sql的唯一解析器是他们自己的一个不公开的解析器,不能作为独立的解析器获得。为什么没有像样的SQL解析器?

我知道,有不同的SQL语法和遵守所有的可能是不可能的。 但即使是声称是Oracle SQL解析器的解析器在所有情况下都不会成功。

你认为什么是使它很难实现特别是在一般或的Oracle SQL分析器SQL解析器的主要原因是什么?

最佳, 请问

+0

通过“valid sql statement”,你的意思是ANSI SQL是否正确?如果是这样,不知道为什么(与标准定义)任何兼容的语法将无法被解析。由于Oracle的传统原因,Oracle特定的语法(+)仍然受支持,但新代码应该以ansi风格编写。在此之前,祝你好运;) – tbone 2011-05-16 12:16:35

+0

否与有效,我的意思是在一个特定的语法有效。 在我的情况下,我的Oracle SQL,我的解析器声称符合。 – Will 2011-05-18 15:32:47

好的解析器很难写。从解析器代码的代码生成器开始(它通常会使用一些(E)BNF类似的语法,但它有其自身的局限性)。

解析器中的错误处理是它自己的研究课题。这不仅是关于检测错误,而且还提供有用的信息可能是错误的以及如何解决它。一些解析器甚至不提供位置信息(“在线/列出现错误”)。

接下来,您将SQL表示为“结构化查询语言”,而不是“标准查询语言”。有一个SQL标准,甚至有几个,但是你不会找到一个实现它们的数据库。

甲骨文勉强提供VARCHAR但你最好使用VARCHAR2。一些数据库提供递归/树状查询。所有这些人都使用自己的特殊语法。标准中明确定义了连接(join,left join,...)但为什么要使用+

最重要的是,对于每一个数据库版本,新功能被添加到语法。

因此,尽管你可以写一个分析器,可以读取标准的情况下,写,可以支持所有功能,在全世界所有主要的数据库,几乎是不可能的分析器。而且我甚至都没有谈到你可以在这些解析器中遇到的错误。

如果所有数据库供应商都会发布语法文件,一种解决方案是。但是这些是皇冠上的珠宝(IP)。所以你应该很高兴你可以使用使用而不必为每个分析字符* CPU数量支付许可证费用。

他们这样做是错误的? :)...这显然可以做到,因为数据库引擎中的解析器可以正常工作;)...这可能是由于几个因素造成的。该方言可能没有很好的文档记录,或者最近在解析器中没有实现方言的改变。

当制造商声称支持语言X,他的意思是“有点像X标准”,而不是标准。由于历史原因,制造商在标准之前实施语言X作为标准,因此他们开始犯错;试图让他们的版本匹配该标准通常会打破他们庞大的用户代码基础;并且他们总是希望添加他们自己的好东西来锁定他们的用户。

对于SQL,C,C++,这是正确的...我所知道的唯一语言是人们尝试真的难以匹配的标准是阿达,甚至有多种方言。 (看看哪些浏览器接受!)。

所以你不能指望现成的通用SQL解析器来解析PLSQL。你真的必须有一个PLSQL解析器。由于文档很差,这些很难构建,Oracle没有理由修复它,当然也没有动力去帮助语法构建者。

我的公司(语义设计)有一个PLSQL parser,覆盖10g非常好(Oracle的文档很差...我们一直在查找参考文档的变体),并且大部分是11g。我们已经运行了数百万行的PLSQL代码。

元数据。

选择identifier_1.identifier_2 FROM表

可能意味着identifier_1是一个模式或包,identifier_2可能是一个函数或同义词的功能。

为什么一个声明可能是正确的,但没有关于数据库对象的元数据就无法理解,有一系列原因。鉴于这些限制,解析可以走多远是有限制的。

如果一个解析器可以解决80%的代码,并且15%不能在没有元数据的情况下解决,那么伸缩解析器以应对缺失的“5%”时会降低回报。

如果你看一看的Oracle SQL参考: http://docs.oracle.com/cd/B28359_01/server.111/b28286/toc.htm

你就会知道它是多么的困难创建SQL解析器,完全支持所有的Oracle SQL语法,这几乎是不可能的。

即使上面列出的文档没有记录可用于创建Oracle SQL解析器的所有语法。

对于每个数据库版本,都会不断添加新的语法。

我认为SQL解析器像general sql parser涵盖了各种主要数据库的最重要的SQL语法可能是一种选择。

+0

这可能很难,但是Oracle肯定已经创建了一个。 – 2014-04-29 08:31:27