[
https://issues.apache.org/jira/browse/CALCITE-4677?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17389779#comment-17389779
]
ZiLin Chen commented on CALCITE-4677:
-------------------------------------
The physical node is generated by a Implementation rule.
> Different physical conventions conversion on new physical node producing
> -------------------------------------------------------------------------
>
> Key: CALCITE-4677
> URL: https://issues.apache.org/jira/browse/CALCITE-4677
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.28.0
> Reporter: ZiLin Chen
> Priority: Major
> Labels: pull-request-available
> Time Spent: 20m
> Remaining Estimate: 0h
>
> When we enable top-down optimization, the VolcanoPlanner couldn't be
> completely compatible with the old one.
> Especially when we using rules matching RelNodes which convention is not
> NONE, like rules that want to convert different conventions between physical
> node or some rules that want to do some optimization for serval physical
> nodes. It could be found that rules can't fire, because in top-down
> optimization physical nodes can only be created by implementation
> rules(logical node -> physical node) but not rules matching physical
> node(physical node -> physical node). Try to use enforcer instead of rules to
> convert node between different conventions.
>
> Example:
> Whenever new physical nodes are on produce, we need to fire rules in case of
> different physical conventions conversion.
> DeriveTrait Task deal with this case, while some physical node maybe missing.
>
> There 3 rules, but in TopDownRuleDriver rule 3 can not be applied.
> 1. LogicalSortToTopNRule
> 2. LogicalSortToLimitMemSortRule
> 3. TopNToSomeRelNodeRule (Need Match Physical Convention Node like TopN)
>
> LogicalAggreate -> 1. RelSet1
> - LogicalSort -> 2. RelSet2 fires LogicalSortToTopNRule and
> LogicalSortToLimitMemSortRule
> - OtherNode -> 3. RelSet3
>
> ApplyRuleTask LogicalSortToLimitMemSortRule is already scheduled.
> ApplyRuleTask LogicalSortToTopNRule still on the stack.
>
> when RelSet3 on Merge (Merge with other RelSets), then RelSet2
> clearProcessed(): subset.resetTaskState() and then RelSet1 clearProcessed():
> subset.resetTaskState()
> because RelSet1 is root so OptimizeGroup will be scheduled again
>
> Now the task stack
> Task Stack:
> Task about RelSet1
> Task about RelSet2 ApplyRuleTask LogicalSortToTopNRule
> Task about RelSet3
> Task about RelSet1 root schedule again
> Task about RelSet2
> Task about RelSet3 (current task)
>
> next
> Task Stack:
> Task about RelSet1
> Task about RelSet2
> Task about RelSet3
> Task about RelSet1
> Task about RelSet2 RelSubSet setOptimized so taskState -> Completed. rels on
> RelSet (LogicalSort and LimitMemSort)
>
> next...
> Task Stack:
> Task about RelSet1
> Task about RelSet2 ApplyRuleTask LogicalSortToTopNRule.
> Here we found when TopN is on produce, every RelSubSet can not fire
> OptimizeInputTask. so TopNToSomeRelNodeRule can not fire
--
This message was sent by Atlassian Jira
(v8.3.4#803005)