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

时间:2011-05-16 08:50:28

标签: sql oracle parsing

我正在进行一些oracle sql分析,并经常遇到无法通过各种sql解析器正确解析的有效sql语句。他们无法解析它,或者他们生成的抽象语法树以某种方式搞砸了。似乎唯一可以真正处理oracle sql的解析器是他们自己的解析器,它不是公开的,不能作为独立的解析器获得。

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

您认为导致一般的sql解析器或特别是oracle sql解析器难以实现的主要原因是什么?

最佳, 将

5 个答案:

答案 0 :(得分:7)

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

解析器中的错误处理是它自己的研究课题。这不仅涉及检测错误,还提供有用信息可能是错误的以及如何解决错误。有些解析器甚至不提供位置信息(“行/列发生错误”)。

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

Oracle勉强提供VARCHAR,但您最好使用VARCHAR2。一些数据库提供递归/树状查询。所有这些都使用他们自己的特殊语法。加入在标准中明确定义(joinleft join,...),但为什么要使用+呢?

最重要的是,对于每个数据库版本,都会在语法中添加新功能。

因此,虽然您可以编写可以读取标准案例的解析器,但编写一个可以支持全球所有数据库提供的所有功能的解析器几乎是不可能的。我甚至没有谈论你在这些解析器中遇到的错误。

一种解决方案是所有数据库供应商都会发布语法文件。但这些都是皇冠上的珠宝(IP)。因此,您应该感到高兴,您可以使用,而无需为每个解析的字符* CPU数量支付许可费。

答案 1 :(得分:3)

当制造商声称支持X语言时,他的意思是“类似于X标准”但不是标准。制造商出于历史原因在标准 之前实施语言X作为标准,因此他们开始走错了路;试图使他们的版本匹配标准通常打破他们庞大的用户代码基础;他们总是希望添加自己的好东西来锁定他们的用户。

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

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

我的公司(语义设计)有一个PLSQL parser很好地覆盖了10g(Oracle的文档很差......我们不断发现参考文献的变化)并且大部分都是11g。我们已经在数百万行PLSQL代码中运行它。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

元数据。

SELECT identifier_1.identifier_2 FROM table

可能意味着identifier_1是架构或包,而identifier_2可能是函数的函数或同义词。

如果没有关于数据库对象的元数据,语句可能正确但无法理解的原因有很多。鉴于这些限制,解析可以走多远。

如果解析器可以计算出80%的代码,并且15%的代码在没有元数据的情况下无法解决,那么在扩展解析器以应对缺少的“5%”时会有减少的回报。

答案 4 :(得分:0)

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

你会知道创建一个完全支持所有Oracle SQL语法的SQL Parser是多么困难,这几乎是不可能的。

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

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

我认为像general sql parser这样的SQL解析器可以选择覆盖各种主要数据库最重要的SQL语法。

相关问题