NPE or assert for query with duplicate predicates and duplicate aliasing
------------------------------------------------------------------------
Key: DERBY-4242
URL: https://issues.apache.org/jira/browse/DERBY-4242
Project: Derby
Issue Type: Bug
Components: SQL
Affects Versions: 10.6.0.0
Reporter: Kristian Waagan
Priority: Minor
This case was reported by a user on derby-user:
http://www.nabble.com/FEHLER-XJ001%3A-Java-Ausnahme%3A-%27%3A-java.lang.NullPointerException%27.-td23636203.html
The original query and table definitions can be found in the mail from the
user. I managed to reduce it to the following query;
-- Reproduces problem
SELECT
POC_CNTNT.pln_ordr_id
FROM
POC_CNTNT,
PLN_ORDR,
POC as poc1,
POC as poc12,
POC as poc121,
POC as poc2,
POC_STRUCT
where
PLN_ORDR.pln_ordr_id = poc1.pln_ordr_id
and PLN_ORDR.pln_ordr_id = poc121.pln_ordr_id
and poc1.pln_ordr_id = POC_CNTNT.pln_ordr_id
and poc1.pln_ordr_id = POC_STRUCT.poc_struct_subj_pln_ordr_id
and poc121.pln_ordr_id = POC_STRUCT.poc_struct_obj_pln_ordr_id
and poc2.poc_ix = POC_CNTNT.poc_ix
and poc2.poc_ix = POC_CNTNT.poc_ix
;
I think this cooks down to the following query, which runs without errors:
SELECT
POC_CNTNT.pln_ordr_id
FROM
POC_CNTNT,
PLN_ORDR,
POC,
POC_STRUCT
where
PLN_ORDR.pln_ordr_id = POC.pln_ordr_id
and POC.pln_ordr_id = POC_CNTNT.pln_ordr_id
and POC.pln_ordr_id = POC_STRUCT.poc_struct_subj_pln_ordr_id
and POC.poc_ix = POC_CNTNT.poc_ix
;
It is clear that the original query, and the reduced query reproducing the
error, could be improved significantly. What remains to investigate, is whether
the error observed is indeed a weakness in Derby's SQL handling, and if it can
cause trouble for more general queries.
At first sight, it looks to me like Derby gets confused because of duplicate
aliases and predicates. I don't know what the expected behavior for such
queries is; fail (it is valid SQL though, right?), create a warning, compile
and perform badly, or compiled to a form where duplicate/unnecessarily clauses
are removed.
The stack trace with trunk (sane build) looks like this:
ERROR XJ001: Java exception: 'ASSERT FAILED ColumnReference for correct column
(columnPosition = 1, exposed table name = APP.POC_STRUCT) not found on either
side of BinaryRelationalOperator:
org.apache.derby.shared.common.sanity.AssertFailure'.
java.sql.SQLException: Java exception: 'ASSERT FAILED ColumnReference for
correct column (columnPosition = 1, exposed table name = APP.POC_STRUCT) not
found on either side of BinaryRelationalOperator:
org.apache.derby.shared.common.sanity.AssertFailure'.
at
org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:95)
at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:87)
at org.apache.derby.impl.jdbc.Util.javaException(Util.java:244)
at
org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:403)
at
org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:346)
at
org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2201)
at
org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:81)
at
org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:614)
at
org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:555)
at org.apache.derby.impl.tools.ij.ij.executeImmediate(ij.java:329)
at org.apache.derby.impl.tools.ij.utilMain.doCatch(utilMain.java:505)
at
org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(utilMain.java:347)
at org.apache.derby.impl.tools.ij.utilMain.go(utilMain.java:245)
at org.apache.derby.impl.tools.ij.Main.go(Main.java:210)
at org.apache.derby.impl.tools.ij.Main.mainCore(Main.java:177)
at org.apache.derby.impl.tools.ij.Main.main(Main.java:73)
at org.apache.derby.tools.ij.main(ij.java:59)
Caused by: java.sql.SQLException: Java exception: 'ASSERT FAILED
ColumnReference for correct column (columnPosition = 1, exposed table name =
APP.POC_STRUCT) not found on either side of BinaryRelationalOperator:
org.apache.derby.shared.common.sanity.AssertFailure'.
at
org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:45)
at
org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:119)
at
org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:70)
... 16 more
Caused by: org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED
ColumnReference for correct column (columnPosition = 1, exposed table name =
APP.POC_STRUCT) not found on either side of BinaryRelationalOperator
at
org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:162)
at
org.apache.derby.shared.common.sanity.SanityManager.THROWASSERT(SanityManager.java:147)
at
org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode.generateExpressionOperand(BinaryRelationalOperatorNode.java:488)
at
org.apache.derby.impl.sql.compile.Predicate.generateExpressionOperand(Predicate.java:670)
at
org.apache.derby.impl.sql.compile.PredicateList.generateSetColumn(PredicateList.java:3544)
at
org.apache.derby.impl.sql.compile.PredicateList.generateStartKey(PredicateList.java:3368)
at
org.apache.derby.impl.sql.compile.BaseJoinStrategy.fillInScanArgs1(BaseJoinStrategy.java:109)
at
org.apache.derby.impl.sql.compile.NestedLoopJoinStrategy.getScanArgs(NestedLoopJoinStrategy.java:248)
at
org.apache.derby.impl.sql.compile.FromBaseTable.getScanArguments(FromBaseTable.java:3449)
at
org.apache.derby.impl.sql.compile.FromBaseTable.generateResultSet(FromBaseTable.java:3139)
at
org.apache.derby.impl.sql.compile.FromBaseTable.generate(FromBaseTable.java:3066)
at
org.apache.derby.impl.sql.compile.ProjectRestrictNode.generateMinion(ProjectRestrictNode.java:1477)
at
org.apache.derby.impl.sql.compile.ProjectRestrictNode.generate(ProjectRestrictNode.java:1341)
at
org.apache.derby.impl.sql.compile.JoinNode.getJoinArguments(JoinNode.java:1579)
at
org.apache.derby.impl.sql.compile.JoinNode.generateCore(JoinNode.java:1555)
at
org.apache.derby.impl.sql.compile.JoinNode.generate(JoinNode.java:1479)
at
org.apache.derby.impl.sql.compile.ProjectRestrictNode.generateMinion(ProjectRestrictNode.java:1477)
at
org.apache.derby.impl.sql.compile.ProjectRestrictNode.generate(ProjectRestrictNode.java:1341)
at
org.apache.derby.impl.sql.compile.ScrollInsensitiveResultSetNode.generate(ScrollInsensitiveResultSetNode.java:109)
at
org.apache.derby.impl.sql.compile.CursorNode.generate(CursorNode.java:606)
at
org.apache.derby.impl.sql.compile.StatementNode.generate(StatementNode.java:347)
at
org.apache.derby.impl.sql.GenericStatement.prepMinion(GenericStatement.java:449)
at
org.apache.derby.impl.sql.GenericStatement.prepare(GenericStatement.java:88)
at
org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(GenericLanguageConnectionContext.java:822)
at
org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:606)
... 9 more
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.