db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "A B (JIRA)" <derby-...@db.apache.org>
Subject [jira] Created: (DERBY-1329) ASSERT failure/IndexOutOfBoundsException with correlated subquery for UPDATE ... SET ... WHERE CURRENT OF ... statement.
Date Tue, 16 May 2006 18:19:07 GMT
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
 Assigned to: A B 
    Priority: Minor
     Fix For: 10.2.0.0, 10.1.3.0


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


Mime
View raw message