[ 
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.

Reply via email to