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 "Mamta A. Satoor (JIRA)" <ji...@apache.org> on 2008/10/07 18:30:44 UTC

[jira] Commented: (DERBY-3872) NullPoinerException thrown when INTEGER function used as a predicate in a WHERE clause of a SELECT .. GROUP BY .. HAVING statement

    [ https://issues.apache.org/jira/browse/DERBY-3872?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12637536#action_12637536 ] 

Mamta A. Satoor commented on DERBY-3872:
----------------------------------------

I did code walk through during the code generation phase of the above query. Different resultsets and columns get their RSNs assigned to them during the code generation phase.

The stack trace below shows when the column belonging to HAVING clause indirectly gets the RSN 3 assigned to it.
Thread [main] (Suspended (breakpoint at line 413 in ResultColumn))	
	ResultColumn.setResultSetNumber(int) line: 413	
	ResultColumnList.setResultSetNumber(int) line: 2141	
	FromBaseTable(ResultSetNode).assignResultSetNumber() line: 213	
	FromBaseTable.generateResultSet(ExpressionClassBuilder, MethodBuilder) line: 3098	
	FromBaseTable.generate(ActivationClassBuilder, MethodBuilder) line: 3065	
	ProjectRestrictNode.generateMinion(ExpressionClassBuilder, MethodBuilder, boolean) line: 1385	
	ProjectRestrictNode.generate(ActivationClassBuilder, MethodBuilder) line: 1336	
	JoinNode.getJoinArguments(ActivationClassBuilder, MethodBuilder, ValueNode) line: 1577	
	JoinNode.generateCore(ActivationClassBuilder, MethodBuilder, int, ValueNode, SubqueryList) line: 1555	
	JoinNode.generate(ActivationClassBuilder, MethodBuilder) line: 1479	
	ProjectRestrictNode.generateMinion(ExpressionClassBuilder, MethodBuilder, boolean) line: 1472	
	ProjectRestrictNode.generate(ActivationClassBuilder, MethodBuilder) line: 1336	
	GroupByNode.generate(ActivationClassBuilder, MethodBuilder) line: 1013	
	ProjectRestrictNode.generateMinion(ExpressionClassBuilder, MethodBuilder, boolean) line: 1472	
	ProjectRestrictNode.generate(ActivationClassBuilder, MethodBuilder) line: 1336	
	ScrollInsensitiveResultSetNode.generate(ActivationClassBuilder, MethodBuilder) line: 109	
	CursorNode.generate(ActivationClassBuilder, MethodBuilder) line: 564	
	CursorNode(StatementNode).generate(ByteArray) line: 347	
	GenericStatement.prepMinion(LanguageConnectionContext, boolean, Object[], SchemaDescriptor, boolean) line: 447	
	GenericStatement.prepare(LanguageConnectionContext, boolean) line: 88	
	GenericLanguageConnectionContext.prepareInternalStatement(SchemaDescriptor, String, boolean, boolean) line: 796	
	EmbedStatement40(EmbedStatement).execute(String, boolean, boolean, int, int[], String[]) line: 606	
	EmbedStatement40(EmbedStatement).execute(String) line: 555	
	ij.executeImmediate(String) line: 329	
	utilMain.doCatch(String) line: 508	
	utilMain.runScriptGuts() line: 350	
	utilMain.go(LocalizedInput[], LocalizedOutput, Properties) line: 248	
	Main.go(LocalizedInput, LocalizedOutput, Properties) line: 215	
	Main.mainCore(String[], Main) line: 181	
	Main.main(String[]) line: 73	
	ij.main(String[]) line: 59	

The stack trace above is handling the first part of the use query(the first part is shown below)
select q1."DEPTNO" from DEPTTAB q1, EMPTAB q2 -- DERBY-PROPERTIES joinStrategy = HASH 
where ( q2."DEPT_DEPTNO" = q1."DEPTNO") 
GROUP BY q1."DEPTNO" 
Note that we are not dealing with the HAVING clause at all at this point in the stack trace but the problem arises from the fact that the ResultColumn associated with the HAVING clause is the same object that is associated with the join node. Because of that, even though we are setting the RSN number 3 for the join node column, the ResultColumn associated with the HAVING clause ends up getting the same RSN 3 associated with it. I have tried to show below how different language ResultSet and column objects are associated with the entire user query
this	org.apache.derby.impl.sql.compile.ProjectRestrictNode  (id=192)	
   childResult	org.apache.derby.impl.sql.compile.GroupByNode  (id=156)	
      childResult	org.apache.derby.impl.sql.compile.ProjectRestrictNode  (id=151)	
         childResult	org.apache.derby.impl.sql.compile.JoinNode  (id=221)	
            leftResultSet	org.apache.derby.impl.sql.compile.ProjectRestrictNode  (id=233)	
               childResult	org.apache.derby.impl.sql.compile.FromBaseTable  (id=241)	
                  resultColumns	org.apache.derby.impl.sql.compile.ResultColumnList  (id=317)	
                     v	java.util.Vector<E>  (id=2084)	
                        elementCount	1	
                        elementData	java.lang.Object[10]  (id=2089)	
                           [0]	org.apache.derby.impl.sql.compile.ResultColumn  (id=218)	
   restriction	org.apache.derby.impl.sql.compile.AndNode  (id=98)	
      leftOperand	org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode  (id=85)	
         rightOperand	org.apache.derby.impl.sql.compile.SubqueryNode  (id=93)	
            resultSet	org.apache.derby.impl.sql.compile.ProjectRestrictNode  (id=135)	
               childResult	org.apache.derby.impl.sql.compile.ProjectRestrictNode  (id=121)	
                  childResult	org.apache.derby.impl.sql.compile.IndexToBaseRowNode  (id=193)	
                     source	org.apache.derby.impl.sql.compile.FromBaseTable  (id=195)	
                        restrictionList	org.apache.derby.impl.sql.compile.PredicateList  (id=196)	
                           v	java.util.Vector<E>  (id=198)	
                              elementCount	1	
                              elementData	java.lang.Object[10]  (id=200)	
                                 [0]	org.apache.derby.impl.sql.compile.Predicate  (id=212)	
                                    andNode	org.apache.derby.impl.sql.compile.AndNode  (id=120)	
                                       leftOperand	org.apache.derby.impl.sql.compile.BinaryRelationalOperatorNode  (id=89)	
                                          rightOperand	org.apache.derby.impl.sql.compile.ColumnReference  (id=124)	
                                             columnName	"DEPTNO"	
                                             source	org.apache.derby.impl.sql.compile.ResultColumn  (id=218)		

In the object association above, if you search for string id=218, you will find that ResultColumn object with id=218 is hanging off the SubqueryNode as well as the JoinNode. I think this is the cause of the problem. 

> NullPoinerException thrown when INTEGER function used as a predicate in a WHERE clause of a SELECT .. GROUP BY ..  HAVING statement
> -----------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3872
>                 URL: https://issues.apache.org/jira/browse/DERBY-3872
>             Project: Derby
>          Issue Type: Bug
>    Affects Versions: 10.3.3.0
>            Reporter: Stan Bradbury
>            Assignee: Mamta A. Satoor
>         Attachments: NPE_Reproduction.sql, QueryWithoutTruePred.out, QueryWithTruePred.out
>
>
> Use attached SQL script to create two tables , execute the following SQL and throw the exception and stack trace below.  NOTE:  removing the 'always true' clause '.. ( integer (1.1) = 1) .." from the SQL and the query does not fail.  Releated??
> select  q1."DEPTNO" from DEPTTAB q1, EMPTAB q2 where  ( integer (1.1) = 1)  and  ( q2."DEPT_DEPTNO" =  q1."DEPTNO")  
> GROUP BY q1."DEPTNO" 
> HAVING  max( q2."SALARY") >=  ( select  q3."SALARY" from EMPTAB q3 where  ( q3."EMPID" =  q1."DEPTNO") ) 
> ERROR 38000: The exception 'java.lang.NullPointerException' was thrown while evaluating an expression.
> . . .derby.iapi.error.StandardException.newException
> . . .derby.iapi.error.StandardException.unexpectedUserException
> . . .derby.impl.services.reflect.DirectCall.invoke
> . . .derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore
> . . .derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow
> . . .derby.impl.jdbc.EmbedResultSet.movePosition
> . . .derby.impl.jdbc.EmbedResultSet.next
> . . .derby.tools.JDBCDisplayUtil.indent_DisplayResults
> . . .derby.tools.JDBCDisplayUtil.indent_DisplayResults
> . . .derby.tools.JDBCDisplayUtil.indent_DisplayResults
> . . .derby.tools.JDBCDisplayUtil.DisplayResults
> . . .derby.impl.tools.ij.utilMain.displayResult
> . . .derby.impl.tools.ij.utilMain.doCatch
> . . .derby.impl.tools.ij.utilMain.runScriptGuts
> . . .derby.impl.tools.ij.utilMain.go
> . . .derby.impl.tools.ij.Main.go
> . . .derby.impl.tools.ij.Main.mainCore
> . . .derby.impl.tools.ij.Main14.main
> . . .derby.tools.ij.main
> Caused by: java.lang.NullPointerException
> . . .derby.iapi.types.NumberDataType.compare
> . . .derby.impl.store.access.btree.ControlRow.compareIndexRowFromPageToKey
> . . .derby.impl.store.access.btree.ControlRow.searchForEntry
> . . .derby.impl.store.access.btree.LeafControlRow.search
> . . .derby.impl.store.access.btree.BTreeScan.positionAtStartForForwardScan
> . . .derby.impl.store.access.btree.BTreeForwardScan.positionAtStartPosition
> . . .derby.impl.store.access.btree.BTreeForwardScan.fetchRows
> . . .derby.impl.store.access.btree.BTreeScan.fetchNext
> . . .derby.impl.sql.execute.TableScanResultSet.getNextRowCore
> . . .derby.impl.sql.execute.IndexRowToBaseRowResultSet.getNextRowCore
> . . .derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore
> . . .derby.impl.sql.execute.OnceResultSet.getNextRowCore
> . . .derby.exe.ac601a400fx011cx480cx5eacx00000010d8100.g0
> . . .derby.exe.ac601a400fx011cx480cx5eacx00000010d8100.e6
> 	... 17 more
> ============= begin nested exception, level (1) ===========
> java.lang.NullPointerException
> . . .derby.iapi.types.NumberDataType.compare
> . . .derby.impl.store.access.btree.ControlRow.compareIndexRowFromPageToKey
> . . .derby.impl.store.access.btree.ControlRow.searchForEntry
> . . .derby.impl.store.access.btree.LeafControlRow.search
> . . .derby.impl.store.access.btree.BTreeScan.positionAtStartForForwardScan
> . . .derby.impl.store.access.btree.BTreeForwardScan.positionAtStartPosition
> . . .derby.impl.store.access.btree.BTreeForwardScan.fetchRows
> . . .derby.impl.store.access.btree.BTreeScan.fetchNext
> . . .derby.impl.sql.execute.TableScanResultSet.getNextRowCore
> . . .derby.impl.sql.execute.IndexRowToBaseRowResultSet.getNextRowCore
> . . .derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore
> . . .derby.impl.sql.execute.OnceResultSet.getNextRowCore
> . . .derby.exe.ac601a400fx011cx480cx5eacx00000010d8100.g0
> . . .derby.exe.ac601a400fx011cx480cx5eacx00000010d8100.e6
> . . .derby.impl.services.reflect.DirectCall.invoke
> . . .derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore
> . . .derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow
> . . .derby.impl.jdbc.EmbedResultSet.movePosition
> . . .derby.impl.jdbc.EmbedResultSet.next
> . . .derby.tools.JDBCDisplayUtil.indent_DisplayResults
> . . .derby.tools.JDBCDisplayUtil.indent_DisplayResults
> . . .derby.tools.JDBCDisplayUtil.indent_DisplayResults
> . . .derby.tools.JDBCDisplayUtil.DisplayResults
> . . .derby.impl.tools.ij.utilMain.displayResult
> . . .derby.impl.tools.ij.utilMain.doCatch
> . . .derby.impl.tools.ij.utilMain.runScriptGuts
> . . .derby.impl.tools.ij.utilMain.go
> . . .derby.impl.tools.ij.Main.go
> . . .derby.impl.tools.ij.Main.mainCore
> . . .derby.impl.tools.ij.Main14.main
> . . .derby.tools.ij.main
> ============= end nested exception, level (1) ===========
> Cleanup action completed

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.