[ 
https://issues.apache.org/jira/browse/DERBY-6786?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Johannes Stadler updated DERBY-6786:
------------------------------------
    Attachment: acaaeec04ex014axaa2ex076bx000000c72a081.java
                repro.sql

Steps to reproduce and decompiled generated method.

> NullPointerException in INSERT INTO statement with multiple subselects
> ----------------------------------------------------------------------
>
>                 Key: DERBY-6786
>                 URL: https://issues.apache.org/jira/browse/DERBY-6786
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.5.1.1, 10.8.2.2, 10.9.1.0, 10.10.1.1, 10.11.1.1
>         Environment: not relevant, but tested under Windows 7 32bit, Windows 
> Server 2008 64bit, Java 6 and Java 7.
>            Reporter: Johannes Stadler
>              Labels: NullPointerException
>         Attachments: acaaeec04ex014axaa2ex076bx000000c72a081.java, repro.sql
>
>
> Hello,
> I'm getting this wrapped NullPointerException when I try to execute an INSERT 
> INTO SQL statement:
> java.sql.SQLException: The exception 'java.lang.NullPointerException' was 
> thrown while evaluating an expression.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:101)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:148)
>       at org.apache.derby.impl.jdbc.Util.seeNextException(Util.java:349)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:431)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(TransactionResourceImpl.java:353)
>       at 
> org.apache.derby.impl.jdbc.EmbedConnection.handleException(EmbedConnection.java:2400)
>       at 
> org.apache.derby.impl.jdbc.ConnectionChild.handleException(ConnectionChild.java:85)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1437)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:711)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.executeLargeUpdate(EmbedStatement.java:190)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(EmbedStatement.java:179)
>       at 
> de.foconis.dakobp.unittests.div.TestMain.testNullpointer(TestMain.java:49)
>       at de.foconis.dakobp.unittests.div.TestMain.main(TestMain.java:28)
> Caused by: java.sql.SQLException: The exception 
> 'java.lang.NullPointerException' was thrown while evaluating an expression.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:42)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:125)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:71)
>       ... 12 more
> Caused by: java.sql.SQLException: Java exception: ': 
> java.lang.NullPointerException'.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(SQLExceptionFactory.java:42)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(SQLExceptionFactory40.java:125)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:71)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Util.java:148)
>       at org.apache.derby.impl.jdbc.Util.javaException(Util.java:370)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(TransactionResourceImpl.java:436)
>       ... 10 more
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.derby.exe.acf81e0010x014axa9c2x46e6x000000c6dc781.e2(Unknown 
> Source)
>       at 
> org.apache.derby.impl.services.reflect.DirectCall.invoke(ReflectGeneratedClass.java:105)
>       at 
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(ProjectRestrictResultSet.java:275)
>       at 
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(ProjectRestrictResultSet.java:263)
>       at 
> org.apache.derby.impl.sql.execute.DMLWriteResultSet.getNextRowCore(DMLWriteResultSet.java:127)
>       at 
> org.apache.derby.impl.sql.execute.InsertResultSet.open(InsertResultSet.java:519)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:461)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:340)
>       at 
> org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1344)
>       ... 5 more
> Most likely this bug has already been reported as DERBY-5041, which has 
> already been closed (although I don't use a GROUP BY clause).
> The original statement is quite complex and partially generated, but the 
> error can be reproduced easily, using a statement as simple as this:
> insert into t
>  select erg.* from (
>   select d1.s from (select k,s from k1) as d1
>    right join (select k,s from k2) as d2 on d1.k = d2.k
>   ) as erg
>  where s > 10
> I will attach the file "repro.sql", containing all SQL statements required to 
> reproduce it (including the CREATE TABLEs).
> These are my investigation results:
> Conditions
> -------------
> 1. the outermost statement must NOT be a SELECT (e. g. INSERT)
> 2. there has to be a outer join in the subselect, where at least one dataset 
> has no join partner
> 3. an outer SELECT must have a restriction (WHERE clause) and access a column 
> from the table, that did not have a join partner
> Error state
> -------------
> The NullPointer occurs inside a generated class. So i enabled the Debug 
> Option "DumpClassFile", to get the generated class file (the decompiled java 
> class file will also be appended).
> The method "e2", stated in the StackTrace, performs the restrction "where s > 
> 10". Therefore it calls getColumnFromRow() with its resultSetNumber.
> This is where the error occurs: there is no "current row" available. 
> Precisely, the "row" property of the activation class at the specified index 
> (which is the resultSetNumber=3 in this example) is not set.
> It gets a bit complicated now, I will try to explain it, starting with the 
> generated resultset hierarchy.
> This tree of resultset implementations is generated to perform the query:
> Implementation                                resultSetNumber
> -------------------                           ---------------------
> InsertResultSet                       -> none
>  ProjectRestrictResultSet             -> 5
>   ProjectRestrictResultSet    -> 4
>    HashLeftOuterJoinResultSet -> 0
>     TableScanResultSet                -> 1
>     HashTableResultSet                -> 3
>      TableScanResultSet               -> 2
> The HashTableResultSet, which got the resultSetNumber 3 doesn't set a current 
> row, because there is no join partner (still everything correct). But the 
> ProjectRestrictResultSet on position 4 uses the restriction method ("e2"), 
> which accesses a column on resultSetNumber 3 -> error.
> As far as I can tell, a restriction must never relate to the source of an 
> outer join ResultSet. The numeration error does not occur, if the outermost 
> statement is a SELECT and the numeration is generated top-down.
> Unfortunately I couldn't find an easy solution for this problem. In my case, 
> this is a critical bug, because changing the query as workaround is 
> difficult, since parts of it are generated. Please note, that this error is 
> not dependent on any environment settings or platform and occured with all of 
> the abolve mentioned versions. I didn't test the versions from 10.6 to 10.7, 
> but probably those are also affected.
> If you require any further information, please let me know. I'm able to 
> perform a build, so I wouldn't need a full version, a patch would be 
> sufficient.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to