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 2013/10/01 11:31:26 UTC

svn commit: r1527993 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/compile/CreateTriggerNode.java testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerWhenClauseTest.java

Author: kahatlen
Date: Tue Oct  1 09:31:26 2013
New Revision: 1527993

URL: http://svn.apache.org/r1527993
Log:
DERBY-534: Support use of the WHEN clause in CREATE TRIGGER statements

Disallow references to tables in the SESSION schema in the WHEN clause.

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

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateTriggerNode.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateTriggerNode.java?rev=1527993&r1=1527992&r2=1527993&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateTriggerNode.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/CreateTriggerNode.java Tue Oct  1 09:31:26 2013
@@ -437,10 +437,11 @@ class CreateTriggerNode extends DDLState
 			}
 		}
 
-		//If attempting to reference a SESSION schema table (temporary or permanent) in the trigger action, throw an exception
-		if (actionNode.referencesSessionSchema())
+        // Throw an exception if the WHEN clause or the triggered SQL
+        // statement references a table in the SESSION schema.
+        if (referencesSessionSchema()) {
 			throw StandardException.newException(SQLState.LANG_OPERATION_NOT_ALLOWED_ON_SESSION_SCHEMA_TABLES);
-
+        }
 	}
 
 	/**
@@ -456,7 +457,9 @@ class CreateTriggerNode extends DDLState
 	{
 		//If create trigger is part of create statement and the trigger is defined on or it references SESSION schema tables,
 		//it will get caught in the bind phase of trigger and exception will be thrown by the trigger bind. 
-		return (isSessionSchema(triggerTableDescriptor.getSchemaName()) || actionNode.referencesSessionSchema());
+        return isSessionSchema(triggerTableDescriptor.getSchemaName())
+                || actionNode.referencesSessionSchema()
+                || (whenClause != null && whenClause.referencesSessionSchema());
 	}
 
     /**

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerWhenClauseTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerWhenClauseTest.java?rev=1527993&r1=1527992&r2=1527993&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerWhenClauseTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/TriggerWhenClauseTest.java Tue Oct  1 09:31:26 2013
@@ -44,6 +44,8 @@ public class TriggerWhenClauseTest exten
      */
     private static List<Integer> procedureCalls;
 
+    private static final String REFERENCES_SESSION_SCHEMA = "XCL51";
+
     public TriggerWhenClauseTest(String name) {
         super(name);
     }
@@ -257,4 +259,21 @@ public class TriggerWhenClauseTest exten
                 s.executeQuery("select * from t2 order by x"),
                 new String[][]{{"1"}, {"1"}, {"2"}, {"3"}, {"3"}});
     }
+
+    /**
+     * Test that CREATE TRIGGER fails if the WHEN clause references a table
+     * in the SESSION schema.
+     */
+    public void testSessionSchema() throws SQLException {
+        Statement s = createStatement();
+        s.execute("declare global temporary table temptable (x int) "
+                + "not logged");
+        s.execute("create table t1(x int)");
+        s.execute("create table t2(x int)");
+
+        assertCompileError(REFERENCES_SESSION_SCHEMA,
+                "create trigger tr1 after insert on t1 "
+                + "when (exists (select * from session.temptable)) "
+                + "insert into t2 values 1");
+    }
 }