db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Rick Hillegas (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (DERBY-6346) NPE in left join whose inner table has a generated column
Date Tue, 17 Sep 2013 16:58:51 GMT

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

Rick Hillegas updated DERBY-6346:

    Attachment: derby-6346-02-aa-generateNullForLeftJoins.diff

Attaching derby-6346-02-aa-generateNullForLeftJoins.diff. This patches the code generator
so that it doesn't skip creating NULL values for generated columns on the inner side of a
LEFT JOIN. I am running tests now.

The NPE occurs because the empty right row of the LEFT JOIN contains a Java null rather than
a NULL DataValueDescriptor. This happens because of a bug in the code-generation of ResultColumnLists
when generating code for generated columns. That, in turn, happens because the code-generation
of generated columns happens elsewhere for INSERT and UPDATE statements. The fix is to try
to distinguish a ResultColumnList for a SELECT from a ResultColumnList for an INSERT/UPDATE.
If the ResultColumnList is for a SELECT, then we code-generate a NULL DataValueDescriptor
for the generated column. Otherwise, we don't.

The test for whether the ResultColumnList represents a SELECT is to check whether the ResultColumn's
source expression is a VirtualColumnNode. This is tricky and brittle. This check can be improved
if someone has a better suggestion for how to distinguish the two kinds of lists.

Touches the following files:


M       java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java

The fix.


M       java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsTest.java

Adds a regression test case for this bug.

> NPE in left join whose inner table has a generated column
> ---------------------------------------------------------
>                 Key: DERBY-6346
>                 URL: https://issues.apache.org/jira/browse/DERBY-6346
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions:
>            Reporter: Rick Hillegas
>         Attachments: derby-6346-01-aa-logJavaException.diff, derby-6346-02-aa-generateNullForLeftJoins.diff
> Derby trips over an NPE while processing a left join whose inner table has a generated
column. The NPE is not printed to derby.log, indicating another problem. The bug goes as far
back as, the release which introduced generated columns. The NPE does NOT crash the
connection. The application can continue issuing statements on the connection.
> The following script shows this problem:
> connect 'jdbc:derby:memory:db;create=true';
> create table t1( c1 int, c2 int generated always as ( -c1 ) );
> create table t2( c1 int );
> insert into t1( c1 ) values ( 2 ), ( 20 );
> insert into t2( c1 ) values ( 2 ), ( 200 );
> -- raises a SQLException wrapping an NPE
> select * from t2 left join t1 on t1.c1 = t2.c1;

This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

View raw message