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
+}