【发布时间】:2022-01-26 16:37:56
【问题描述】:
我正在使用 Apache Calcite 根据对这些 SQL 查询施加某些限制的策略来验证和重写 SQL。我正在尝试修改 RelNode 树以重写查询以强制执行这些限制。我希望能够从查询中删除某些部分(在经过验证之后)。例如,我希望能够删除投影字段(我使用RelBuilder.projectExcept 设法做到了)并从查询中删除表扫描及其对应的列引用。
简单示例:
SELECT a.foo, b.bar, c.baz
FROM a, b, c
WHERE a.index = b.index AND b.index = c.index
假设我们要从查询中删除表 c,以得到以下结果:
SELECT a.foo, b.bar
FROM a, b
WHERE a.index = b.index
我尝试过使用RelBuilder,但这不支持从树中删除节点。我也考虑过使用RelVisitor 的方法,但这似乎相当复杂。我认为这基本上需要构建一个新的RelNode 树。最后,使用RelRule 实施规则似乎是一个合适的选择,但我无法从方解石文档中弄清楚如何删除特定的RelNode 以及如何参数化它(例如,如果表名是有条件地应用规则c)。
谁能指出一个好的方法?或者,只修改SqlNode 解析树会更容易吗?
【问题讨论】:
标签: apache-calcite