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 dj...@apache.org on 2006/04/06 23:01:20 UTC

svn commit: r392073 - in /db/derby/code/trunk/java: engine/org/apache/derby/iapi/jdbc/ engine/org/apache/derby/impl/jdbc/ engine/org/apache/derby/jdbc/ testing/org/apache/derbyTesting/functionTests/master/ testing/org/apache/derbyTesting/functionTests/...

Author: djd
Date: Thu Apr  6 14:01:15 2006
New Revision: 392073

URL: http://svn.apache.org/viewcvs?rev=392073&view=rev
Log:
DERBY-1158 (partial) Embedded Statements that are holdable automatically downgrade to
close cursors on commit during a global transaction.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredPreparedStatement.java
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredStatement.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedStatement.java
    db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XAStatementControl.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource30.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredPreparedStatement.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredPreparedStatement.java?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredPreparedStatement.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredPreparedStatement.java Thu Apr  6 14:01:15 2006
@@ -55,7 +55,6 @@
      */
 	public final ResultSet executeQuery() throws SQLException
     {
-        checkHoldability();
         return wrapResultSet(getPreparedStatement().executeQuery());
     } 
 
@@ -423,7 +422,6 @@
      */
     public final boolean execute() throws SQLException
     {
-        checkHoldability();
         return getPreparedStatement().execute();
     }
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredStatement.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredStatement.java?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredStatement.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/jdbc/BrokeredStatement.java Thu Apr  6 14:01:15 2006
@@ -101,14 +101,12 @@
 
     public final boolean execute(String sql) throws SQLException
 	{
-        checkHoldability();
 		return getStatement().execute(sql);
     } 
 
     public final ResultSet executeQuery(String sql) throws SQLException
 	{
-        checkHoldability();
-		return wrapResultSet(getStatement().executeQuery(sql));
+ 		return wrapResultSet(getStatement().executeQuery(sql));
     }
 
     public final int executeUpdate(String sql) throws SQLException
@@ -541,11 +539,4 @@
 		getStatement().getConnection();
 		return control;
 	}
-    
-    final void checkHoldability() throws SQLException {
-        int holdability = controlCheck().checkHoldCursors(resultSetHoldability);
-        if (holdability != resultSetHoldability)
-            throw Util.generateCsSQLException(SQLState.CANNOT_HOLD_CURSOR_XA);
-
-    }
 }

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedStatement.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedStatement.java?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedStatement.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/jdbc/EmbedStatement.java Thu Apr  6 14:01:15 2006
@@ -62,6 +62,14 @@
     implements EngineStatement {
 
 	private final java.sql.Connection applicationConnection;
+    
+    /**
+     * Statement reference the application is using to execute
+     * this Statement. Normally set to this, but if this was
+     * created by a Connection from an XAConnection then this
+     * will be a reference to the BrokeredStatement.
+     */
+    private EngineStatement applicationStatement;
 
 	int updateCount = -1;
 	java.sql.ResultSet results;
@@ -111,6 +119,7 @@
 
 		lcc = getEmbedConnection().getLanguageConnection();
 		applicationConnection = getEmbedConnection().getApplicationConnection();
+        applicationStatement = this;
 
         // By default, no statements time out.
         // Timeout is set explicitly with setQueryTimeout().
@@ -1419,7 +1428,13 @@
 			batchStatements = null;
 		}
 	}
-
+    
+    /**
+     * Set the application statement for this Statement.
+    */
+    public final void setApplicationStatement(EngineStatement s) {
+        this.applicationStatement = s;
+    }
 
 	private EmbedResultSet[] dynamicResults;
 	private int currentDynamicResultSet;
@@ -1533,13 +1548,19 @@
     /**
      * Get the execute time holdability for the Statement.
      * When in a global transaction holdabilty defaults to false.
+     * @throws SQLException Error from getResultSetHoldability.
      */
-    private boolean getExecuteHoldable()
+    private boolean getExecuteHoldable() throws SQLException
     {
         if (resultSetHoldability  == JDBC30Translation.CLOSE_CURSORS_AT_COMMIT)
             return false;
         
-        return true;
+        // Simple non-XA case
+        if (applicationStatement == this)
+            return true;
+        
+        return applicationStatement.getResultSetHoldability() ==
+            JDBC30Translation.HOLD_CURSORS_OVER_COMMIT;
     }
 }
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XAStatementControl.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XAStatementControl.java?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XAStatementControl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/jdbc/XAStatementControl.java Thu Apr  6 14:01:15 2006
@@ -25,6 +25,7 @@
 import org.apache.derby.iapi.jdbc.BrokeredStatement;
 import org.apache.derby.iapi.jdbc.BrokeredPreparedStatement;
 import org.apache.derby.iapi.jdbc.BrokeredCallableStatement;
