You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by bp...@apache.org on 2006/10/28 18:15:09 UTC

svn commit: r468696 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/compile/TernaryOperatorNode.java testing/org/apache/derbyTesting/functionTests/master/groupBy.out testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql

Author: bpendleton
Date: Sat Oct 28 09:15:09 2006
New Revision: 468696

URL: http://svn.apache.org/viewvc?view=rev&rev=468696
Log:
DERBY-2008: NPE with 2-arg SUBSTR call in GROUP BY clause

This patch was contributed by Yip Ng (yipng168@gmail.com)

For SUBSTR function, there can be 2 or 3 arguments, and in the
case of 2-args, the rightOperand of the TernaryOperatorNode will
be null. In its isEquivalent() method, it did not take care of
this case; thus, the NPE.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TernaryOperatorNode.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TernaryOperatorNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TernaryOperatorNode.java?view=diff&rev=468696&r1=468695&r2=468696
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TernaryOperatorNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/TernaryOperatorNode.java Sat Oct 28 09:15:09 2006
@@ -921,10 +921,18 @@
     	if (isSameNodeType(o)) 
 	{
 		TernaryOperatorNode other = (TernaryOperatorNode)o;
+		
+			/*
+			 * SUBSTR function can either have 2 or 3 arguments.  In the 
+			 * 2-args case, rightOperand will be null and thus needs 
+			 * additional handling in the equivalence check.
+			 */
     		return (other.methodName.equals(methodName)
 				&& other.receiver.isEquivalent(receiver)
     				&& other.leftOperand.isEquivalent(leftOperand)
-    				&& other.rightOperand.isEquivalent(rightOperand));
+    				&& ( (rightOperand == null && other.rightOperand == null) || 
+    				     (other.rightOperand != null && 
+    				    	other.rightOperand.isEquivalent(rightOperand)) ) );
         }
     	return false;
     }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out?view=diff&rev=468696&r1=468695&r2=468696
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out Sat Oct 28 09:15:09 2006
@@ -636,4 +636,28 @@
 10         |2          
 ij> drop table t;
 0 rows inserted/updated/deleted
+ij> -- DERBY-2008
+-- test SUBSTR with 2 args with GROUP BY expression
+create table dt (vc varchar(30));
+0 rows inserted/updated/deleted
+ij> insert into dt values ('1928-09-21'), ('1903-12-08');
+2 rows inserted/updated/deleted
+ij> -- ok
+select substr(vc, 3) from dt group by substr(vc, 3);
+1                             
+------------------------------
+03-12-08                      
+28-09-21                      
+ij> select substr(vc, 3, 4) from dt group by substr(vc, 3, 4);
+1   
+----
+03-1
+28-0
+ij> -- expect errors
+select substr(vc, 3, 4) from dt group by substr(vc, 3);
+ERROR 42Y30: The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions.  
+ij> select substr(vc, 3) from dt group by substr(vc, 3, 4);
+ERROR 42Y30: The SELECT list of a grouped query contains at least one invalid expression. If a SELECT list has a GROUP BY, the list may only contain valid grouping expressions and valid aggregate expressions.  
+ij> drop table dt;
+0 rows inserted/updated/deleted
 ij> 

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql?view=diff&rev=468696&r1=468695&r2=468696
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql Sat Oct 28 09:15:09 2006
@@ -360,3 +360,15 @@
 -- ok, gives one row
 select 10,avg(c) from t having 1 < 2;
 drop table t;
+
+-- DERBY-2008
+-- test SUBSTR with 2 args with GROUP BY expression
+create table dt (vc varchar(30));
+insert into dt values ('1928-09-21'), ('1903-12-08');
+-- ok
+select substr(vc, 3) from dt group by substr(vc, 3); 
+select substr(vc, 3, 4) from dt group by substr(vc, 3, 4); 
+-- expect errors
+select substr(vc, 3, 4) from dt group by substr(vc, 3); 
+select substr(vc, 3) from dt group by substr(vc, 3, 4);
+drop table dt;