[
https://issues.apache.org/jira/browse/DERBY-6750?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14163520#comment-14163520
]
Ralf Menzel commented on DERBY-6750:
------------------------------------
I looked at the source code for {{ColumnReference.getSourceResultSet}} and I
think I found a problem that contributes to the bug. The method contains two
nested while loops. In the inner loop there is a comment "Break out of both
loops and return null since there is no source result set", but after the
comment there is only a plain break statement, which only breaks out of the
inner loop.
When I place a label before the outer loop and replace the plain break with a
break with the label, the optimizer no longer hangs for the examples. But
instead it then produces an error:
{{ERROR XJ001: Java exception: 'ASSERT FAILED Failed to find source result set
when trying to scope column reference 'Q4.X:
org.apache.derby.shared.common.sanity.AssertFailure'.}}
> Query parsing seems to hang forever in ColumnReference.getSourceResultSet
> -------------------------------------------------------------------------
>
> Key: DERBY-6750
> URL: https://issues.apache.org/jira/browse/DERBY-6750
> Project: Derby
> Issue Type: Bug
> Components: SQL
> Affects Versions: 10.11.1.1
> Reporter: Ralf Menzel
>
> We have an application that programmatically generates queries. For some
> queries the call of Connection.prepareStatement never returns. I took one of
> these queries and simplified until I got the following query:
> SELECT * FROM (
> SELECT 1 AS X FROM SYSIBM.SYSDUMMY1
> ) Q1 NATURAL JOIN (
> SELECT X FROM (
> SELECT 1 AS X FROM SYSIBM.SYSDUMMY1
> ) Q2 UNION SELECT X FROM (
> SELECT 2 AS X FROM SYSIBM.SYSDUMMY1
> ) Q3
> ) Q4;
> When I execute this query with ij it never produces a result.
> A typical stack trace of our application when it hangs starts like this:
> java.lang.Exception: test timed out after 250 milliseconds
> at
> org.apache.derby.impl.sql.compile.ColumnReference.getSourceResultSet(Unknown
> Source)
> at
> org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode.getScopedOperand(Unknown
> Source)
> at
> org.apache.derby.impl.sql.compile.Predicate.getPredScopedForResultSet(Unknown
> Source)
> at
> org.apache.derby.impl.sql.compile.SetOperatorNode.pushOptPredicate(Unknown
> Source)
> at org.apache.derby.impl.sql.compile.UnionNode.optimizeIt(Unknown
> Source)
> at
> org.apache.derby.impl.sql.compile.ProjectRestrictNode.optimizeIt(Unknown
> Source)
> at
> org.apache.derby.impl.sql.compile.OptimizerImpl.costPermutation(Unknown
> Source)
> at org.apache.derby.impl.sql.compile.SelectNode.optimize(Unknown Source)
> at
> org.apache.derby.impl.sql.compile.ProjectRestrictNode.optimizeIt(Unknown
> Source)
> at
> org.apache.derby.impl.sql.compile.OptimizerImpl.costPermutation(Unknown
> Source)
> at org.apache.derby.impl.sql.compile.SelectNode.optimize(Unknown Source)
> at
> org.apache.derby.impl.sql.compile.DMLStatementNode.optimizeStatement(Unknown
> Source)
> at
> org.apache.derby.impl.sql.compile.CursorNode.optimizeStatement(Unknown Source)
> at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
> at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
> at
> org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedPreparedStatement40.<init>(Unknown
> Source)
> at org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown
> Source)
> ...
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)