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 rh...@apache.org on 2006/11/29 01:35:40 UTC

svn commit: r480306 - in /db/derby/code/branches/10.2/java: engine/org/apache/derby/impl/sql/compile/ testing/org/apache/derbyTesting/functionTests/master/ testing/org/apache/derbyTesting/functionTests/tests/lang/

Author: rhillegas
Date: Tue Nov 28 16:35:39 2006
New Revision: 480306

URL: http://svn.apache.org/viewvc?view=rev&rev=480306
Log:
DERBY-2014: Port to 10.2 branch.

Modified:
    db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ConstantNode.java
    db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java
    db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out
    db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GroupByExpressionTest.java
    db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql

Modified: db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ConstantNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ConstantNode.java?view=diff&rev=480306&r1=480305&r2=480306
==============================================================================
--- db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ConstantNode.java (original)
+++ db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ConstantNode.java Tue Nov 28 16:35:39 2006
@@ -282,7 +282,11 @@
 	{
 		if (isSameNodeType(o)) {
 			ConstantNode other = (ConstantNode)o;
-			return other.getValue().compare(getValue()) == 0;
+			
+			// value can be null which represents a SQL NULL value.
+			return ( (other.getValue() == null && getValue() == null) || 
+					 (other.getValue() != null && 
+							 other.getValue().compare(getValue()) == 0) );
 		}
 		return false;
 	}

Modified: db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java?view=diff&rev=480306&r1=480305&r2=480306
==============================================================================
--- db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java (original)
+++ db/derby/code/branches/10.2/java/engine/org/apache/derby/impl/sql/compile/ValueNode.java Tue Nov 28 16:35:39 2006
@@ -1334,7 +1334,45 @@
 	 * Tests if this node is equivalent to the specified ValueNode. Two 
 	 * ValueNodes are considered equivalent if they will evaluate to the same
 	 * value during query execution. 
+	 * <p> 
+	 * This method provides basic expression matching facility for the derived 
+	 * class of ValueNode and it is used by the language layer to compare the 
+	 * node structural form of the two expressions for equivalence at bind 
+	 * phase.  
+	 *  <p>
+	 * Note that it is not comparing the actual row values at runtime to produce 
+	 * a result; hence, when comparing SQL NULLs, they are considered to be 
+	 * equivalent and not unknown.  
+	 *  <p>
+	 * One usage case of this method in this context is to compare the select 
+	 * column expression against the group by expression to check if they are 
+	 * equivalent.  e.g.:
+	 *  <p>
+	 * SELECT c1+c2 FROM t1 GROUP BY c1+c2   
+	 *  <p>
+	 * In general, node equivalence is determined by the derived class of 
+	 * ValueNode.  But they generally abide to the rules below:
+	 *  <ul>
+	 * <li>The two ValueNodes must be of the same node type to be considered 
+	 *   equivalent.  e.g.:  CastNode vs. CastNode - equivalent (if their args 
+	 *   also match), ColumnReference vs CastNode - not equivalent.
+	 *   
+	 * <li>If node P contains other ValueNode(s) and so on, those node(s) must 
+	 *   also be of the same node type to be considered equivalent.
+	 *   
+	 * <li>If node P takes a parameter list, then the number of arguments and its 
+	 *   arguments for the two nodes must also match to be considered 
+	 *   equivalent.  e.g.:  CAST(c1 as INTEGER) vs CAST(c1 as SMALLINT), they 
+	 *   are not equivalent.
+	 *   
+	 * <li>When comparing SQL NULLs in this context, they are considered to be 
+	 *   equivalent.
 	 * 
+	 * <li>If this does not apply or it is determined that the two nodes are not 
+	 *   equivalent then the derived class of this method should return false; 
+	 *   otherwise, return true.
+	 * </ul>   
+	 *   
 	 * @param other the node to compare this ValueNode against.
 	 * @return <code>true</code> if the two nodes are equivalent, 
 	 * <code>false</code> otherwise.

Modified: db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out?view=diff&rev=480306&r1=480305&r2=480306
==============================================================================
--- db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out (original)
+++ db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/master/groupBy.out Tue Nov 28 16:35:39 2006
@@ -636,28 +636,4 @@
 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/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GroupByExpressionTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GroupByExpressionTest.java?view=diff&rev=480306&r1=480305&r2=480306
==============================================================================
--- db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GroupByExpressionTest.java (original)
+++ db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GroupByExpressionTest.java Tue Nov 28 16:35:39 2006
@@ -36,7 +36,7 @@
 public class GroupByExpressionTest extends BaseJDBCTestCase
 {
 
-    private static String[][] TABLES = { 
+	private static String[][] TABLES = { 
         {"test", "create table test (c1 int, c2 int, c3 int, c4 int)"},
         {"coal", "create table coal (vc1 varchar(2), vc2 varchar(2))"},
         {"alltypes", 
@@ -45,7 +45,12 @@
             " d double precision, r real, " + 
             " dt date, t time, ts timestamp, " +
             " b char(2) for bit data, bv varchar(8) for bit data, " +
-            " lbv long varchar for bit data, dc decimal(5,2))"}};
+            " lbv long varchar for bit data, dc decimal(5,2))"},
+        {"t1", "create table t1 (c1 varchar(30))"},
+        {"t2", "create table t2 (c1 varchar(10))"},
+        {"t3", "create table t3 (c1 int, c2 int)"}
+    };
+
     private static String[][] FUNCTIONS = {
         {"r", "create function r() returns double external name " +
             "'java.lang.Math.random' language java parameter style java"}};
