Uploaded image for project: 'Calcite'
  1. Calcite
  2. CALCITE-2593

Sometimes fails to plan when a RelNode transform multiple collations to single collation

VotersWatch issueWatchersLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    Description

      Sample SQL:

      select sum(X + 1) filter (where Y) as "SET" from (values (1, TRUE), (2, TRUE)) AS t(X, Y) limit 10

      Error log:

      java.lang.RuntimeException: exception while executing [select sum(X + 1) filter (where Y) as "SET" from (values (1, TRUE), (2, TRUE)) AS t(X, Y) limit 10] at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1366) at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1339) at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1302) at org.apache.calcite.test.JdbcTest.testWithinGroupClause5(JdbcTest.java:6736) 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) Caused by: java.lang.RuntimeException: With materializationsEnabled=false, limit=0 at org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:573) at org.apache.calcite.test.CalciteAssert$AssertQuery.returns(CalciteAssert.java:1362) ... 25 more Caused by: java.sql.SQLException: Error while executing SQL "select sum(X + 1) filter (where Y) as "SET" from (values (1, TRUE), (2, TRUE)) AS t(X, Y) limit 10": Node [rel#22:Subset#3.ENUMERABLE.[]] could not be implemented; planner state: Root: rel#22:Subset#3.ENUMERABLE.[] Original rel: LogicalSort(subset=[rel#22:Subset#3.ENUMERABLE.[]], fetch=[10]): rowcount = 1.0, cumulative cost = {1.0 rows, 4.0 cpu, 0.0 io}, id = 17 LogicalAggregate(subset=[rel#16:Subset#2.NONE.[]], group=[{}], SET=[SUM($0) FILTER $1]): rowcount = 1.0, cumulative cost = {1.1375000476837158 rows, 0.0 cpu, 0.0 io}, id = 15 LogicalProject(subset=[rel#14:Subset#1.NONE.[1]], $f0=[+($0, 1)], Y=[$1]): rowcount = 2.0, cumulative cost = {2.0 rows, 4.0 cpu, 0.0 io}, id = 13 LogicalValues(subset=[rel#12:Subset#0.NONE.[]], tuples=[[{ 1, true }, { 2, true }]]): rowcount = 2.0, cumulative cost = {2.0 rows, 1.0 cpu, 0.0 io}, id = 1 Sets: Set#0, type: RecordType(INTEGER X, BOOLEAN Y) rel#12:Subset#0.NONE.[], best=null, importance=0.6561 rel#1:LogicalValues.NONE.[[0, 1], [1]](type=RecordType(INTEGER X, BOOLEAN Y),tuples=[{ 1, true }, { 2, true }]), rowcount=2.0, cumulative cost={inf} rel#37:Subset#0.ENUMERABLE.[], best=rel#36, importance=0.32805 rel#36:EnumerableValues.ENUMERABLE.[[0, 1], [1]](type=RecordType(INTEGER X, BOOLEAN Y),tuples=[{ 1, true }, { 2, true }]), rowcount=2.0, cumulative cost={2.0 rows, 1.0 cpu, 0.0 io} Set#1, type: RecordType(INTEGER $f0, BOOLEAN Y) rel#14:Subset#1.NONE.[1], best=null, importance=0.7290000000000001 rel#13:LogicalProject.NONE.[[1]](input=rel#12:Subset#0.NONE.[],$f0=+($0, 1),Y=$1), rowcount=2.0, cumulative cost={inf} rel#41:Subset#1.ENUMERABLE.[], best=rel#40, importance=0.36450000000000005 rel#40:EnumerableProject.ENUMERABLE.[](input=rel#37:Subset#0.ENUMERABLE.[],$f0=+($0, 1),Y=$1), rowcount=2.0, cumulative cost={4.0 rows, 5.0 cpu, 0.0 io} rel#43:Subset#1.ENUMERABLE.[1], best=null, importance=0.7290000000000001 Set#2, type: RecordType(INTEGER SET) rel#16:Subset#2.NONE.[], best=null, importance=0.81 rel#15:LogicalAggregate.NONE.[](input=rel#14:Subset#1.NONE.[1],group={},SET=SUM($0) FILTER $1), rowcount=1.0, cumulative cost={inf} rel#29:LogicalProject.NONE.[](input=rel#28:Subset#4.NONE.[],SET=CASE(=($1, 0), null, $0)), rowcount=1.0, cumulative cost={inf} rel#24:Subset#2.ENUMERABLE.[], best=null, importance=0.9 rel#39:EnumerableProject.ENUMERABLE.[](input=rel#38:Subset#4.ENUMERABLE.[],SET=CASE(=($1, 0), null, $0)), rowcount=1.0, cumulative cost={inf} rel#44:EnumerableAggregate.ENUMERABLE.[](input=rel#43:Subset#1.ENUMERABLE.[1],group={},SET=SUM($0) FILTER $1), rowcount=1.0, cumulative cost={inf} Set#3, type: RecordType(INTEGER SET) rel#18:Subset#3.NONE.[], best=null, importance=0.9 rel#17:LogicalSort.NONE.[](input=rel#16:Subset#2.NONE.[],fetch=10), rowcount=1.0, cumulative cost={inf} rel#33:LogicalProject.NONE.[](input=rel#32:Subset#5.NONE.[],SET=CASE(=($1, 0), null, $0)), rowcount=1.0, cumulative cost={inf} rel#22:Subset#3.ENUMERABLE.[], best=null, importance=1.0 rel#23:AbstractConverter.ENUMERABLE.[](input=rel#18:Subset#3.NONE.[],convention=ENUMERABLE,sort=[]), rowcount=1.0, cumulative cost={inf} rel#25:EnumerableLimit.ENUMERABLE.[](input=rel#24:Subset#2.ENUMERABLE.[],fetch=10), rowcount=1.0, cumulative cost={inf} rel#35:EnumerableProject.ENUMERABLE.[](input=rel#34:Subset#5.ENUMERABLE.[],SET=CASE(=($1, 0), null, $0)), rowcount=1.0, cumulative cost={inf} Set#4, type: RecordType(INTEGER SET, BIGINT $f1) rel#28:Subset#4.NONE.[], best=null, importance=0.7290000000000001 rel#26:LogicalAggregate.NONE.[](input=rel#14:Subset#1.NONE.[1],group={},SET=$SUM0($0) FILTER $1,agg#1=COUNT() FILTER $1), rowcount=1.0, cumulative cost={inf} rel#38:Subset#4.ENUMERABLE.[], best=null, importance=0.81 rel#45:EnumerableAggregate.ENUMERABLE.[](input=rel#43:Subset#1.ENUMERABLE.[1],group={},SET=$SUM0($0) FILTER $1,agg#1=COUNT() FILTER $1), rowcount=1.0, cumulative cost={inf} Set#5, type: RecordType(INTEGER SET, BIGINT $f1) rel#32:Subset#5.NONE.[], best=null, importance=0.81 rel#30:LogicalSort.NONE.[](input=rel#28:Subset#4.NONE.[],fetch=10), rowcount=1.0, cumulative cost={inf} rel#34:Subset#5.ENUMERABLE.[], best=null, importance=0.9 rel#42:EnumerableLimit.ENUMERABLE.[](input=rel#38:Subset#4.ENUMERABLE.[],fetch=10), rowcount=1.0, cumulative cost={inf} at org.apache.calcite.avatica.Helper.createException(Helper.java:56) at org.apache.calcite.avatica.Helper.createException(Helper.java:41) at org.apache.calcite.avatica.AvaticaStatement.executeInternal(AvaticaStatement.java:163) at org.apache.calcite.avatica.AvaticaStatement.executeQuery(AvaticaStatement.java:227) at org.apache.calcite.test.CalciteAssert.assertQuery(CalciteAssert.java:541) ... 26 more Caused by: org.apache.calcite.plan.RelOptPlanner$CannotPlanException: Node [rel#22:Subset#3.ENUMERABLE.[]] could not be implemented; planner state: Root: rel#22:Subset#3.ENUMERABLE.[] Original rel: LogicalSort(subset=[rel#22:Subset#3.ENUMERABLE.[]], fetch=[10]): rowcount = 1.0, cumulative cost = {1.0 rows, 4.0 cpu, 0.0 io}, id = 17 LogicalAggregate(subset=[rel#16:Subset#2.NONE.[]], group=[{}], SET=[SUM($0) FILTER $1]): rowcount = 1.0, cumulative cost = {1.1375000476837158 rows, 0.0 cpu, 0.0 io}, id = 15 LogicalProject(subset=[rel#14:Subset#1.NONE.[1]], $f0=[+($0, 1)], Y=[$1]): rowcount = 2.0, cumulative cost = {2.0 rows, 4.0 cpu, 0.0 io}, id = 13 LogicalValues(subset=[rel#12:Subset#0.NONE.[]], tuples=[[{ 1, true }, { 2, true }]]): rowcount = 2.0, cumulative cost = {2.0 rows, 1.0 cpu, 0.0 io}, id = 1 Sets: Set#0, type: RecordType(INTEGER X, BOOLEAN Y) rel#12:Subset#0.NONE.[], best=null, importance=0.6561 rel#1:LogicalValues.NONE.[[0, 1], [1]](type=RecordType(INTEGER X, BOOLEAN Y),tuples=[{ 1, true }, { 2, true }]), rowcount=2.0, cumulative cost={inf} rel#37:Subset#0.ENUMERABLE.[], best=rel#36, importance=0.32805 rel#36:EnumerableValues.ENUMERABLE.[[0, 1], [1]](type=RecordType(INTEGER X, BOOLEAN Y),tuples=[{ 1, true }, { 2, true }]), rowcount=2.0, cumulative cost={2.0 rows, 1.0 cpu, 0.0 io} Set#1, type: RecordType(INTEGER $f0, BOOLEAN Y) rel#14:Subset#1.NONE.[1], best=null, importance=0.7290000000000001 rel#13:LogicalProject.NONE.[[1]](input=rel#12:Subset#0.NONE.[],$f0=+($0, 1),Y=$1), rowcount=2.0, cumulative cost={inf} rel#41:Subset#1.ENUMERABLE.[], best=rel#40, importance=0.36450000000000005 rel#40:EnumerableProject.ENUMERABLE.[](input=rel#37:Subset#0.ENUMERABLE.[],$f0=+($0, 1),Y=$1), rowcount=2.0, cumulative cost={4.0 rows, 5.0 cpu, 0.0 io} rel#43:Subset#1.ENUMERABLE.[1], best=null, importance=0.7290000000000001 Set#2, type: RecordType(INTEGER SET) rel#16:Subset#2.NONE.[], best=null, importance=0.81 rel#15:LogicalAggregate.NONE.[](input=rel#14:Subset#1.NONE.[1],group={},SET=SUM($0) FILTER $1), rowcount=1.0, cumulative cost={inf} rel#29:LogicalProject.NONE.[](input=rel#28:Subset#4.NONE.[],SET=CASE(=($1, 0), null, $0)), rowcount=1.0, cumulative cost={inf} rel#24:Subset#2.ENUMERABLE.[], best=null, importance=0.9 rel#39:EnumerableProject.ENUMERABLE.[](input=rel#38:Subset#4.ENUMERABLE.[],SET=CASE(=($1, 0), null, $0)), rowcount=1.0, cumulative cost={inf} rel#44:EnumerableAggregate.ENUMERABLE.[](input=rel#43:Subset#1.ENUMERABLE.[1],group={},SET=SUM($0) FILTER $1), rowcount=1.0, cumulative cost={inf} Set#3, type: RecordType(INTEGER SET) rel#18:Subset#3.NONE.[], best=null, importance=0.9 rel#17:LogicalSort.NONE.[](input=rel#16:Subset#2.NONE.[],fetch=10), rowcount=1.0, cumulative cost={inf} rel#33:LogicalProject.NONE.[](input=rel#32:Subset#5.NONE.[],SET=CASE(=($1, 0), null, $0)), rowcount=1.0, cumulative cost={inf} rel#22:Subset#3.ENUMERABLE.[], best=null, importance=1.0 rel#23:AbstractConverter.ENUMERABLE.[](input=rel#18:Subset#3.NONE.[],convention=ENUMERABLE,sort=[]), rowcount=1.0, cumulative cost={inf} rel#25:EnumerableLimit.ENUMERABLE.[](input=rel#24:Subset#2.ENUMERABLE.[],fetch=10), rowcount=1.0, cumulative cost={inf} rel#35:EnumerableProject.ENUMERABLE.[](input=rel#34:Subset#5.ENUMERABLE.[],SET=CASE(=($1, 0), null, $0)), rowcount=1.0, cumulative cost={inf} Set#4, type: RecordType(INTEGER SET, BIGINT $f1) rel#28:Subset#4.NONE.[], best=null, importance=0.7290000000000001 rel#26:LogicalAggregate.NONE.[](input=rel#14:Subset#1.NONE.[1],group={},SET=$SUM0($0) FILTER $1,agg#1=COUNT() FILTER $1), rowcount=1.0, cumulative cost={inf} rel#38:Subset#4.ENUMERABLE.[], best=null, importance=0.81 rel#45:EnumerableAggregate.ENUMERABLE.[](input=rel#43:Subset#1.ENUMERABLE.[1],group={},SET=$SUM0($0) FILTER $1,agg#1=COUNT() FILTER $1), rowcount=1.0, cumulative cost={inf} Set#5, type: RecordType(INTEGER SET, BIGINT $f1) rel#32:Subset#5.NONE.[], best=null, importance=0.81 rel#30:LogicalSort.NONE.[](input=rel#28:Subset#4.NONE.[],fetch=10), rowcount=1.0, cumulative cost={inf} rel#34:Subset#5.ENUMERABLE.[], best=null, importance=0.9 rel#42:EnumerableLimit.ENUMERABLE.[](input=rel#38:Subset#4.ENUMERABLE.[],fetch=10), rowcount=1.0, cumulative cost={inf} at org.apache.calcite.plan.volcano.RelSubset$CheapestPlanReplacer.visit(RelSubset.java:437) at org.apache.calcite.plan.volcano.RelSubset.buildCheapestPlan(RelSubset.java:296) at org.apache.calcite.plan.volcano.VolcanoPlanner.findBestExp(VolcanoPlanner.java:657) at org.apache.calcite.tools.Programs.lambda$standard$3(Programs.java:298) at org.apache.calcite.tools.Programs$SequenceProgram.run(Programs.java:358) at org.apache.calcite.prepare.Prepare.optimize(Prepare.java:188) at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:319) at org.apache.calcite.prepare.Prepare.prepareSql(Prepare.java:230) at org.apache.calcite.prepare.CalcitePrepareImpl.prepare2_(CalcitePrepareImpl.java:772) at org.apache.calcite.prepare.CalcitePrepareImpl.prepare_(CalcitePrepareImpl.java:636) at org.apache.calcite.prepare.CalcitePrepareImpl.prepareSql(CalcitePrepareImpl.java:606) at org.apache.calcite.jdbc.CalciteConnectionImpl.parseQuery(CalciteConnectionImpl.java:229) 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) ... 28 more
      

      ---------------------
      Update:
      AFAIK, SQL like the sample SQL triggers the error only if LogicalValue emits multiple collation trait combinations where LogicalProject only takes one of them.

      Attachments

        Issue Links

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            zhztheplayer Hongze Zhang
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - Not Specified
                Not Specified
                Remaining:
                Remaining Estimate - 0h
                0h
                Logged:
                Time Spent - 1h
                1h

                Slack

                  Issue deployment