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

Rick Hillegas updated DERBY-5554:
---------------------------------

    Attachment: derby-5554-04-ab-remapVTIarg.diff

Attaching derby-5554-04-ab-remapVTIarg.diff, a second approach to fixing 
Bryan's query. I am running regression tests now.

The second approach code generates a reference to the result column in the 
SYSTABLES base table rather than to a column in a node above it. I am not 
thrilled by the complexity of this solution and I think that it may not be as 
general as the first approach of forcing the VTI to an inner slot in the join 
order. For instance, it may be possible to cook up elaborate queries which 
still fail because the VTI joins to the output of joined tables or subqueries 
in the FROM list.

On balance, I think this is a better approach because it fixes a code generator 
problem in the code generator. I'm reluctant to spend more time coming up with 
a better fix since we want to discourage use of this kind of join.

The fix is to have the base tables tell the VTI where their rows are. I could 
not find an easy way to dig up this information in the existing context 
available to the code generator. So I added a new method and piece of state to 
FromVTI for tracking this information.

Touches the following files:

-----------

M       java/engine/org/apache/derby/impl/sql/compile/FromVTI.java
M       java/engine/org/apache/derby/impl/sql/compile/FromBaseTable.java

Base tables give the location of their result rows to FromVTIs at code 
generation time.

-----------

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

Adds Bryan's query as a test case.

                
> NullPointerException in generated VTI code
> ------------------------------------------
>
>                 Key: DERBY-5554
>                 URL: https://issues.apache.org/jira/browse/DERBY-5554
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.3.1.4, 10.4.1.3, 10.5.1.1, 10.6.1.0, 10.7.1.1, 
> 10.8.2.2
>            Reporter: Bryan Pendleton
>              Labels: derby_triage10_9
>         Attachments: derby-5554-01-aa-addTableIDcolumn.diff, 
> derby-5554-01-ab-addTableIDcolumn.diff, 
> derby-5554-02-aa-0argConstructor.diff, 
> derby-5554-03-aa-forbidVTItoVTIjoins.diff, 
> derby-5554-04-aa-forceVTIAfterJoin.diff, derby-5554-04-ab-remapVTIarg.diff, 
> releaseNote.html, releaseNote.html
>
>
> With the latest 10.8.2.2 binary distribution, the following short script 
> produces a NullPointerException:
> java -Dij.exceptionTrace=true org.apache.derby.tools.ij
> ij> connect 'jdbc:derby:brydb;create=true';
> ij> create table t1 (a int);
> ij> SELECT T2.*, systabs.*, syscgs.conglomeratenumber
>     FROM 
>         SYS.SYSTABLES systabs, sys.sysconglomerates syscgs,
>         TABLE (SYSCS_DIAG.SPACE_TABLE(systabs.tablename)) AS T2
>     WHERE systabs.tabletype = 'T' and systabs.tableid = syscgs.tableid;
> The exception trace is pasted below:
> ERROR 38000: The exception 'java.lang.NullPointerException' was thrown while 
> evaluating an expression.
> java.sql.SQLException: The exception 'java.lang.NullPointerException' was 
> thrown while evaluating an expression.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.seeNextException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
>       at org.apache.derby.impl.tools.ij.ij.executeImmediate(Unknown Source)
>       at org.apache.derby.impl.tools.ij.utilMain.doCatch(Unknown Source)
>       at org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(Unknown Source)
>       at org.apache.derby.impl.tools.ij.utilMain.go(Unknown Source)
>       at org.apache.derby.impl.tools.ij.Main.go(Unknown Source)
>       at org.apache.derby.impl.tools.ij.Main.mainCore(Unknown Source)
>       at org.apache.derby.impl.tools.ij.Main.main(Unknown Source)
>       at org.apache.derby.tools.ij.main(Unknown Source)
> Caused by: java.sql.SQLException: The exception 
> 'java.lang.NullPointerException' was thrown while evaluating an expression.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
>  Source)
>       ... 18 more
> Caused by: java.sql.SQLException: Java exception: ': 
> java.lang.NullPointerException'.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
>  Source)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown 
> Source)
>       ... 15 more
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.derby.exe.acf81e0010x0134x6972x0511x0000033820000.g0(Unknown 
> Source)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:616)
>       at org.apache.derby.impl.services.reflect.ReflectMethod.invoke(Unknown 
> Source)
>       at org.apache.derby.impl.sql.execute.VTIResultSet.openCore(Unknown 
> Source)
>       at org.apache.derby.impl.sql.execute.JoinResultSet.openRight(Unknown 
> Source)
>       at org.apache.derby.impl.sql.execute.JoinResultSet.openCore(Unknown 
> Source)
>       at org.apache.derby.impl.sql.execute.JoinResultSet.openCore(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.open(Unknown Source)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
>       at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown 
> Source)
>       ... 11 more
> ERROR XJ001: Java exception: ': java.lang.NullPointerException'.
> java.sql.SQLException: Java exception: ': java.lang.NullPointerException'.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
>       at org.apache.derby.impl.jdbc.Util.javaException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown 
> Source)
>       at 
> org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown 
> Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
>       at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
>       at org.apache.derby.impl.tools.ij.ij.executeImmediate(Unknown Source)
>       at org.apache.derby.impl.tools.ij.utilMain.doCatch(Unknown Source)
>       at org.apache.derby.impl.tools.ij.utilMain.runScriptGuts(Unknown Source)
>       at org.apache.derby.impl.tools.ij.utilMain.go(Unknown Source)
>       at org.apache.derby.impl.tools.ij.Main.go(Unknown Source)
>       at org.apache.derby.impl.tools.ij.Main.mainCore(Unknown Source)
>       at org.apache.derby.impl.tools.ij.Main.main(Unknown Source)
>       at org.apache.derby.tools.ij.main(Unknown Source)
> Caused by: java.sql.SQLException: Java exception: ': 
> java.lang.NullPointerException'.
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
>       at 
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
>  Source)
>       ... 19 more
> Caused by: java.lang.NullPointerException
>       at 
> org.apache.derby.exe.acf81e0010x0134x6972x0511x0000033820000.g0(Unknown 
> Source)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:616)
>       at org.apache.derby.impl.services.reflect.ReflectMethod.invoke(Unknown 
> Source)
>       at org.apache.derby.impl.sql.execute.VTIResultSet.openCore(Unknown 
> Source)
>       at org.apache.derby.impl.sql.execute.JoinResultSet.openRight(Unknown 
> Source)
>       at org.apache.derby.impl.sql.execute.JoinResultSet.openCore(Unknown 
> Source)
>       at org.apache.derby.impl.sql.execute.JoinResultSet.openCore(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.openCore(Unknown 
> Source)
>       at 
> org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.open(Unknown Source)
>       at 
> org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Unknown Source)
>       at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown 
> Source)
>       ... 11 more

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to