[ http://issues.apache.org/jira/browse/DERBY-1329?page=all ] A B closed DERBY-1329: ----------------------
> 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, d1329.patch, d1329_10_1.patch > > 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
