【问题标题】:Why Apache Calcite RelOptRule skips Filter Condition subquery?为什么 Apache Calcite RelOptRule 跳过过滤条件子查询?
【发布时间】:2021-10-09 13:17:42
【问题描述】:

例如,我们有下一个 Rel 树(条件中有子查询)

LogicalProject(id=[$0], varchar_col=[$1], link_col=[$2])
  LogicalFilter(condition=[IN($0, {
        LogicalSort(fetch=[1])
          LogicalProject(id=[$0])
            LogicalTableScan(table=[[db, table2]])
        })])
    LogicalTableScan(table=[[db, table1]])

创建自:

SELECT * FROM db.table1 as b where b.id IN (select c.id from db.table2 as c limit 1)

如果我实现仅查找 TableScan 的 RelOptRule,它将只找到一个与 table1

一起操作的规则
new TestRule(RelOptRule.operand(LogicalTableScan.class, RelOptRule.any()), "test")

这是一个错误吗? RelShuttle 中发生了常见行为,它会相应地跳过 RelNode

【问题讨论】:

    标签: java apache-calcite


    【解决方案1】:

    这不是错误。按照设计,方解石规则仅匹配调用中的 RelNodes。过滤条件将是 RexCall,并且规则不适用于它。 您可能需要在 Filter 上创建一个新规则并检查输入 Rex Exprs 是否是 RelNode 调用(或任何其他检查),然后将此规则应用于该规则并进行转换。 更简单的方法是先将 In 分解为 Join,然后应用您的规则

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2019-11-04
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多