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 da...@apache.org on 2009/10/24 18:51:34 UTC

svn commit: r829410 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/ engine/org/apache/derby/impl/sql/execute/ engine/org/apache/derby/impl/store/access/sort/ testing/org/apache/derbyTesting/functionTests/tests/lang/

Author: dag
Date: Sat Oct 24 16:51:33 2009
New Revision: 829410

URL: http://svn.apache.org/viewvc?rev=829410&view=rev
Log:
DERBY-4413 INSERT from SELECT DISTINCT gives assertFailure (sane), or NPE (insane) in presence of generated columns

Patch DERBY-4413-2 makes sort accept columns that are null. In sane mode, it is checked that in such a case, the
empty column is not part of the sort key.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericColumnDescriptor.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicSortObserver.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/MergeSort.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsTest.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericColumnDescriptor.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericColumnDescriptor.java?rev=829410&r1=829409&r2=829410&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericColumnDescriptor.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/GenericColumnDescriptor.java Sat Oct 24 16:51:33 2009
@@ -239,7 +239,9 @@
 			return "GenericColumnDescriptor\n\tname: "+name+
 				"\n\tTable: "+schemaName+"."+tableName+
 				"\n\tcolumnPos: "+columnPos+
-				"\n\tType: "+type;
+				"\n\tType: "+type+
+				"\n\tisAutoincrement: " + isAutoincrement +
+				"\n\thasGenerationClause: " + hasGenerationClause;
 		}
 		else
 		{

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicSortObserver.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicSortObserver.java?rev=829410&r1=829409&r2=829410&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicSortObserver.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicSortObserver.java Sat Oct 24 16:51:33 2009
@@ -168,7 +168,12 @@
 		{
 			// the only difference between getClone and cloneObject is cloneObject does
 			// not objectify a stream.  We use getClone here.  Beetle 4896.
-			newArray[i] = origArray[i].getClone();
+
+			// DERBY-4413 shows that the value for a generated column will be
+			// null as the result set is computed as part of an INSERT INTO, so
+			// accept a null also.
+			newArray[i] =
+				(origArray[i] != null ? origArray[i].getClone() : null);
 		}
 
 		return newArray;

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/MergeSort.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/MergeSort.java?rev=829410&r1=829409&r2=829410&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/MergeSort.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/store/access/sort/MergeSort.java Sat Oct 24 16:51:33 2009
@@ -126,6 +126,12 @@
 	**/
 	protected boolean columnOrderingNullsLowMap[];
 
+
+	/**
+    Determine whether a column is used for ordering or not.
+	**/
+	private boolean isOrderingColumn[];
+
 	/**
 	The sort observer.  May be null.  Used as a callback.
 	**/
@@ -455,8 +461,18 @@
                 Object col2 = template[colid];
                 if (col1 == null)
 				{
-					SanityManager.THROWASSERT(
-						"col[" + colid + "]  is null");
+					if (!isOrderingColumn[colid]) {
+
+						// DERBY-4413 shows that the value for a generated
+						// column will be null as the result set is computed as
+						// part of an INSERT INTO, so accept a null also.
+						// This column would not be part of the sort key.
+
+						continue;
+
+					} else {
+						SanityManager.THROWASSERT("col[" + colid + "] is null");
+					}
 				}
 						
                 if (!(col1 instanceof CloneableObject))
@@ -546,13 +562,27 @@
         columnOrderingMap          = new int[columnOrdering.length];
         columnOrderingAscendingMap = new boolean[columnOrdering.length];
         columnOrderingNullsLowMap  = new boolean[columnOrdering.length];
-        for (int i = 0; i < columnOrdering.length; i++)
+
+		if (SanityManager.DEBUG) {
+			isOrderingColumn = new boolean[template.length];
+
+			for (int i = 0; i < isOrderingColumn.length; i++) {
+				isOrderingColumn[i] = false;
+			}
+		}
+
+		for (int i = 0; i < columnOrdering.length; i++)
         {
             columnOrderingMap[i] = columnOrdering[i].getColumnId();
             columnOrderingAscendingMap[i] = columnOrdering[i].getIsAscending();
             columnOrderingNullsLowMap[i] = columnOrdering[i].getIsNullsOrderedLow();
+
+			if (SanityManager.DEBUG) {
+				isOrderingColumn[columnOrderingMap[i]] = true;
+			}
         }
 
+
 		// No inserter or scan yet.
 		this.inserter = null;
 		this.scan = null;

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsTest.java?rev=829410&r1=829409&r2=829410&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/GeneratedColumnsTest.java Sat Oct 24 16:51:33 2009
@@ -5258,7 +5258,55 @@
              );
 
     }
-    
+
+
+   /**
+    * Test INSERT INTO .. select distinct in presence of generated column.
+    * Cf DERBY-4413.
+    */
+    public  void    test_031_derby_4413()
+            throws Exception
+    {
+        Connection  conn = getConnection();
+
+        //
+        // Schema
+        //
+        goodStatement
+            (
+                conn,
+                "create table t_4413 (" +
+                "     i integer, " +
+                "     j integer not null generated always as (i*2))"
+            );
+        goodStatement
+            (
+                conn,
+                "insert into t_4413(i) values 1,2,1"
+            );
+
+        goodStatement
+            (
+                conn,
+                "insert into t_4413(i) select distinct i from t_4413"
+            );
+        assertResults
+            (
+                conn,
+                "select * from t_4413",
+                new String[][]
+                {
+                    { "1", "2", },
+                    { "2", "4", },
+                    { "1", "2", },
+                    { "1", "2", },
+                    { "2", "4", },
+                },
+                false
+            );
+
+    }
+
 
     ///////////////////////////////////////////////////////////////////////////////////
     //
@@ -5436,4 +5484,4 @@
     }
 
 
-}
\ No newline at end of file
+}