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

Wil*_*ill 9 sql oracle parsing

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

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

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

最好的,威尔

Aar*_*lla 7

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

解析器中的错误处理本身就是一个研究课题.这不仅是关于检测错误,而且还提供有用的信息可能是错误的以及如何解决它.有些解析器甚至不提供位置信息("行/列发生错误").

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

Oracle勉强提供VARCHAR,但您最好使用VARCHAR2.一些数据库提供递归/树状查询.所有这些都使用他们自己的特殊语法.在加入标准定义相当明确(join,left join,...),但何必呢,如果你可以使用+

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

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

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