【发布时间】:2013-05-07 09:37:15
【问题描述】:
我正在开发一种将 Oracle SQL 转换为 ANSI SQL 的工具。我有一个可以同时解析 Oracle SQL 和 ANSI SQL 的语法。
我想从 AST 的 where 子句部分提取 Oracle 外连接表达式,并在匹配的 select 或子查询的 AST 的 from 子句部分的末尾插入新的连接子句。
具有重写规则的树解析器可以进行这种类型的树转换吗?
即获取从 Oracle SQL 生成的 AST
SELECT
a.columna, b.columnb
FROM
tablea a,
tableb b
WHERE
a.columna2 (+) = b.columnb2 (+)
AND
a.columna3 = 'foo'
AND
b.columnb3 = 'bar'
并将其转换为 ANSI SQL 的 AST
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)]。
【问题讨论】:
标签: antlr antlr3 abstract-syntax-tree