我正在研究将Oracle SQL转换为ANSI SQL的工具。我有一个解析Oracle SQL和ANSI SQL的语法。将子树从AST的一个部分移到另一个部分
我想从AST的where子句部分提取Oracle外部连接表达式,并在AST的from子句部分的末尾插入新的连接子句以用于匹配的select或subquery。
具有重写规则的树解析器可以执行这种类型的树转换吗?
即采取从Oracle SQL
SELECT
a.columna, b.columnb
FROM
tablea a,
tableb b
WHERE
a.columna2 (+) = b.columnb2 (+)
AND
a.columna3 = 'foo'
AND
b.columnb3 = 'bar'
产生AST并将其转换为一个AST为ANSI SQL
SELECT
a.columna, b.columnb
FROM
tablea a FULL OUTER JOIN tableb b ON (a.columna2 = b.columnb2)
WHERE
a.columna3 = 'foo'
and
b.columnb3 = 'bar'
注释1:对于tablea
和tableb
表的引用从FROM
条款删除并用引用相同表和表别名的JOIN
子句替换。
注2:Oracle连接条件在sql_condition比较两端都存在OuterJoinIndicator(+)时被标识为FULL OUTER JOIN
。注3:连接条件比较从WHERE
子句中删除,并用于构造连接子句ON条件[删除了OuterJoinIndicator(s)]。
只有1个语法分析Oracle SQL和我们需要的所有ANSI SQL语法。 – user2074928 2013-05-07 15:08:49
语法识别需要处理的sql_condition案例并添加可通过令牌类型搜索的“标签”。 – user2074928 2013-05-07 15:12:28
condition_comparison : (\t(column_reference OuterJoinSign relop column_reference OuterJoinSign)\t => \t的col1a = column_reference oj1a = OuterJoinSign ROP1 = relop col1b = column_reference oj1b = OuterJoinSign \t - > ^( 't_full_join_condition' $的col1a $ oj1a $ ROP1 $ col1b $ oj1b) | \t(column_reference OuterJoinSign relop column_reference)\t => \t col2a = column_reference oj2a = OuterJoinSign ROP2 = relop col2b = column_reference \t - > ^( 't_right_join_condition' $ col2a $ oj2a $ ROP2 $ col2b) – user2074928 2013-05-07 15:12:44