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 ka...@apache.org on 2006/08/15 14:46:31 UTC

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

Author: kahatlen
Date: Tue Aug 15 05:46:30 2006
New Revision: 431593

URL: http://svn.apache.org/viewvc?rev=431593&view=rev
Log:
DERBY-1574: NullPointerException in UPDATE with COALESCE and subquery

This patch
- adds a preprocess method to CoalesceFunctionNode to override the one
  in ValueNode, thus making sure the arguments get handled.
- adds a printSubNodes method to CoalesceFunctionNode (was missing
  too, I discovered, when I was trying to look at the parse tree after
  binding).
- adds a new test case to coalesceTests.java and an updated master

Patch contributed by Dag H. Wanvik.

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

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CoalesceFunctionNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CoalesceFunctionNode.java?rev=431593&r1=431592&r2=431593&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CoalesceFunctionNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CoalesceFunctionNode.java Tue Aug 15 05:46:30 2006
@@ -317,4 +317,57 @@
 		}
 	}
 
+	/**
+	 * Preprocess an expression tree.  We do a number of transformations
+	 * here (including subqueries, IN lists, LIKE and BETWEEN) plus
+	 * subquery flattening.
+	 * NOTE: This is done before the outer ResultSetNode is preprocessed.
+	 *
+	 * @param	numTables			Number of tables in the DML Statement
+	 * @param	outerFromList		FromList from outer query block
+	 * @param	outerSubqueryList	SubqueryList from outer query block
+	 * @param	outerPredicateList	PredicateList from outer query block
+	 *
+	 * @return						The modified expression
+	 *
+	 * @exception StandardException		Thrown on error
+	 */
+	public ValueNode preprocess(int numTables,
+								FromList outerFromList,
+								SubqueryList outerSubqueryList,
+								PredicateList outerPredicateList) 
+					throws StandardException
+	{
+		int argumentsListSize = argumentsList.size();
+		for (int i=0; i < argumentsListSize; i++) {
+			((ValueNode)argumentsList.elementAt(i)).preprocess
+				(numTables,
+				 outerFromList,
+				 outerSubqueryList,
+				 outerPredicateList);
+		}
+		return this;
+	}
+
+
+	/**
+	 * Prints the sub-nodes of this object.  See QueryTreeNode.java for
+	 * how tree printing is supposed to work.
+	 *
+	 * @param depth					The depth of this node in the tree
+	 */
+
+	public void printSubNodes(int depth)
+	{
+		if (SanityManager.DEBUG)
+		{
+			super.printSubNodes(depth);
+			printLabel(depth, "argumentsList: ");
+			int argumentsListSize = argumentsList.size();
+			for (int i=0; i < argumentsListSize; i++) {
+			    ((ValueNode)argumentsList.elementAt(i)).treePrint(depth+1);
+			}
+		}
+	}
+        
 }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/subquery.out
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/subquery.out?rev=431593&r1=431592&r2=431593&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/subquery.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/subquery.out Tue Aug 15 05:46:30 2006
@@ -1645,4 +1645,28 @@
 0 rows inserted/updated/deleted
 ij> drop table t4;
 0 rows inserted/updated/deleted
+ij> -- DERBY-1574: Subquery in COALESCE gives NPE due
+-- to preprocess not implemented for that node type
+create table t1 (id int);
+0 rows inserted/updated/deleted
+ij> create table t2 (i integer primary key, j int);
+0 rows inserted/updated/deleted
+ij> insert into t1 values 1,2,3,4,5;
+5 rows inserted/updated/deleted
+ij> insert into t2 values (1,1),(2,4),(3,9),(4,16);
+4 rows inserted/updated/deleted
+ij> update t1 set id = coalesce((select j from t2 where t2.i=t1.id), 0);
+5 rows inserted/updated/deleted
+ij> select * from t1;
+ID         
+-----------
+1          
+4          
+9          
+16         
+0          
+ij> drop table t1;
+0 rows inserted/updated/deleted
+ij> drop table t2;
+0 rows inserted/updated/deleted
 ij> 

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/subquery.sql
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/subquery.sql?rev=431593&r1=431592&r2=431593&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/subquery.sql (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/subquery.sql Tue Aug 15 05:46:30 2006
@@ -525,3 +525,18 @@
 drop table t2;
 drop table t3;
 drop table t4;
+
+-- DERBY-1574: Subquery in COALESCE gives NPE due
+-- to preprocess not implemented for that node type
+create table t1 (id int);
+create table t2 (i integer primary key, j int);
+
+insert into t1 values 1,2,3,4,5;
+insert into t2 values (1,1),(2,4),(3,9),(4,16);
+ 
+update t1 set id = coalesce((select j from t2 where t2.i=t1.id), 0);
+select * from t1;
+
+drop table t1;
+drop table t2;
+