You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Xiening Dai (Jira)" <ji...@apache.org> on 2019/08/22 21:46:00 UTC

[jira] [Commented] (CALCITE-3283) RelSubSet's best is not existed in the set

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

Xiening Dai commented on CALCITE-3283:
--------------------------------------

In VolcanoPlanner.rename(), the given relnode will be removed when we find there's an equivalent rel after rename. But if the node to be removed happens to be the best relnode of its subset, the RelSubSet.best might not able to get updated under two scenarios -

1. If equivalent rel is in the same set as the original rel, currently we do nothing. So RelSubSet.best is not updated and points to a node that's removed.

2. If we end up merging two sub set and equivalent rel cost is same as original rel cost, we won't update RelSubSet.best either.

I will send out a PR for this.

> RelSubSet's best is not existed in the set
> ------------------------------------------
>
>                 Key: CALCITE-3283
>                 URL: https://issues.apache.org/jira/browse/CALCITE-3283
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Xiening Dai
>            Priority: Major
>
> To repro this, add below code in VolcanoPlanner.isValid() which verifies RelSubset.best indeed belongs to its set -
> {code:java}
>         // Make sure best RelNode is valid
>         if (subset.best != null && !subset.set.rels.contains(subset.best)) {
>           return litmus.fail("RelSubSet [{}] has best RelNode [{}] which is not existed in its set.",
>                   subset.getDescription(), subset.best.getDescription());
>         }
> {code}
> Run JDBCTest.testVarcharEquals, you will get below exception -
> java.lang.AssertionError: RelSubSet [rel#6828:Subset#2.JDBC.foodmart.[]] has best RelNode [rel#6871:JdbcProject.JDBC.foodmart.[](input=RelSubset#6844,lname=$2)] which is not existed in its set.
> 	at org.apache.calcite.util.Litmus$1.fail(Litmus.java:31)
> 	at org.apache.calcite.plan.volcano.VolcanoPlanner.isValid(VolcanoPlanner.java:888)
> 	at org.apache.calcite.plan.volcano.VolcanoPlanner.register(VolcanoPlanner.java:851)
> 	at org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:868)
> 	at org.apache.calcite.plan.volcano.VolcanoPlanner.ensureRegistered(VolcanoPlanner.java:1939)
> 	at org.apache.calcite.plan.volcano.VolcanoRuleCall.transformTo(VolcanoRuleCall.java:129)
> 	at org.apache.calcite.plan.RelOptRuleCall.transformTo(RelOptRuleCall.java:236)
> 	at org.apache.calcite.rel.convert.ConverterRule.onMatch(ConverterRule.java:141)
> 	at org.apache.calcite.plan.volcano.VolcanoRuleCall.onMatch(VolcanoRuleCall.java:208)
> 	at org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:631)
> 	at org.apache.calcite.tools.Programs.lambda$standard$3(Programs.java:286)
> 	at org.apache.calcite.tools.Programs$SequenceProgram.run(Programs.java:346)
> 	at org.apache.calcite.prepare.Prepare.optimize(Prepare.java:189)
> 	at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:320)
> 	at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:231)
> 	at org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:638)
> 	at org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:502)
> 	at org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:472)
> 	at org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:231)
> 	at org.apache.calcite.jdbc.CalciteMetaImpl.prepareAndExecute(CalciteMetaImpl.java:550)
> 	at org.apache.calcite.avatica.AvaticaConnection.prepareAndExecuteInternal(AvaticaConnection.java:675)
> 	at org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:156)
> 	at org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:227)
> 	at org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:522)
> 	at org.apache.calcite.test.CalciteAssert$AssertQuery.lambda$returns$1(CalciteAssert.java:1466)
> 	at org.apache.calcite.test.CalciteAssert$AssertQuery.withConnection(CalciteAssert.java:1398)
> 	at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1464)
> 	at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1447)
> 	at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1410)
> 	at org.apache.calcite.test.JdbcTest.testVarcharEquals(JdbcTest.java:4420)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> 	at java.lang.reflect.Method.invoke(Method.java:498)
> 	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> 	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> 	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> 	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> 	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> 	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> 	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> 	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> 	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> 	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> 	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> 	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> 	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
> 	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
> 	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
> 	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
> 	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
> 	Suppressed: org.apache.calcite.util.TestUtil$ExtraInformation: With materializationsEnabled=false, limit=0, sql=select count(*) as c from "customer" where "lname" = 'this string is longer than 30 characters'
> 		at org.apache.calcite.util.TestUtil.rethrow(TestUtil.java:268)
> 		at org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:554)
> 		... 28 more



--
This message was sent by Atlassian Jira
(v8.3.2#803003)