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/02/10 16:10:32 UTC

svn commit: r1566649 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/compile/ engine/org/apache/derby/loc/ shared/org/apache/derby/shared/common/reference/ testing/org/apache/derbyTesting/functionTests/tests/lang/

Author: rhillegas
Date: Mon Feb 10 15:10:31 2014
New Revision: 1566649

URL: http://svn.apache.org/r1566649
Log:
DERBY-3155: Forbid derived column lists in MERGE statements; commit derby-3155-23-aa-forbidDerivedColumnLists.diff.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java
    db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml
    db/derby/code/trunk/java/shared/org/apache/derby/shared/common/reference/SQLState.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/MergeNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java?rev=1566649&r1=1566648&r2=1566649&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/MergeNode.java Mon Feb 10 15:10:31 2014
@@ -214,6 +214,9 @@ public final class MergeNode extends DML
             throw StandardException.newException( SQLState.LANG_SAME_EXPOSED_NAME );
         }
 
+        // don't allow derived column lists right now
+        forbidDerivedColumnLists();
+        
         // synonyms not allowed
         forbidSynonyms( dd );
 
@@ -272,6 +275,30 @@ public final class MergeNode extends DML
         return ft.getTableName().getTableName();
     }
 
+    /**
+     *<p>
+     * Because of name resolution complexities, we do not allow derived column lists
+     * on source or target tables. These lists arise in queries like the following:
+     * </p>
+     *
+     * <pre>
+     * merge into t1 r( x )
+     * using t2 on r.x = t2.a
+     * when matched then delete;
+     * 
+     * merge into t1
+     * using t2 r( x ) on t1.a = r.x
+     * when matched then delete;
+     * </pre>
+     */
+    private void    forbidDerivedColumnLists() throws StandardException
+    {
+        if ( (_sourceTable.resultColumns != null) || (_targetTable.resultColumns != null) )
+        {
+            throw StandardException.newException( SQLState.LANG_NO_DCL_IN_MERGE );
+        }
+    }
+
     /** Neither the source nor the target table may be a synonym */
     private void    forbidSynonyms( DataDictionary dd )    throws StandardException
     {

Modified: db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml?rev=1566649&r1=1566648&r2=1566649&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/loc/messages.xml Mon Feb 10 15:10:31 2014
@@ -2296,6 +2296,11 @@ Guide.
                 <text>Synonyms are not allowed as the source or target tables of MERGE statements.</text>
             </msg>
 
+	        <msg>
+                <name>42XAQ</name>
+                <text>The source and target tables of MERGE statements may not have derived column lists.</text>
+            </msg>
+
             <msg>
                 <name>42Y00</name>
                 <text>Class '{0}' does not implement org.apache.derby.iapi.db.AggregateDefinition and thus cannot be used as an aggregate expression.</text>

Modified: db/derby/code/trunk/java/shared/org/apache/derby/shared/common/reference/SQLState.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/shared/org/apache/derby/shared/common/reference/SQLState.java?rev=1566649&r1=1566648&r2=1566649&view=diff
==============================================================================
--- db/derby/code/trunk/java/shared/org/apache/derby/shared/common/reference/SQLState.java (original)
+++ db/derby/code/trunk/java/shared/org/apache/derby/shared/common/reference/SQLState.java Mon Feb 10 15:10:31 2014
@@ -952,6 +952,7 @@ public interface SQLState {
     String LANG_NOT_NULL_CHARACTERISTICS                               = "42XAN";
     String LANG_NO_SUBQUERIES_IN_MATCHED_CLAUSE         = "42XAO";
     String LANG_NO_SYNONYMS_IN_MERGE                            = "42XAP";
+    String LANG_NO_DCL_IN_MERGE                                         = "42XAQ";
     String LANG_INVALID_USER_AGGREGATE_DEFINITION2                     = "42Y00";
 	String LANG_INVALID_CHECK_CONSTRAINT                               = "42Y01";
     // String LANG_NO_ALTER_TABLE_COMPRESS_ON_TARGET_TABLE             = "42Y02";

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=1566649&r1=1566648&r2=1566649&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 Mon Feb 10 15:10:31 2014
@@ -73,6 +73,7 @@ public class MergeStatementTest extends 
     private static  final   String      NO_DML_IN_BEFORE_TRIGGERS = "42Z9D";
     private static  final   String      NO_SUBQUERIES_IN_MATCHED_CLAUSE = "42XAO";
     private static  final   String      NO_SYNONYMS_IN_MERGE = "42XAP";
+    private static  final   String      NO_DCL_IN_MERGE = "42XAQ";
 
     private static  final   String[]    TRIGGER_HISTORY_COLUMNS = new String[] { "ACTION", "ACTION_VALUE" };
 
@@ -5130,6 +5131,51 @@ public class MergeStatementTest extends 
         assertResults( conn, "select * from t1_035 order by x", expectedResults, false );
     }
     
+   /**
+     * <p>
+     * Don't allow derived column lists in MERGE statements..
+     * </p>
+     */
+    public  void    test_036_derivedColumnLists()
+        throws Exception
+    {
+        Connection  dboConnection = openUserConnection( TEST_DBO );
+
+        //
+        // create schema
+        //
+        goodStatement
+            (
+             dboConnection,
+             "create table t1_036( a int )"
+             );
+        goodStatement
+            (
+             dboConnection,
+             "create table t2_036( a int )"
+             );
+
+        // verify that derived column lists are not allowed
+        expectCompilationError
+            ( dboConnection, NO_DCL_IN_MERGE,
+              "merge into t1_036 r( x )\n" +
+              "using t2_036 on r.x = t2_036.a\n" +
+              "when matched then delete\n"
+              );
+        expectCompilationError
+            ( dboConnection, NO_DCL_IN_MERGE,
+              "merge into t1_036\n" +
+              "using t2_036 r( x ) on t1_036.a = r.x\n" +
+              "when matched then delete\n"
+              );
+
+        //
+        // drop schema
+        //
+        goodStatement( dboConnection, "drop table t2_036" );
+        goodStatement( dboConnection, "drop table t1_036" );
+    }
+    
     ///////////////////////////////////////////////////////////////////////////////////
     //
     // ROUTINES