+import org.apache.derby.iapi.jdbc.EngineStatement;
 import org.apache.derby.impl.jdbc.EmbedConnection;
 import org.apache.derby.impl.jdbc.EmbedResultSet;
 import org.apache.derby.impl.jdbc.EmbedStatement;
@@ -60,6 +61,9 @@
 		this(xaConnection);
 		this.realStatement = realStatement;
 		this.applicationStatement = applicationConnection.newBrokeredStatement(this);
+        
+        ((EmbedStatement) realStatement).setApplicationStatement(
+                applicationStatement);
 	}
 	XAStatementControl(EmbedPooledConnection xaConnection, 
                 PreparedStatement realPreparedStatement, 
@@ -67,6 +71,8 @@
 		this(xaConnection);
 		this.realPreparedStatement = realPreparedStatement;
 		this.applicationStatement = applicationConnection.newBrokeredStatement(this, sql, generatedKeys);
+        ((EmbedStatement) realPreparedStatement).setApplicationStatement(
+                applicationStatement);
 	}
 	XAStatementControl(EmbedPooledConnection xaConnection, 
                 CallableStatement realCallableStatement, 
@@ -74,6 +80,8 @@
 		this(xaConnection);
 		this.realCallableStatement = realCallableStatement;
 		this.applicationStatement = applicationConnection.newBrokeredStatement(this, sql);
+        ((EmbedStatement) realCallableStatement).setApplicationStatement(
+                applicationStatement);
 	}
 
 	public Statement getRealStatement() throws SQLException {
@@ -96,7 +104,7 @@
 			// create new Statement
 			Statement newStatement = applicationStatement.createDuplicateStatement(xaConnection.realConnection, realStatement);
 			((EmbedStatement) realStatement).transferBatch((EmbedStatement) newStatement);
-
+ 
 			try {
 				realStatement.close();
 			} catch (SQLException sqle) {
@@ -104,6 +112,8 @@
 
 			realStatement = newStatement;
 			realConnection = xaConnection.realConnection;
+            ((EmbedStatement) realStatement).setApplicationStatement(
+                    applicationStatement);
 		}
 		else {
 			// application connection is different, therefore the outer application
@@ -143,6 +153,8 @@
 
 			realPreparedStatement = newPreparedStatement;
 			realConnection = xaConnection.realConnection;
+            ((EmbedStatement) realPreparedStatement).setApplicationStatement(
+                        applicationStatement);
 		}
 		else {
 			// application connection is different, therefore the outer application
@@ -179,6 +191,8 @@
 
 			realCallableStatement = newCallableStatement;
 			realConnection = xaConnection.realConnection;
+            ((EmbedStatement) realCallableStatement).setApplicationStatement(
+                    applicationStatement);
 		}
 		else {
 			// application connection is different, therefore the outer application

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource.out
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource.out?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource.out Thu Apr  6 14:01:15 2006
@@ -323,8 +323,6 @@
   auto commit     true
   read only       false
 TESTING RE_USE OF STATEMENT OBJECTS
-THE STATEMENT OBJECTS CAN NOT BE REUSED ACROSS LOCAL/GLOBAL CONNECTIONS BECAUSE, LOCAL CONNECTION CREATES THEM
-WITH HOLDABILITY TRUE WHEREAS GLOBAL CONNECTION CAN ONLY WORK WITH STATEMENTS WITH HOLDABILITY FALSE
 LOCK TABLE
 END LOCK TABLE
 Statement State @ Create 
@@ -351,12 +349,12 @@
 Params-local-1: ru(params) contents {3}
 sru1-local-1: mismatched Statement connection
 sru1-local-1: ru(SN1) contents {1} {2} {3}
-Expecting exception because global transaction sru1-global-2 is trying to use a statement with holdability true
+Expecting downgrade because global transaction sru1-global-2 is using a statement with holdability true
 sru1-global-2: mismatched Statement connection
 sru1-global-2: ru(SQL_CURLH000C) contents {1} {2} {3}
 sru2-global-3: mismatched Statement connection
 sru2-global-3: ru(OAK2) contents {1} {2} {3}
-Expecting exception because global transaction sru1-global-4 is trying to use a statement with holdability true
+Expecting downgrade because global transaction sru1-global-4 is using a statement with holdability true
 sru1-global-4: mismatched Statement connection
 sru1-global-4: ru(SQL_CURLH000C) contents {1} {2} {3}
 Statement State @ GLOBAL 
@@ -380,8 +378,7 @@
   getFetchSize() 999
   getMaxFieldSize() 137
   getMaxRows() 85
-PASS: got exception because holdability is true on prepared statement and that is not allowed in global transactions
-Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Params-global-1: ru(SQL_CURLH000C) contents {3}
 sru1-local-5: mismatched Statement connection
 sru1-local-5: ru(SQL_CURLH000C) contents {1} {2} {3}
 sru2-local-6: mismatched Statement connection
@@ -410,7 +407,7 @@
   getMaxFieldSize() 137
   getMaxRows() 85
 LOCK TABLE
-  xid row 0 lock count 12
+  xid row 0 lock count 14
   xid row 1 lock count 12
 END LOCK TABLE
 sru1-local-8: mismatched Statement connection
@@ -441,7 +438,7 @@
   getMaxFieldSize() 137
   getMaxRows() 85
 LOCK TABLE
-  xid row 0 lock count 12
+  xid row 0 lock count 14
   xid row 1 lock count 12
 END LOCK TABLE
 sruBatch update counts : 1  1  2  1 :

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource30.out
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource30.out?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource30.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/checkDataSource30.out Thu Apr  6 14:01:15 2006
@@ -386,8 +386,6 @@
   auto commit     true
   read only       false
 TESTING RE_USE OF STATEMENT OBJECTS
-THE STATEMENT OBJECTS CAN NOT BE REUSED ACROSS LOCAL/GLOBAL CONNECTIONS BECAUSE, LOCAL CONNECTION CREATES THEM
-WITH HOLDABILITY TRUE WHEREAS GLOBAL CONNECTION CAN ONLY WORK WITH STATEMENTS WITH HOLDABILITY FALSE
 LOCK TABLE
 END LOCK TABLE
 Statement State @ Create 
@@ -422,12 +420,12 @@
 Params-local-1: ru(params) contents {3}
 sru1-local-1: mismatched Statement connection
 sru1-local-1: ru(SN1) contents {1} {2} {3}
-Expecting exception because global transaction sru1-global-2 is trying to use a statement with holdability true
+Expecting downgrade because global transaction sru1-global-2 is using a statement with holdability true
 sru1-global-2: mismatched Statement connection
 sru1-global-2: ru(SQL_CURLH000C) contents {1} {2} {3}
 sru2-global-3: mismatched Statement connection
 sru2-global-3: ru(OAK2) contents {1} {2} {3}
-Expecting exception because global transaction sru1-global-4 is trying to use a statement with holdability true
+Expecting downgrade because global transaction sru1-global-4 is using a statement with holdability true
 sru1-global-4: mismatched Statement connection
 sru1-global-4: ru(SQL_CURLH000C) contents {1} {2} {3}
 Statement State @ GLOBAL 
@@ -459,8 +457,7 @@
   Parameter Count 2
     1 type 12
     2 type 12
-PASS: got exception because holdability is true on prepared statement and that is not allowed in global transactions
-Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Params-global-1: ru(SQL_CURLH000C) contents {3}
 sru1-local-5: mismatched Statement connection
 sru1-local-5: ru(SQL_CURLH000C) contents {1} {2} {3}
 sru2-local-6: mismatched Statement connection
@@ -497,7 +494,7 @@
     1 type 12
     2 type 12
 LOCK TABLE
-  xid row 0 lock count 12
+  xid row 0 lock count 14
   xid row 1 lock count 12
 END LOCK TABLE
 sru1-local-8: mismatched Statement connection
@@ -536,7 +533,7 @@
     1 type 12
     2 type 12
 LOCK TABLE
-  xid row 0 lock count 12
+  xid row 0 lock count 14
   xid row 1 lock count 12
 END LOCK TABLE
 sruBatch update counts : 1  1  2  1 :

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out Thu Apr  6 14:01:15 2006
@@ -185,13 +185,23 @@
 BGAC 1
 DERBY-1025 Call conn.commit to avoid exception with client
 START GLOBAL TRANSACTION
-EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Global transaction open ResultSets 12
 EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 Global createStatement(hold)Statement holdable CLOSE_CURSORS_AT_COMMIT 2
 01J07 :java.sql.SQLWarning: ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
 Global prepareStatement(hold)Statement holdable HOLD_CURSORS_OVER_COMMIT 1
-01J07 :java.sql.SQLWarning: ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
+After global transaction closed ResultSets 12
+Global xact Statement sdh Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement shh Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement sch Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement psdh Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement pshh Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement psch Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement sdc Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement shc Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement scc Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement psdh_d Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement pshh_d Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement psch_d Statement holdable CLOSE_CURSORS_AT_COMMIT 2
 derby966 complete
 XATest complete

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out Thu Apr  6 14:01:15 2006
@@ -169,14 +169,36 @@
 BGBC 0
 BGAC 1
 START GLOBAL TRANSACTION
-EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Global transaction open ResultSets 12
 EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 Global createStatement(hold)Statement holdable CLOSE_CURSORS_AT_COMMIT 2
 01J07 :SQL Warning: ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
 Global prepareStatement(hold)Statement holdable CLOSE_CURSORS_AT_COMMIT 2
 01J07 :SQL Warning: ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
-01J07 :SQL Warning: ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
+Global xact Statement sdh Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement shh Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement sch Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement psdh Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement pshh Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement psch Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement sdc Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement shc Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement scc Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement psdh_d Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement pshh_d Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement psch_d Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+After global transaction closed ResultSets 12
+Global xact Statement sdh Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement shh Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement sch Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement psdh Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement pshh Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement psch Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement sdc Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement shc Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement scc Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+Global xact Statement psdh_d Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement pshh_d Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+Global xact Statement psch_d Statement holdable CLOSE_CURSORS_AT_COMMIT 2
 derby966 complete
 XATest complete

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource.out
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource.out?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource.out Thu Apr  6 14:01:15 2006
@@ -397,8 +397,6 @@
   auto commit     true
   read only       false
 TESTING RE_USE OF STATEMENT OBJECTS
-THE STATEMENT OBJECTS CAN NOT BE REUSED ACROSS LOCAL/GLOBAL CONNECTIONS BECAUSE, LOCAL CONNECTION CREATES THEM
-WITH HOLDABILITY TRUE WHEREAS GLOBAL CONNECTION CAN ONLY WORK WITH STATEMENTS WITH HOLDABILITY FALSE
 LOCK TABLE
 END LOCK TABLE
 Statement State @ Create 
@@ -424,11 +422,11 @@
   getMaxRows() 85
 Params-local-1: ru(params) contents {3}
 sru1-local-1: ru(SN1) contents {1} {2} {3}
-Expecting exception because global transaction sru1-global-2 is trying to use a statement with holdability true
-sru1-global-2: SQL Exception: Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Expecting downgrade because global transaction sru1-global-2 is using a statement with holdability true
+sru1-global-2: ru(SN1) contents {1} {2} {3}
 sru2-global-3: ru(OAK2) contents {1} {2} {3}
-Expecting exception because global transaction sru1-global-4 is trying to use a statement with holdability true
-sru1-global-4: SQL Exception: Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Expecting downgrade because global transaction sru1-global-4 is using a statement with holdability true
+sru1-global-4: ru(SN1) contents {1} {2} {3}
 Statement State @ GLOBAL 
   getResultSetType() SCROLL_INSENSITIVE
   getResultSetConcurrency() READ_ONLY
@@ -450,8 +448,7 @@
   getFetchSize() 999
   getMaxFieldSize() 137
   getMaxRows() 85
-PASS: got exception because holdability is true on prepared statement and that is not allowed in global transactions
-Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Params-global-1: ru(params) contents {3}
 sru1-local-5: ru(SN1) contents {1} {2} {3}
 sru2-local-6: ru(OAK2) contents {1} {2} {3}
 sru3-local-7: ru(SF3) contents {1} {2} {3}
@@ -478,7 +475,7 @@
   getMaxRows() 85
 Params-local-2: ru(params) contents {3}
 LOCK TABLE
-  xid row 0 lock count 4
+  xid row 0 lock count 14
   xid row 1 lock count 14
 END LOCK TABLE
 sru1-local-8: ru(SN1) contents {1} {2} {3}
@@ -506,7 +503,7 @@
   getMaxFieldSize() 137
   getMaxRows() 85
 LOCK TABLE
-  xid row 0 lock count 4
+  xid row 0 lock count 14
   xid row 1 lock count 12
 END LOCK TABLE
 sruBatch update counts : 1  1  2  1 :

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out Thu Apr  6 14:01:15 2006
@@ -488,8 +488,6 @@
   auto commit     true
   read only       false
 TESTING RE_USE OF STATEMENT OBJECTS
-THE STATEMENT OBJECTS CAN NOT BE REUSED ACROSS LOCAL/GLOBAL CONNECTIONS BECAUSE, LOCAL CONNECTION CREATES THEM
-WITH HOLDABILITY TRUE WHEREAS GLOBAL CONNECTION CAN ONLY WORK WITH STATEMENTS WITH HOLDABILITY FALSE
 LOCK TABLE
 END LOCK TABLE
 Statement State @ Create 
@@ -523,11 +521,11 @@
     2 type 12
 Params-local-1: ru(params) contents {3}
 sru1-local-1: ru(SN1) contents {1} {2} {3}
-Expecting exception because global transaction sru1-global-2 is trying to use a statement with holdability true
-sru1-global-2: SQL Exception: Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Expecting downgrade because global transaction sru1-global-2 is using a statement with holdability true
+sru1-global-2: ru(SN1) contents {1} {2} {3}
 sru2-global-3: ru(OAK2) contents {1} {2} {3}
-Expecting exception because global transaction sru1-global-4 is trying to use a statement with holdability true
-sru1-global-4: SQL Exception: Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Expecting downgrade because global transaction sru1-global-4 is using a statement with holdability true
+sru1-global-4: ru(SN1) contents {1} {2} {3}
 Statement State @ GLOBAL 
   getResultSetType() SCROLL_INSENSITIVE
   getResultSetConcurrency() READ_ONLY
@@ -557,8 +555,7 @@
   Parameter Count 2
     1 type 12
     2 type 12
-PASS: got exception because holdability is true on prepared statement and that is not allowed in global transactions
-Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+Params-global-1: ru(params) contents {3}
 sru1-local-5: ru(SN1) contents {1} {2} {3}
 sru2-local-6: ru(OAK2) contents {1} {2} {3}
 sru3-local-7: ru(SF3) contents {1} {2} {3}
@@ -593,7 +590,7 @@
     2 type 12
 Params-local-2: ru(params) contents {3}
 LOCK TABLE
-  xid row 0 lock count 4
+  xid row 0 lock count 14
   xid row 1 lock count 14
 END LOCK TABLE
 sru1-local-8: ru(SN1) contents {1} {2} {3}
@@ -629,7 +626,7 @@
     1 type 12
     2 type 12
 LOCK TABLE
-  xid row 0 lock count 4
+  xid row 0 lock count 14
   xid row 1 lock count 12
 END LOCK TABLE
 sruBatch update counts : 1  1  2  1 :
@@ -864,14 +861,8 @@
 HOLDABLE PreparedStatement in global xact false connection warning ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
 HOLDABLE CallableStatement in global xact false connection warning ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
 STATEMENT HOLDABILITY false
-Expected SQLException (local Statement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-Expected SQLException (local Statement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 PREPARED STATEMENT HOLDABILITY false
-Expected SQLException (local PreparedStatement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-Expected SQLException (local PreparedStatement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 CALLABLE STATEMENT HOLDABILITY false
-Expected SQLException (local CallableStatement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-Expected SQLException (local CallableStatement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
 CONNECTION(held) HOLDABILITY true
 PASS XA HOLDABILITY TEST
 **Test holdability state for: PooledConnection **

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java Thu Apr  6 14:01:15 2006
@@ -26,6 +26,8 @@
 import java.sql.SQLException;
 import java.sql.SQLWarning;
 import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.Properties;
 
 import javax.sql.XAConnection;
@@ -916,15 +918,6 @@
             // start a global xact and test those statements.
             xar.start(xid, XAResource.TMNOFLAGS);
             
-            // Statements obtained while default was hold.
-            // All should work, holability will be downgraded
-            // to close on commit for those Statements with hold set.
-            if (TestUtil.isDerbyNetClientFramework()) { // DERBY-1158
-            sdh.executeQuery("SELECT * FROM APP.FOO").close();
-            shh.executeQuery("SELECT * FROM APP.FOO").close();
-            }
-            sch.executeQuery("SELECT * FROM APP.FOO").close();
-                        
             // Statements not returning ResultSet's should be ok
             if (!TestUtil.isDerbyNetClientFramework()) { // DERBY-1159
             sdh.executeUpdate("DELETE FROM APP.FOO where A < -99");
@@ -932,22 +925,21 @@
             sch.executeUpdate("DELETE FROM APP.FOO where A < -99");
             }
             
+            ArrayList openRS = new ArrayList();
+            
+            // Statements obtained while default was hold.
+            // All should work, holability will be downgraded
+            // to close on commit for those Statements with hold set.
+            openRS.add(sdh.executeQuery("SELECT * FROM APP.FOO"));
+            openRS.add(shh.executeQuery("SELECT * FROM APP.FOO"));
+            openRS.add(sch.executeQuery("SELECT * FROM APP.FOO"));
+
             
             // PreparedStatements obtained while default was hold.
-            // Only sch should work as held cursors not supported in XA
-            try {
-                psdh.executeQuery().close();
-                System.out.println("FAIL - held Statement in global psdf");
-            } catch (SQLException e) {
-                TestUtil.dumpSQLExceptions(e, true);
-            }
-            try {
-                pshh.executeQuery().close();
-                System.out.println("FAIL - held Statement in global pshh");
-            } catch (SQLException e) {
-                TestUtil.dumpSQLExceptions(e, true);
-            }
-            psch.executeQuery().close();
+            // Holdability should be downgraded.
+            openRS.add(psdh.executeQuery());
+            openRS.add(pshh.executeQuery());
+            openRS.add(psch.executeQuery());
             
             // Statements not returning ResultSet's should be ok
             if (!TestUtil.isDerbyNetClientFramework()) { // DERBY-1159
@@ -955,31 +947,24 @@
             pshh_d.executeUpdate();
             psch_d.executeUpdate();
             }
-             
-            // Statements obtained while default was close.
-            // Only sch should work as held cursors not supported in XA
-            sdc.executeQuery("SELECT * FROM APP.FOO").close();
-            if (TestUtil.isDerbyNetClientFramework()) { // DERBY-1158
-            shc.executeQuery("SELECT * FROM APP.FOO").close();
-            }
-            scc.executeQuery("SELECT * FROM APP.FOO").close();
-            
+
             // Statements not returning ResultSet's should be ok
             if (!TestUtil.isDerbyNetClientFramework()) { // DERBY-1159
             sdc.executeUpdate("DELETE FROM APP.FOO where A < -99");
             shc.executeUpdate("DELETE FROM APP.FOO where A < -99");
             scc.executeUpdate("DELETE FROM APP.FOO where A < -99");
-            }
+            }             
+ 
+            // Statements obtained while default was close.
+            // all should return close on commit ResultSets
+            openRS.add(sdc.executeQuery("SELECT * FROM APP.FOO"));
+            openRS.add(shc.executeQuery("SELECT * FROM APP.FOO"));
+            openRS.add(scc.executeQuery("SELECT * FROM APP.FOO"));
             
             // PreparedStatements obtained while default was close.
-           psdc.executeQuery().close();
-           try {
-                pshc.executeQuery().close();
-                System.out.println("FAIL - held Statement in global");
-            } catch (SQLException e) {
-                TestUtil.dumpSQLExceptions(e, true);
-            }
-            pscc.executeQuery().close();
+            openRS.add(psdc.executeQuery());
+            openRS.add(pshc.executeQuery());
+            openRS.add(pscc.executeQuery());
             
             // Statements not returning ResultSet's should be ok
             if (!TestUtil.isDerbyNetClientFramework()) { // DERBY-1159
@@ -987,6 +972,19 @@
             pshc_d.executeUpdate();
             pscc_d.executeUpdate();
             }
+            
+            // All the ResultSets should be open. Run a simple
+            // test, clearWarnings throws an error if the ResultSet
+            // is closed. Also would be nice here to use the new
+            // JDBC 4.0 method getHoldabilty to ensure the
+            // holdability is reported correctly.
+            int orsCount = 0;
+            for (Iterator i = openRS.iterator(); i.hasNext();) {
+                ResultSet ors = (ResultSet) i.next();
+                ors.clearWarnings();
+                orsCount++;
+            }
+            System.out.println("Global transaction open ResultSets " + orsCount);
 
                    
             // Test we cannot switch the connection to holdable
@@ -1015,12 +1013,64 @@
                 ResultSet.HOLD_CURSORS_OVER_COMMIT);
             showHoldStatus("Global prepareStatement(hold)", psglobalhold);
             psglobalhold.close();
-
+            
+            if (!TestUtil.isDerbyNetClientFramework()) { //DERBY-1158 in progress
+            // Show the holdability for all the Statements while
+            // in the global transaction, all should be close on commit.
+            showHoldStatus("Global xact Statement sdh ", sdh);
+            showHoldStatus("Global xact Statement shh ", shh);
+            showHoldStatus("Global xact Statement sch ", sch);
+            
+            showHoldStatus("Global xact Statement psdh ", psdh);
+            showHoldStatus("Global xact Statement pshh ", pshh);
+            showHoldStatus("Global xact Statement psch ", psch);
+            
+            showHoldStatus("Global xact Statement sdc ", sdc);
+            showHoldStatus("Global xact Statement shc ", shc);
+            showHoldStatus("Global xact Statement scc ", scc);
+ 
+            showHoldStatus("Global xact Statement psdh_d ", psdh_d);
+            showHoldStatus("Global xact Statement pshh_d ", pshh_d);
+            showHoldStatus("Global xact Statement psch_d ", psch_d);
+            }
+ 
         
             xar.end(xid, XAResource.TMSUCCESS);
             if (xar.prepare(xid) != XAResource.XA_RDONLY)
                 System.out.println("FAIL prepare didn't indicate r/o");
             
+            // All the ResultSets should be closed. Run a simple
+            // test, clearWarnings throws an error if the ResultSet
+            // is closed.
+            int crsCount = 0;
+            for (Iterator i = openRS.iterator(); i.hasNext();) {
+                ResultSet crs = (ResultSet) i.next();
+                try {
+                    crs.clearWarnings();
+                } catch (SQLException sqle) {
+                }
+                crsCount++;
+            }
+            System.out.println("After global transaction closed ResultSets " + crsCount);
+
+            
+            // Check the statements revert to holdable as required.
+            showHoldStatus("Global xact Statement sdh ", sdh);
+            showHoldStatus("Global xact Statement shh ", shh);
+            showHoldStatus("Global xact Statement sch ", sch);
+            
+            showHoldStatus("Global xact Statement psdh ", psdh);
+            showHoldStatus("Global xact Statement pshh ", pshh);
+            showHoldStatus("Global xact Statement psch ", psch);
+ 
+            showHoldStatus("Global xact Statement sdc ", sdc);
+            showHoldStatus("Global xact Statement shc ", shc);
+            showHoldStatus("Global xact Statement scc ", scc);
+            
+            showHoldStatus("Global xact Statement psdh_d ", psdh_d);
+            showHoldStatus("Global xact Statement pshh_d ", pshh_d);
+            showHoldStatus("Global xact Statement psch_d ", psch_d);
+            
             conn.close();
             
             System.out.println("derby966 complete");
@@ -1104,6 +1154,7 @@
             System.out.println(w.getSQLState() + " :" + w.toString());
             w = w.getNextWarning();
         }
+        s.getConnection().clearWarnings();
         
     }
     /**

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource.java?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource.java Thu Apr  6 14:01:15 2006
@@ -464,8 +464,6 @@
 
 		// now check re-use of *Statement objects across local/global connections.
 		System.out.println("TESTING RE_USE OF STATEMENT OBJECTS");
-		System.out.println("THE STATEMENT OBJECTS CAN NOT BE REUSED ACROSS LOCAL/GLOBAL CONNECTIONS BECAUSE, LOCAL CONNECTION CREATES THEM");
-		System.out.println("WITH HOLDABILITY TRUE WHEREAS GLOBAL CONNECTION CAN ONLY WORK WITH STATEMENTS WITH HOLDABILITY FALSE");
 		cs1 = xac.getConnection();
 
     
@@ -493,24 +491,18 @@
 		cs1.commit(); // need to commit to switch to an global connection;
 		xid = new cdsXid(1, (byte) 103, (byte) 119);
 		xar.start(xid, XAResource.TMNOFLAGS); // simple case - underlying connection is re-used for global.
-		System.out.println("Expecting exception because global transaction sru1-global-2 is trying to use a statement with holdability true");
+		System.out.println("Expecting downgrade because global transaction sru1-global-2 is using a statement with holdability true");
 		queryOnStatement("sru1-global-2", cs1, sru1);
 		sruBatch.addBatch("insert into ru values 5");
 		Statement sru2 = cs1.createStatement();
 		sru2.setCursorName("OAK2");
 		queryOnStatement("sru2-global-3", cs1, sru2);
-		System.out.println("Expecting exception because global transaction sru1-global-4 is trying to use a statement with holdability true");
+		System.out.println("Expecting downgrade because global transaction sru1-global-4 is using a statement with holdability true");
 		queryOnStatement("sru1-global-4", cs1, sru1);
 		showStatementState("GLOBAL ", sruState);
 		showStatementState("PS GLOBAL ", psruState);
 		showStatementState("CS GLOBAL ", csruState);
-		try {
-			resultSetQuery("Params-global-1", psParams.executeQuery());
-			System.out.println("FAIL: should have gotten exception because holdability is true on prepared statement and that is not allowed in global transactions");
-		} catch (SQLException ex) {
-			System.out.println("PASS: got exception because holdability is true on prepared statement and that is not allowed in global transactions");
-			System.out.println(ex.getMessage());
-		}
+		resultSetQuery("Params-global-1", psParams.executeQuery());
 
 		xar.end(xid, XAResource.TMSUCCESS);
 		// now a new underlying connection is created

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java
URL: http://svn.apache.org/viewcvs/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java?rev=392073&r1=392072&r2=392073&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java Thu Apr  6 14:01:15 2006
@@ -355,47 +355,22 @@
            shxa.close();
            
            
-			// check we cannot use a holdable statement set up in local mode.
+			// check we can use a holdable statement set up in local mode.
+            // holdability is downgraded, tested in XATest.java
 			System.out.println("STATEMENT HOLDABILITY " + (sh.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT));
-			try {
-				sh.executeQuery("select id from hold_30");
-				System.out.println("FAIL used held statement in global transaction");
-			} catch (SQLException sqle) {
-				System.out.println("Expected SQLException (local Statement hold) " + sqle.getMessage());
-			}
-			try {
-				sh.execute("select id from hold_30");
-				System.out.println("FAIL used held statement in global transaction");
-			} catch (SQLException sqle) {
-				System.out.println("Expected SQLException (local Statement hold) " + sqle.getMessage());
-			}
-			System.out.println("PREPARED STATEMENT HOLDABILITY " + (psh.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT));
-			try {
-				psh.executeQuery();
-				System.out.println("FAIL used held prepared statement in global transaction");
-			} catch (SQLException sqle) {
-				System.out.println("Expected SQLException (local PreparedStatement hold) " + sqle.getMessage());
-			}
-			try {
-				psh.execute();
-				System.out.println("FAIL used held prepared statement in global transaction");
-			} catch (SQLException sqle) {
-				System.out.println("Expected SQLException (local PreparedStatement hold) " + sqle.getMessage());
-			}
+			sh.executeQuery("select id from hold_30").close();
+			sh.execute("select id from hold_30");
+            sh.getResultSet().close();
+
+            System.out.println("PREPARED STATEMENT HOLDABILITY " + (psh.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT));
+			psh.executeQuery().close();
+			psh.execute();
+            psh.getResultSet().close();
 
 			System.out.println("CALLABLE STATEMENT HOLDABILITY " + (csh.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT));
-			try {
-				csh.executeQuery();
-				System.out.println("FAIL used held callable statement in global transaction");
-			} catch (SQLException sqle) {
-				System.out.println("Expected SQLException (local CallableStatement hold) " + sqle.getMessage());
-			}
-			try {
-				csh.execute();
-				System.out.println("FAIL used held callable statement in global transaction");
-			} catch (SQLException sqle) {
-				System.out.println("Expected SQLException (local CallableStatement hold) " + sqle.getMessage());
-			}
+			csh.executeQuery().close();
+			csh.execute();
+            csh.getResultSet().close();
 
 			// but an update works
 			sh.executeUpdate("insert into hold_30 values(10, 'init10')");