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 2014/01/16 19:32:16 UTC

svn commit: r1558871 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java testing/org/apache/derbyTesting/functionTests/tests/lang/MergeStatementTest.java

Author: rhillegas
Date: Thu Jan 16 18:32:15 2014
New Revision: 1558871

URL: http://svn.apache.org/r1558871
Log:
DERBY-3155: Make the INSERT column list optional in the WHEN NOT MATCHED clause of a MERGE statement provided that the number of values in the VALUES subclause equals the number of columns in the target table; commit derby-3155-12-aa-canOmitInsertColumnList.diff.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/MergeStatementTest.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java?rev=1558871&r1=1558870&r2=1558871&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MatchingClauseNode.java Thu Jan 16 18:32:15 2014
@@ -41,6 +41,7 @@ import org.apache.derby.iapi.sql.ResultD
 import org.apache.derby.iapi.sql.compile.CompilerContext;
 import org.apache.derby.iapi.sql.compile.Visitor;
 import org.apache.derby.iapi.sql.dictionary.ColumnDescriptor;
+import org.apache.derby.iapi.sql.dictionary.ColumnDescriptorList;
 import org.apache.derby.iapi.sql.dictionary.DataDictionary;
 import org.apache.derby.iapi.sql.dictionary.TableDescriptor;
 import org.apache.derby.iapi.sql.execute.ConstantAction;
@@ -780,13 +781,16 @@ public class MatchingClauseNode extends 
          )
         throws StandardException
     {
+        TableDescriptor td = targetTable.getTableDescriptor();
+
+        // construct a full insert column list if insert columns weren't specified
+        if ( _insertColumns == null )  { _insertColumns = buildFullColumnList( td ); }
+
         if ( _insertColumns.size() != _insertValues.size() )
         {
             throw StandardException.newException( SQLState.LANG_DB2_INVALID_COLS_SPECIFIED ); 
         }
         
-        TableDescriptor td = targetTable.getTableDescriptor();
-
         // forbid illegal values for identity columns
         for ( int i = 0; i <_insertValues.size(); i++ )
         {
@@ -816,6 +820,35 @@ public class MatchingClauseNode extends 
         _insertValues.replaceOrForbidDefaults( targetTable.getTableDescriptor(), _insertColumns, true );
         bindExpressions( _insertValues, fullFromList );
     }
+
+    /**
+     * <p>
+     * Build the full column list for a table.
+     * </p>
+     */
+    private ResultColumnList    buildFullColumnList( TableDescriptor td )
+        throws StandardException
+    {
+        ResultColumnList    result = new ResultColumnList( getContextManager() );
+		ColumnDescriptorList cdl = td.getColumnDescriptorList();
+		int					 cdlSize = cdl.size();
+
+		for ( int index = 0; index < cdlSize; index++ )
+		{
+            ColumnDescriptor colDesc = cdl.elementAt( index );
+            ColumnReference columnRef = new ColumnReference( colDesc.getColumnName(), null, getContextManager() );
+            ResultColumn    resultColumn = new ResultColumn
+                (
+                 columnRef,
+                 null,
+                 getContextManager()
+                 );
+            
+            result.addResultColumn( resultColumn );
+        }
+
+        return result;
+    }
     
     /**
      * <p>

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/MergeStatementTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/MergeStatementTest.java?rev=1558871&r1=1558870&r2=1558871&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/MergeStatementTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/MergeStatementTest.java Thu Jan 16 18:32:15 2014
@@ -4299,6 +4299,82 @@ public class MergeStatementTest extends 
         goodStatement( dboConnection, "drop table t1_024" );
     }
     
+    /**
+     * <p>
+     * Verify that the INSERT list can be omitted.
+     * </p>
+     */
+    public  void    test_025_noInsertList()
+        throws Exception
+    {
+        Connection  dboConnection = openUserConnection( TEST_DBO );
+
+        //
+        // create schema
+        //
+        goodStatement
+            (
+             dboConnection,
+             "create table t1_025( a int, b int )"
+             );
+        goodStatement
+            (
+             dboConnection,
+             "create table t2_025( a int, b int )"
+             );
+        goodStatement
+            (
+             dboConnection,
+             "insert into t1_025 values ( 1, 100 ), ( 2, 200 )"
+             );
+        goodStatement
+            (
+             dboConnection,
+             "insert into t2_025 values ( 1, 100 ), ( 3, 300 )"
+             );
+
+        //
+        // Omitting the INSERT column list is OK as long as this is
+        // a short-hand for the full column list.
+        //
+        goodStatement
+            (
+             dboConnection,
+             "merge into t1_025\n" +
+             "using t2_025 on t1_025.a = t2_025.a\n" +
+             "when not matched then insert values ( t2_025.a, t2_025.b )\n"
+             );
+        assertResults
+            (
+             dboConnection,
+             "select * from t1_025 order by a",
+             new String[][]
+             {
+                 { "1", "100" },
+                 { "2", "200" },
+                 { "3", "300" },
+             },
+             false
+             );
+
+        //
+        // Fails because the omitted INSERT column list implies that a value
+        // must be supplied for every column in the table.
+        //
+        expectCompilationError
+            ( dboConnection, COLUMN_COUNT_MISMATCH,
+              "merge into t1_025\n" +
+              "using t2_025 on t1_025.a = t2_025.a\n" +
+              "when not matched then insert values ( t2_025.a )\n"
+              );
+
+        //
+        // drop schema
+        //
+        goodStatement( dboConnection, "drop table t2_025" );
+        goodStatement( dboConnection, "drop table t1_025" );
+    }
+
     ///////////////////////////////////////////////////////////////////////////////////
     //
     // ROUTINES