簡體   English   中英

為什么 Apache Calcite RelOptRule 跳過過濾條件子查詢?

[英]Why Apache Calcite RelOptRule skips Filter Condition subquery?

例如,我們有下一個 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

這不是一個錯誤。 按照設計,方解石規則僅匹配調用中的 RelNodes。 過濾條件將是一個 RexCall,規則不適用於它。 您可能需要在過濾器上創建一個新規則並檢查輸入 Rex Exprs 是否是 RelNode 調用(或任何其他檢查),然后在其上應用此規則並進行轉換。 更容易的是首先將 In 分解為 Join 然后應用您的規則

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM