[ 
https://issues.apache.org/jira/browse/CALCITE-3479?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16968631#comment-16968631
 ] 

Xiening Dai commented on CALCITE-3479:
--------------------------------------

I took a brief look at this, and I believe unfortunately it's a regression 
caused by fix of CALCITE-2166.

As [~julianhyde] mentioned, there could be cycles in the memo. I draw a quick 
example to show the problem. Originally the RelSubSet A has a best rel which 
uses subset C as input. But for some reason the cost of C or D is increased 
then with patch of 2166, we have to recalculate and decide the new best rel for 
subset A. Now there's this rel node (noted as "New Best") which uses subset B 
as input and form a cycle with subset A. During the calculation since Subset 
A's best cost is not updated yet (still the one before increasing), so it's 
likely that "New Best" node become the new best relnode for Subset A. Then you 
get into the trouble of having a cycle in your best plan.

I don't think there's easy way to fix this. There's a chicken-egg problem here: 
without re-calculating rel node costs in Subset A, we cannot determine the new 
best cost; but re-calculating the rel node costs would require getting the best 
cost of Subset A itself due to cyclic reference. For now, I can undo the patch 
of 2166 to mitigate this problem. But in longer run, we really need to see if 
the cyclic references are really needed by the framework and if we can remove 
them (CALCITE-790 ?).

 

> Stack overflow error thrown when running join query
> ---------------------------------------------------
>
>                 Key: CALCITE-3479
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3479
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Amit Chavan
>            Priority: Major
>         Attachments: TestCalcite.java
>
>
> A unit test in our project is failing which is as below.
> The query in question is 
> {code}SELECT * FROM tblspace1.t1 t10, tblspace1.t2 t20 WHERE t20.n1 = 3 AND 
> t10.n1 = 3 AND t20.n1 = t10.n1{code}
> I get a stack overflow error- 
> {noformat}
> -- Mid Plan-- Mid Plan
> LogicalProject(subset=[rel#19:Subset#4.ENUMERABLE.[]], k1=[$0], n1=[$1], 
> s1=[$2], k2=[$3], n10=[$4], s2=[$5])
>   LogicalFilter(subset=[rel#16:Subset#3.NONE.[]], condition=[AND(=($4, 3), 
> =($1, 3), =($4, $1))])
>     LogicalJoin(subset=[rel#14:Subset#2.NONE.[]], condition=[true], 
> joinType=[inner])
>       EnumerableTableScan(subset=[rel#11:Subset#0.ENUMERABLE.[]], 
> table=[[tblspace1, t1]])
>       EnumerableTableScan(subset=[rel#12:Subset#1.ENUMERABLE.[]], 
> table=[[tblspace1, t2]])
> {noformat}
> {code}
> java.lang.StackOverflowError at 
> org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:639)
>  at 
> org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:643)
>  at 
> org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:643)
>  at 
> org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:643)
>  at 
> org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:643)
>  at 
> org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:643)
> {code}
> Also attaching the UT code in the ticket



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to