[英]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.