相对于算术表达式,Json和XML等解析,SQL就比较复杂了。
举个例子来说:符号“(”是目前的SqlAnalyzer1.00中作为进入递归的标志之一,到“)”结束,中间是个查询语句。如果测试用例也是这样,自然没有问题,但是,SQL是灵活的...
首先,括号里未必是子查询,它可能是函数的一部分,比如count(*), 这时就得回退记号,然后按函数重读;
其次,函数嵌套也常见,比如substr里面有个length,这时候读到第一个“)”就认为结束是不合情理的;
其三,有时查询不是非放到括号里才能正常执行的。
不知Oracle或是MySQL的解释器是怎么做的,我目前能做到无函数有select/from/where/order by子句,多重子查询的SQL解析,总之我感觉要做出一个完美普适的SQL解析器还需要一些时日。
2020年5月28日