【问题标题】:How to modify a RelNode tree?如何修改 RelNode 树?
【发布时间】: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


    【解决方案1】:

    规则将(在本例中为 TransformationRuleRelNode 转换为 等效 RelNode,即两者应具有相同的行。假设您想使用 HepPlanner 并注册您的自定义规则,如果规则匹配,它最终将使用 RelOptUtil#verifyTypeEquivalence 检查原始 rel 和转换后的 rel 是否具有相同的行。我认为通过RelVisitor 改变relNode 或通过SqlVisitor 改变sqlNode 是你最好的选择。

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2021-01-03
      • 1970-01-01
      • 2010-11-10
      • 2021-05-15
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多