[
https://issues.apache.org/jira/browse/CALCITE-3939?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17119048#comment-17119048
]
Anton Haidai commented on CALCITE-3939:
---------------------------------------
[~botong], thank you for you detailed description. I did some debugging and I
think that I figured out what is going on, so here are debugging results
aligned with the steps from your message.
h2. Step 1
<RuleMatch1> happens as described.
h2. Step 2
Due to the autoPruneOld() returning true, there is a call
volcanoPlanner.prune(<TrivialProject>) before the merge of <RelSet2> and
<RelSet3>.
The merge itself: there is a call <RelSet3>.mergeWith(<RelSet2>)
So the <RelSet2> is being removed from a list of sets.
There is an attempt to add <TrivialProject> into <RelSet3>:
planner.reregister(<RelSet3>, <TrivialProject>);
But this VolcanoPlanner.reregister() method has the following check:
{code:java}
if (!prunedNodes.contains(rel)) {
addRelToSet(rel, set);
}{code}
So there is a difference with your scenario: instead of both <TrivialProject>
and <CustomScan> being in <RelSet3>, there is only <CustomScan> there while the
<TrivialProject> is just thrown away.
h2. Step 3
This <RuleMatch2> never happens. I think, this is because <LogicalSort>
obviously has a convention NONE as a logical node, but <CustomScan> is *not* a
logical node and has some final custom convention from the beginning. So while
the <CustomScan> is the only node in a set, there is no other nodes with NONE
convention in this set so <LogicalSort> input is an empty subset with NONE
convention and <RuleX> can't match once more and <RuleMatch2> never happens.
h2. Step 4
all as described, <RuleMatch1> is ignored (RuleQueue.skipMatch() method).
h2. Step 5
As described in Step 3 <RuleMatch2> never happens.
My workaround (force ProjectRemoveRule.autoPruneOld() to return false) make it
work exactly as you described: <RelSet3> contains both <CustomScan> and
<TrivialProject> making <RuleMatch2> possible because <LogicalSort> has some
input with NONE convention.
Another workaround could be using something like <LogicalScan>[NONE] ->
<CustomScanRule> -> <CustomScan>[FINAL_CONVENTION] instead of a direct use of
<CustomScan>[FINAL_CONVENTION] in a logical plan: pretty sure it will work, but
I didn't check it.
> Change UnionEliminatorRule and ProjectRemoveRule to auto pruning
> SubstitutionRule
> ---------------------------------------------------------------------------------
>
> Key: CALCITE-3939
> URL: https://issues.apache.org/jira/browse/CALCITE-3939
> Project: Calcite
> Issue Type: Improvement
> Reporter: Botong Huang
> Priority: Major
> Fix For: 1.23.0
>
> Time Spent: 50m
> Remaining Estimate: 0h
>
> UnionEliminatorRule and ProjectRemoveRule are both pruning rules for a
> RelNode. They can also become SubstitutionRule with autoprune enabled
--
This message was sent by Atlassian Jira
(v8.3.4#803005)