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

Stackoverflow while evaluating filter with large number of OR conditions

    XMLWordPrintableJSON

Details

    Description

      As a workaround for CALCITE-2696 we're currently using OR conditions for filtering values, e.g. instead of

      ... WHERE value2 IN (1,2,3)
      
      ... WHERE value2=1 OR value2=2 OR value2=3
      

      We're now hitting a StackOverflowError because the number of values in the filter grows quite large (i.e. 1000-3000) and obviously the evaluation recursive:

      java.lang.StackOverflowError
      	at java.util.AbstractCollection.toArray(AbstractCollection.java:176)
      	at org.apache.calcite.sql.util.SqlShuttle$CallCopyingArgHandler.<init>(SqlShuttle.java:111)
      	at org.apache.calcite.sql.validate.SqlValidatorImpl$Expander.visitScoped(SqlValidatorImpl.java:5699)
      	at org.apache.calcite.sql.validate.SqlScopedShuttle.visit(SqlScopedShuttle.java:50)
      	at org.apache.calcite.sql.validate.SqlScopedShuttle.visit(SqlScopedShuttle.java:33)
      	at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:138)
      	at org.apache.calcite.sql.util.SqlShuttle$CallCopyingArgHandler.visitChild(SqlShuttle.java:134)
      	at org.apache.calcite.sql.util.SqlShuttle$CallCopyingArgHandler.visitChild(SqlShuttle.java:101)
      	at org.apache.calcite.sql.SqlOperator.acceptCall(SqlOperator.java:865)
      	at org.apache.calcite.sql.validate.SqlValidatorImpl$Expander.visitScoped(SqlValidatorImpl.java:5701)
      	at org.apache.calcite.sql.validate.SqlScopedShuttle.visit(SqlScopedShuttle.java:50)
      	at org.apache.calcite.sql.validate.SqlScopedShuttle.visit(SqlScopedShuttle.java:33)
      	at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:138)
      	at org.apache.calcite.sql.util.SqlShuttle$CallCopyingArgHandler.visitChild(SqlShuttle.java:134)
      	at org.apache.calcite.sql.util.SqlShuttle$CallCopyingArgHandler.visitChild(SqlShuttle.java:101)
      	at org.apache.calcite.sql.SqlOperator.acceptCall(SqlOperator.java:865)
      	at org.apache.calcite.sql.validate.SqlValidatorImpl$Expander.visitScoped(SqlValidatorImpl.java:5701)
      	at org.apache.calcite.sql.validate.SqlScopedShuttle.visit(SqlScopedShuttle.java:50)
      	at org.apache.calcite.sql.validate.SqlScopedShuttle.visit(SqlScopedShuttle.java:33)
      	at org.apache.calcite.sql.SqlCall.accept(SqlCall.java:138)
      ...
      

      We tried to increase the stack size of the virtual machine (-Xss8000k) but this leads to a problem with Janino:

      java.sql.SQLException: exception while executing query: Compiling "Buzz": Code of method "execute(Lorg/apache/calcite/interpreter/Context;[Ljava/lang/Object;)V" of class "Buzz" grows beyond 64 KB
      
      	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.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:577)
      	at org.apache.calcite.avatica.AvaticaPreparedStatement.executeQuery(AvaticaPreparedStatement.java:137)
      	at org.apache.calcite.issue.StackOverflowTest.stackOverflow(StackOverflowTest.java:45)
      	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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
      	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
      	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: org.codehaus.janino.InternalCompilerException: Compiling "Buzz": Code of method "execute(Lorg/apache/calcite/interpreter/Context;[Ljava/lang/Object;)V" of class "Buzz" grows beyond 64 KB
      	at org.codehaus.janino.UnitCompiler.compileUnit(UnitCompiler.java:382)
      	at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:237)
      	at org.codehaus.janino.SimpleCompiler.compileToClassLoader(SimpleCompiler.java:465)
      	at org.codehaus.janino.ClassBodyEvaluator.compileToClass(ClassBodyEvaluator.java:313)
      	at org.codehaus.janino.ClassBodyEvaluator.cook(ClassBodyEvaluator.java:235)
      	at org.codehaus.janino.SimpleCompiler.cook(SimpleCompiler.java:207)
      	at org.codehaus.commons.compiler.Cookable.cook(Cookable.java:50)
      	at org.codehaus.janino.ClassBodyEvaluator.createInstance(ClassBodyEvaluator.java:347)
      	at org.apache.calcite.interpreter.JaninoRexCompiler.getScalar(JaninoRexCompiler.java:176)
      	at org.apache.calcite.interpreter.JaninoRexCompiler.baz(JaninoRexCompiler.java:153)
      	at org.apache.calcite.interpreter.JaninoRexCompiler.compile(JaninoRexCompiler.java:111)
      	at org.apache.calcite.interpreter.Interpreter$CompilerImpl.compile(Interpreter.java:487)
      	at org.apache.calcite.interpreter.Nodes$CoreCompiler.compile(Nodes.java:42)
      	at org.apache.calcite.interpreter.TableScanNode.createEnumerable(TableScanNode.java:266)
      	at org.apache.calcite.interpreter.TableScanNode.createProjectableFilterable(TableScanNode.java:233)
      	at org.apache.calcite.interpreter.TableScanNode.create(TableScanNode.java:81)
      	at org.apache.calcite.interpreter.Nodes$CoreCompiler.visit(Nodes.java:69)
      	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.apache.calcite.util.ReflectUtil.invokeVisitorInternal(ReflectUtil.java:257)
      	at org.apache.calcite.util.ReflectUtil.invokeVisitor(ReflectUtil.java:214)
      	at org.apache.calcite.util.ReflectUtil$1.invokeVisitor(ReflectUtil.java:464)
      	at org.apache.calcite.interpreter.Interpreter$CompilerImpl.visit(Interpreter.java:451)
      	at org.apache.calcite.interpreter.Nodes$CoreCompiler.visit(Nodes.java:42)
      	at org.apache.calcite.interpreter.Interpreter$CompilerImpl.visitRoot(Interpreter.java:405)
      	at org.apache.calcite.interpreter.Interpreter.<init>(Interpreter.java:88)
      	at Baz.bind(Unknown Source)
      	at org.apache.calcite.jdbc.CalcitePrepare$CalciteSignature.enumerable(CalcitePrepare.java:355)
      	at org.apache.calcite.jdbc.CalciteConnectionImpl.enumerable(CalciteConnectionImpl.java:309)
      	at org.apache.calcite.jdbc.CalciteMetaImpl._createIterable(CalciteMetaImpl.java:506)
      	at org.apache.calcite.jdbc.CalciteMetaImpl.createIterable(CalciteMetaImpl.java:497)
      	at org.apache.calcite.avatica.AvaticaResultSet.execute(AvaticaResultSet.java:182)
      	at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:64)
      	at org.apache.calcite.jdbc.CalciteResultSet.execute(CalciteResultSet.java:43)
      	at org.apache.calcite.avatica.AvaticaConnection.executeQueryInternal(AvaticaConnection.java:573)
      	... 26 more
      Caused by: org.codehaus.janino.InternalCompilerException: Code of method "execute(Lorg/apache/calcite/interpreter/Context;[Ljava/lang/Object;)V" of class "Buzz" grows beyond 64 KB
      	at org.codehaus.janino.CodeContext.makeSpace(CodeContext.java:1048)
      	at org.codehaus.janino.CodeContext.write(CodeContext.java:925)
      	at org.codehaus.janino.UnitCompiler.writeByte(UnitCompiler.java:12275)
      	at org.codehaus.janino.UnitCompiler.load(UnitCompiler.java:11936)
      	at org.codehaus.janino.UnitCompiler.load(UnitCompiler.java:11926)
      	at org.codehaus.janino.UnitCompiler.compileGet2(UnitCompiler.java:4465)
      	at org.codehaus.janino.UnitCompiler.access$8000(UnitCompiler.java:215)
      	at org.codehaus.janino.UnitCompiler$16$1.visitLocalVariableAccess(UnitCompiler.java:4408)
      	at org.codehaus.janino.UnitCompiler$16$1.visitLocalVariableAccess(UnitCompiler.java:4400)
      	at org.codehaus.janino.Java$LocalVariableAccess.accept(Java.java:4274)
      	at org.codehaus.janino.UnitCompiler$16.visitLvalue(UnitCompiler.java:4400)
      	at org.codehaus.janino.UnitCompiler$16.visitLvalue(UnitCompiler.java:4396)
      	at org.codehaus.janino.Java$Lvalue.accept(Java.java:4148)
      	at org.codehaus.janino.UnitCompiler.compileGet(UnitCompiler.java:4396)
      	at org.codehaus.janino.UnitCompiler.compileGet2(UnitCompiler.java:4461)
      	at org.codehaus.janino.UnitCompiler.access$7500(UnitCompiler.java:215)
      	at org.codehaus.janino.UnitCompiler$16$1.visitAmbiguousName(UnitCompiler.java:4403)
      	at org.codehaus.janino.UnitCompiler$16$1.visitAmbiguousName(UnitCompiler.java:4400)
      	at org.codehaus.janino.Java$AmbiguousName.accept(Java.java:4224)
      	at org.codehaus.janino.UnitCompiler$16.visitLvalue(UnitCompiler.java:4400)
      	at org.codehaus.janino.UnitCompiler$16.visitLvalue(UnitCompiler.java:4396)
      	at org.codehaus.janino.Java$Lvalue.accept(Java.java:4148)
      	at org.codehaus.janino.UnitCompiler.compileGet(UnitCompiler.java:4396)
      	at org.codehaus.janino.UnitCompiler.compileGetValue(UnitCompiler.java:5662)
      	at org.codehaus.janino.UnitCompiler.compileBoolean2(UnitCompiler.java:4120)
      	at org.codehaus.janino.UnitCompiler.access$6600(UnitCompiler.java:215)
      	at org.codehaus.janino.UnitCompiler$14.visitBinaryOperation(UnitCompiler.java:3957)
      	at org.codehaus.janino.UnitCompiler$14.visitBinaryOperation(UnitCompiler.java:3935)
      	at org.codehaus.janino.Java$BinaryOperation.accept(Java.java:4864)
      	at org.codehaus.janino.UnitCompiler.compileBoolean(UnitCompiler.java:3935)
      	at org.codehaus.janino.UnitCompiler.compileBoolean2(UnitCompiler.java:4078)
      	at org.codehaus.janino.UnitCompiler.access$6600(UnitCompiler.java:215)
      	at org.codehaus.janino.UnitCompiler$14.visitBinaryOperation(UnitCompiler.java:3957)
      	at org.codehaus.janino.UnitCompiler$14.visitBinaryOperation(UnitCompiler.java:3935)
      	at org.codehaus.janino.Java$BinaryOperation.accept(Java.java:4864)
      

      Attachments

        1. calcite-stackoverflow.zip
          12 kB
          Dirk Mahler

        Issue Links

          Activity

            People

              Unassigned Unassigned
              dirk.mahler Dirk Mahler
              Votes:
              0 Vote for this issue
              Watchers:
              7 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 40m
                  1h 40m