@@ -182,6 +187,81 @@
                         {"dupl", new Integer(14)},
                         {"good", new Integer(1)}});
 
+        // DERBY-2008 
+        // substr (2-args)
+        verifyQueryResults(
+                "substr-Q1",
+                "select substr(c1, 3) from t1 group by substr(c1, 3)",
+                new String[][] { {"03-12-08"},
+                                 {"28-09-21"} });
+        // substr (3-args)
+        verifyQueryResults(
+                "substr-Q2",
+                "select substr(c1, 3, 4) from t1 group by substr(c1, 3, 4)",
+                new String[][] { {"03-1"},
+                                 {"28-0"} });
+
+        // ltrim
+        verifyQueryResults(
+                "ltrim",
+                "select ltrim(c1) from t2 group by ltrim(c1)",
+                new String[][] { {"123 "},
+                                 {"abc "} });
+
+        // rtrim
+        verifyQueryResults(
+                "rtrim",
+                "select rtrim(c1) from t2 group by rtrim(c1)",
+                new String[][] { {"123"},
+                                 {"abc"} });
+
+        // locate (2-args)
+        verifyQueryResults(
+                "locate-Q1",
+                "select locate(c1, 'abc') from t2 group by locate(c1, 'abc')",
+                new int[][] { { 0 }, 
+                              { 1 } });
+
+        // locate (3-args)
+        verifyQueryResults(
+                "locate-Q2",
+                "select locate(c1, 'abc', 1) from t2 group by locate(c1, 'abc',1)",
+                new int[][] { { 0 }, 
+                              { 1 } });
+        
+        // cast with NULL
+        verifyQueryResults(
+                "cast-Q2",
+                "select (cast (NULL as INTEGER)) from t2 group by (cast (NULL as INTEGER))",
+                new Object[][] { { null } } );
+
+        // DERBY-2014
+        // nullif
+        verifyQueryResults(
+                "nullif-Q1",
+                "select nullif(c1,c1) from t3 group by nullif(c1,c1)",
+                new Object[][] { { null } } );
+
+        verifyQueryResults(
+                "nullif-Q2",
+                "select nullif(c1,c2) from t3 group by nullif(c1,c2)",
+                new Object[][] { { new Integer(5) }, 
+                                 { null } });
+
+        verifyQueryResults(
+                "nullif-Q3",
+                "select nullif(c1,10) from t3 group by nullif(c1,10)",
+                new Object[][] { { new Integer(1) },
+                                 { new Integer(2) },
+                                 { new Integer(3) },
+                                 { new Integer(5) },
+                                 { null } });
+
+        verifyQueryResults(
+                "nullif-Q4",
+                "select nullif(1,c1) from t3 group by nullif(1,c1)",
+                new Object[][] { { new Integer(1) }, 
+                                 { null } });
     }
     
     public void testExtractOperator() throws Exception
@@ -263,6 +343,34 @@
         assertCompileError(
                 "42Y30",
                 "select substr(c, 3, 4) from alltypes group by substr(v, 3, 4)");
+
+        // DERBY-2008
+        // invalid grouping expression 
+        assertCompileError(
+                "42Y30",
+                "select substr(c1, 3, 4) from t1 group by substr(c1, 3)");
+        assertCompileError(
+                "42Y30",
+                "select substr(c1, 3) from t1 group by substr(c1, 3, 4)");
+        assertCompileError(
+                "42Y30",
+                "select locate(c1, 'abc') from t2 group by locate(c1, 'abc',3)");
+        assertCompileError(
+                "42Y30",
+                "select locate(c1, 'abc',2) from t2 group by locate(c1, 'abc')");
+        assertCompileError(
+                "42Y30",
+                "select locate(c1, 'abc',2) from t2 group by locate(c1, 'abc',3)");
+
+        // DERBY-2014
+        // invalid grouping expression
+        assertCompileError(
+                "42Y30",
+                "select nullif(c1,c2) from t3 group by nullif(c2,c1)");
+        assertCompileError(
+                "42Y30",
+                "select nullif(c1,100) from t3 group by nullif(c1,200)");
+
         // aggregates in group by list.
         assertCompileError(
                 "42Y26",
@@ -463,7 +571,11 @@
                     " date('1992-03-04'), time('12:30:42'), " + 
                     " timestamp('1992-03-04 12:30:42'), " +
                     " X'12af', X'1111111111111111', X'1234', 111.11) " );
-                
+
+                s.execute("insert into t1 values ('1928-09-21'), ('1903-12-08')");
+                s.execute("insert into t2 values '123 ', 'abc ', '123', 'abc'") ;
+                s.execute("insert into t3 values (1,1), (2,2), (2,2), (3,3), (null, null), (5,100)");
+
                 s.close();
                 c.commit();
                 c.close();

Modified: db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql?view=diff&rev=480306&r1=480305&r2=480306
==============================================================================
--- db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql (original)
+++ db/derby/code/branches/10.2/java/testing/org/apache/derbyTesting/functionTests/tests/lang/groupBy.sql Tue Nov 28 16:35:39 2006
@@ -360,15 +360,3 @@
 -- 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;