You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "A B (JIRA)" <de...@db.apache.org> on 2006/05/16 21:06:06 UTC

[jira] Commented: (DERBY-1329) ASSERT failure/IndexOutOfBoundsException with correlated subquery for UPDATE ... SET ... WHERE CURRENT OF ... statement.

    [ http://issues.apache.org/jira/browse/DERBY-1329?page=comments#action_12412032 ] 

A B commented on DERBY-1329:
----------------------------

Just a note that it's also possible to reproduce this error using ij.  The following ij commands do the same thing as the attached Java program:

connect 'jdbc:derby:testDB;create=true';
CREATE TABLE BASICTABLE1(ID INTEGER, C3 CHAR(10));
CREATE TABLE BASICTABLE2(IID INTEGER, CC3 CHAR(10));
insert into BASICTABLE1 (C3, ID) values ('abc', 1);
insert into BASICTABLE2 (CC3, IID) values ('def', 1);
autocommit off;
get cursor c1 as 'select c3, id from basictable1 for update';
next c1;
update BASICTABLE1 set C3 = (SELECT CC3 FROM BASICTABLE2 WHERE BASICTABLE1.ID=BASICTABLE2.IID) where current of c1;

leads to:

ERROR XJ001: Java exception: 'ASSERT FAILED tableNumber is expected to be non-negative: org.apache.derby.shared.common.sanity.AssertFailure'.

> ASSERT failure/IndexOutOfBoundsException with correlated subquery for UPDATE ... SET ... WHERE CURRENT OF ... statement.
> ------------------------------------------------------------------------------------------------------------------------
>
>          Key: DERBY-1329
>          URL: http://issues.apache.org/jira/browse/DERBY-1329
>      Project: Derby
>         Type: Bug

>   Components: SQL
>     Versions: 10.0.2.0, 10.0.2.1, 10.1.1.0, 10.2.0.0, 10.1.2.0, 10.1.1.1, 10.1.1.2, 10.1.2.1, 10.1.2.2, 10.1.2.3, 10.1.2.4
>     Reporter: A B
>     Assignee: A B
>     Priority: Minor
>      Fix For: 10.2.0.0, 10.1.3.0
>  Attachments: d1329.java
>
> If in a statement of the form "UPDATE ... SET ... WHERE CURRENT OF ..." the SET clause includes a correlated subquery that has a predicate referencing the table that is being updated, Derby will fail with an ASSERT failure in sane mode and an IndexOutOfBounds exception in insane mode.
> For example, if we have a cursor CUR1 for the results of a SELECT query on BASICTABLE1, and then we try to execute the following update statement:
> update BASICTABLE1 set C3 = (SELECT CC3 FROM
>   BASICTABLE2 WHERE BASICTABLE1.ID=BASICTABLE2.IID) 
> where current of CUR1
> the result in SANE mode will be:
> org.apache.derby.shared.common.sanity.AssertFailure: ASSERT FAILED tableNumber is expected to be non-negative.
> and in INSANE mode will be:
> java.lang.IndexOutOfBoundsException: bitIndex < 0: -1
> The failure occurs during preprocessing of the subquery node when Derby is trying to "categorize" a predicate to see if it is pushable.  The exact code is in ColumnReference.categorize():
>   public boolean categorize(JBitSet referencedTabs, boolean simplePredsOnly)
>   {
>     if (SanityManager.DEBUG)
>       SanityManager.ASSERT(tableNumber >= 0,
>          "tableNumber is expected to be non-negative");
>     referencedTabs.set(tableNumber);
>     return ( ! replacesAggregate ) &&
>         ( (source.getExpression() instanceof ColumnReference) ||
>         (source.getExpression() instanceof VirtualColumnNode) ||
>         (source.getExpression() instanceof ConstantNode));
>   }
> We get to this code for a ColumnReference who's tableNumber is -1, which means that, in sane mode, the assert will fire; in insane mode, we'll call "referencedTabs.set()" passing in a -1, which leads to the IndexOutOfBoundsException.
> This failure occurs in embedded and with both clients, and occurs in 10.0, 10.1, and the 10.2 trunk.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira