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

[jira] [Commented] (CALCITE-2792) Stackoverflow while evaluating filter with large number of OR conditions

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

Dirk Mahler commented on CALCITE-2792:
--------------------------------------

A project has been attached containing a class StackOverflowTest demonstrating the issue.

> Stackoverflow while evaluating filter with large number of OR conditions
> ------------------------------------------------------------------------
>
>                 Key: CALCITE-2792
>                 URL: https://issues.apache.org/jira/browse/CALCITE-2792
>             Project: Calcite
>          Issue Type: Bug
>          Components: core
>    Affects Versions: 1.18.0
>            Reporter: Dirk Mahler
>            Assignee: Julian Hyde
>            Priority: Major
>         Attachments: calcite-stackoverflow.zip
>
>
> As a workaround for CALCITE-2696 we're currently using OR conditions for filtering values, e.g. instead of
> {noformat}
> ... WHERE value2 IN (1,2,3)
> {noformat}
> {noformat}
> ... WHERE value2=1 OR value2=2 OR value2=3
> {noformat}
> 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:
> {noformat}
> 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)
> ...
> {noformat}
> We tried to increase the stack size of the virtual machine (-Xss8000k) but this leads to a problem with Janino:
> {noformat}
> 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)
> {noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)