db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Knut Anders Hatlen (JIRA)" <j...@apache.org>
Subject [jira] Updated: (DERBY-4585) IndexChanger.doDelete throws NullPointerException
Date Tue, 30 Mar 2010 11:14:27 GMT

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

Knut Anders Hatlen updated DERBY-4585:
--------------------------------------

    Attachment: fix.diff

The problem seems to be related to the caching of updatable index scans in the activation
(the NPE happens because the cached scan is null). The field that holds the cached scan is
initialized by TableScanResultSet.openCore() if, and only if, the scan is updatable and uses
an index. However, TableScanResultSet.close() unconditionally clears the information. So if
a statement execution plan has one updatable index scan and one non-updatable scan, closing
the non-updatable scan may clear information needed by the still open updatable scan.

The attached patch ensures that TableScanResultSet.close() only clears index scan information
from the activation if it had cached information there itself. This made the NPE go away.
The patch does not include any tests, and I have not run any of the regression tests with
it yet.

(By the way, I don't think this problem was introduced with DERBY-3301, but it probably made
the optimizer pick a different plan (it changed how nested IN/EXISTS queries where flattened,
I think) that made the problem surface. It may be possible to come up with a case that fails
before DERBY-3301 too.)

> IndexChanger.doDelete throws NullPointerException
> -------------------------------------------------
>
>                 Key: DERBY-4585
>                 URL: https://issues.apache.org/jira/browse/DERBY-4585
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.5.3.0
>         Environment: Various operating systems, Java 1.6.0_18
>            Reporter: Martin Keller
>            Assignee: Knut Anders Hatlen
>             Fix For: 10.3.3.0, 10.4.1.3, 10.4.2.0, 10.5.1.1, 10.5.2.0, 10.5.3.0, 10.6.0.0
>
>         Attachments: derby-4585.tar.gz, fix.diff, repro.sql, repro.zip
>
>
> After a bunch of DELETE and DROP-Commands, the following error occurs in our application:
> 2010-03-16 12:54:23.070 GMT Thread[DRDAConnThread_4,5,derby.daemons] (XID = 15898), (SESSIONID
= 1), (DATABASE = ixintrexx), (DRDAID = NF000001.PAA8-4469821361421447518{2}), Cleanup action
starting
> 2010-03-16 12:54:23.070 GMT Thread[DRDAConnThread_4,5,derby.daemons] (XID = 15898), (SESSIONID
= 1), (DATABASE = ixintrexx), (DRDAID = NF000001.PAA8-4469821361421447518{2}), Failed Statement
is: DELETE FROM LCAPPCHILDCONTROLTITLE WHERE STRCHILDCONTROLGUID IN (SELECT STRGUID FROM LCAPPCHILDCONTROL
WHERE STRAPPCONTROLDRGUID IN (SELECT A.STRGUID FROM LCAPPCONTROLDR A, LCAPPFUP B WHERE A.STRAPPFUPGUID
= B.STRGUID AND B.STRAPPGUID = '93A720B90BB6C25703701E67D0DA75220B7D2FFC'))
> java.lang.NullPointerException
> 	at org.apache.derby.impl.sql.execute.IndexChanger.doDelete(IndexChanger.java:369)
> 	at org.apache.derby.impl.sql.execute.IndexChanger.delete(IndexChanger.java:544)
> 	at org.apache.derby.impl.sql.execute.IndexSetChanger.delete(IndexSetChanger.java:250)
> 	at org.apache.derby.impl.sql.execute.RowChangerImpl.deleteRow(RowChangerImpl.java:476)
> 	at org.apache.derby.impl.sql.execute.DeleteResultSet.collectAffectedRows(DeleteResultSet.java:405)
> 	at org.apache.derby.impl.sql.execute.DeleteResultSet.open(DeleteResultSet.java:137)
> 	at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(GenericPreparedStatement.java:416)
> 	at org.apache.derby.impl.sql.GenericPreparedStatement.execute(GenericPreparedStatement.java:297)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(EmbedStatement.java:1235)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.execute(EmbedStatement.java:625)
> 	at org.apache.derby.impl.jdbc.EmbedStatement.executeUpdate(EmbedStatement.java:175)
> 	at org.apache.derby.impl.drda.DRDAConnThread.parseEXCSQLIMM(DRDAConnThread.java:5022)
> 	at org.apache.derby.impl.drda.DRDAConnThread.processCommands(DRDAConnThread.java:750)
> 	at org.apache.derby.impl.drda.DRDAConnThread.run(DRDAConnThread.java:290)
> Cleanup action completed
> The database seems to be corrupt, after this exception has been thrown.
> As you can see, I already compiled Derby to get the line number where the error occurs.
I must apologize for not having a sufficient test case yet, but the code leading to this issue
is very complex. If one wants to reproduce this bug, I can send a download link for our product
and instructions to reproduce the problem.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message