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/17 19:50:16 UTC

svn commit: r1559218 - in /db/derby/code/trunk/java: engine/org/apache/derby/impl/sql/execute/MergeResultSet.java testing/org/apache/derbyTesting/functionTests/tests/lang/MergeStatementTest.java

Author: rhillegas
Date: Fri Jan 17 18:50:15 2014
New Revision: 1559218

URL: http://svn.apache.org/r1559218
Log:
DERBY-3155: Make cleanup logic in MergeResultSet more closely resemble the cleanup logic in InsertResultSet; commit derby-3155-15-aa-replumbMergeResultSetCleanup.diff.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MergeResultSet.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/execute/MergeResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MergeResultSet.java?rev=1559218&r1=1559217&r2=1559218&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MergeResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/MergeResultSet.java Fri Jan 17 18:50:15 2014
@@ -60,6 +60,8 @@ class MergeResultSet extends NoRowsResul
     private long                        _rowCount;
     private TemporaryRowHolderImpl[]    _thenRows;
 
+	private int						numOpens;
+    
     ///////////////////////////////////////////////////////////////////////////////////
     //
     // CONSTRUCTOR
@@ -95,6 +97,15 @@ class MergeResultSet extends NoRowsResul
     {
         setup();
 
+		if (numOpens++ == 0)
+		{
+			_drivingLeftJoin.openCore();
+		}
+		else
+		{
+			_drivingLeftJoin.reopenCore();
+		}
+
         boolean rowsFound = collectAffectedRows();
         if ( !rowsFound )
         {
@@ -124,7 +135,6 @@ class MergeResultSet extends NoRowsResul
         }
 
         _rowCount = 0L;
-        _drivingLeftJoin.openCore();
     }
     
     /**
@@ -149,12 +159,15 @@ class MergeResultSet extends NoRowsResul
             
             _constants.getMatchingClause( i ).cleanUp();
         }
+
+        if ( _drivingLeftJoin != null ) { _drivingLeftJoin.close(); }
+		numOpens = 0;
     }
 
 
     public void finish() throws StandardException
     {
-        _drivingLeftJoin.finish();
+        if ( _drivingLeftJoin != null ) { _drivingLeftJoin.finish(); }
         super.finish();
     }
 

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=1559218&r1=1559217&r2=1559218&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 Fri Jan 17 18:50:15 2014
@@ -4565,6 +4565,75 @@ public class MergeStatementTest extends 
         goodStatement( dboConnection, "drop table t1_027" );
     }
     
+    /**
+     * <p>
+     * Verify that you can drive MERGE statements from row-based triggers.
+     * </p>
+     */
+    public  void    test_028_basicRowTrigger()
+        throws Exception
+    {
+        Connection  dboConnection = openUserConnection( TEST_DBO );
+
+        //
+        // create schema
+        //
+        goodStatement
+            (
+             dboConnection,
+             "create view singlerow_028( x ) as values 1"
+             );
+        goodStatement
+            (
+             dboConnection,
+             "create table t1_028( x int )"
+             );
+        goodStatement
+            (
+             dboConnection,
+             "create table t2_028( y int )"
+             );
+        goodStatement
+            (
+             dboConnection,
+             "create trigger tr after insert on t1_028\n" +
+             "referencing new as new\n" +
+             "for each row\n" +
+             "merge into t2_028\n" +
+             "using singlerow_028 on t2_028.y = new.x\n" +
+             "when not matched then insert ( y ) values ( new.x )\n"
+             );
+
+        // now exercise the trigger
+        goodStatement
+            (
+             dboConnection,
+             "insert into t1_028 values 1,2,3,4,5,4,3,2,1,1,1,2,3,100"
+             );
+        assertResults
+            (
+             dboConnection,
+             "select * from t2_028 order by y",
+             new String[][]
+             {
+                 { "1" },
+                 { "2" },
+                 { "3" },
+                 { "4" },
+                 { "5" },
+                 { "100" },
+             },
+             false
+             );
+
+        //
+        // drop schema
+        //
+        goodStatement( dboConnection, "drop table t1_028" );
+        goodStatement( dboConnection, "drop table t2_028" );
+        goodStatement( dboConnection, "drop view singlerow_028" );
+    }
+    
     ///////////////////////////////////////////////////////////////////////////////////
     //
     // ROUTINES