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/07 18:47:41 UTC
svn commit: r392333 - in /db/derby/code/branches/10.1/java:
client/org/apache/derby/client/am/ engine/org/apache/derby/iapi/jdbc/
engine/org/apache/derby/iapi/reference/ engine/org/apache/derby/loc/
testing/org/apache/derbyTesting/functionTests/master/...
Author: djd
Date: Fri Apr 7 09:47:39 2006
New Revision: 392333
URL: http://svn.apache.org/viewcvs?rev=392333&view=rev
Log:
DERBY-1158 (partial) Implement downgrading a request to create any holdable statement in a global
transaction to return a non-holdable statement. Such a downgrade adds a SQLWarning to the Connection
object. This follows section 16.1.3.1 from JDBC 4.0 proposed final draft.
Merge of 391383 from trunk
Modified:
db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java
db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/BrokeredConnection.java
db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/EngineConnection.java
db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/reference/SQLState.java
db/derby/code/branches/10.1/java/engine/org/apache/derby/loc/messages_en.properties
db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out
db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out
db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out
db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java
db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java
Modified: db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java (original)
+++ db/derby/code/branches/10.1/java/client/org/apache/derby/client/am/Connection.java Fri Apr 7 09:47:39 2006
@@ -1237,12 +1237,19 @@
// In an XA global transaction do not allow the
// holdability to be set to hold cursors across
// commits, as the engine does not support it.
+ // Downgrade the holdability to CLOSE_CURSORS_AT_COMMIT
+ // and attach a warning. This is specified in
+ // JDBC 4.0 (proposed final draft) section 16.1.3.1
+ // Similar code is not needed for PreparedStatement
+ // as the holdability gets pushed all the way to the
+ // engine and handled there.
if (this.isXAConnection_ && this.xaState_ == XA_T1_ASSOCIATED)
{
- if (resultSetHoldability == ClientDataSource.HOLD_CURSORS_OVER_COMMIT)
- throw new SqlException(agent_.logWriter_,
- "Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.",
- "XJ05C");
+ if (resultSetHoldability == ClientDataSource.HOLD_CURSORS_OVER_COMMIT) {
+ resultSetHoldability = ClientDataSource.CLOSE_CURSORS_AT_COMMIT;
+ accumulateWarning(new SqlWarning(agent_.logWriter_,
+ "ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.", "01J07"));
+ }
}
Statement s = newStatement_(resultSetType, resultSetConcurrency, resultSetHoldability);
s.cursorAttributesToSendOnPrepare_ = s.cacheCursorAttributesToSendOnPrepare();
Modified: db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/BrokeredConnection.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/BrokeredConnection.java?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/BrokeredConnection.java (original)
+++ db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/BrokeredConnection.java Fri Apr 7 09:47:39 2006
@@ -28,7 +28,7 @@
import java.sql.SQLException;
import java.sql.SQLWarning;
-import org.apache.derby.client.am.SqlState;
+import org.apache.derby.impl.jdbc.EmbedSQLWarning;
import org.apache.derby.impl.jdbc.Util;
import java.io.ObjectOutput;
@@ -496,6 +496,15 @@
{
return getRealConnection().getPrepareIsolation();
}
+
+ /**
+ * Add a SQLWarning to this Connection object.
+ * @throws SQLException
+ */
+ public final void addWarning(SQLWarning w) throws SQLException
+ {
+ getRealConnection().addWarning(w);
+ }
/**
* Get the string representation for the underlying physical
@@ -585,8 +594,12 @@
throws SQLException
{
int holdability = control.checkHoldCursors(resultSetHoldability, true);
- if (holdability != resultSetHoldability)
- throw Util.generateCsSQLException(SQLState.CANNOT_HOLD_CURSOR_XA);
+ if (holdability != resultSetHoldability) {
+ SQLWarning w =
+ EmbedSQLWarning.newEmbedSQLWarning(SQLState.HOLDABLE_RESULT_SET_NOT_AVAILABLE);
+
+ addWarning(w);
+ }
return holdability;
Modified: db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/EngineConnection.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/EngineConnection.java?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/EngineConnection.java (original)
+++ db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/jdbc/EngineConnection.java Fri Apr 7 09:47:39 2006
@@ -22,6 +22,7 @@
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
+import java.sql.SQLWarning;
import org.apache.derby.iapi.reference.SQLState;
import org.apache.derby.iapi.sql.execute.ExecutionContext;
@@ -82,5 +83,13 @@
* Can be removed once JDK 1.3 is no longer supported.
*/
public int getHoldability() throws SQLException;
+
+ /**
+ * Add a SQLWarning to this Connection object.
+ * @param newWarning Warning to be added, will be chained to any
+ * existing warnings.
+ */
+ public void addWarning(SQLWarning newWarning)
+ throws SQLException;
}
Modified: db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/reference/SQLState.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/reference/SQLState.java?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/reference/SQLState.java (original)
+++ db/derby/code/branches/10.1/java/engine/org/apache/derby/iapi/reference/SQLState.java Fri Apr 7 09:47:39 2006
@@ -1439,6 +1439,7 @@
String LANG_TYPE_NOT_SERIALIZABLE = "01J04";
String UPGRADE_SPSRECOMPILEFAILED = "01J05";
String QUERY_NOT_QUALIFIED_FOR_UPDATABLE_RESULTSET = "01J06";
+ String HOLDABLE_RESULT_SET_NOT_AVAILABLE = "01J07";
//following are database severity
Modified: db/derby/code/branches/10.1/java/engine/org/apache/derby/loc/messages_en.properties
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/engine/org/apache/derby/loc/messages_en.properties?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/engine/org/apache/derby/loc/messages_en.properties (original)
+++ db/derby/code/branches/10.1/java/engine/org/apache/derby/loc/messages_en.properties Fri Apr 7 09:47:39 2006
@@ -1122,6 +1122,7 @@
01J04=The class ''{0}'' for column ''{1}'' does not implement java.io.Serializable or java.sql.SQLData. Instances must implement one of these interfaces to allow them to be stored.
01J05=Database upgrade succeeded. The upgraded database is now ready for use. Revalidating stored prepared statements failed. See next exception for details of failure.
01J06=ResultSet not updatable. Query does not qualify to generate an updatable ResultSet.
+01J07=ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
XJ001.U=Java exception: ''{1}: {0}''.
XJ050.U=Database requires upgrade from version {0}, set the attribute ''upgrade=true'' on the JDBC connection URL to allow upgrade to version {1}.
Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/DerbyNetClient/jdk14/XATest.out Fri Apr 7 09:47:39 2006
@@ -41,7 +41,7 @@
GXID |STATUS |READONLY |USERNAME |TYPE
-----
(1 |IDLE |NULL |APP |UserTransaction
-EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+OK: query with holdable statement
Statement created in global has holdabilty: false
A
-----
@@ -189,10 +189,9 @@
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.
-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.
-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 createStatement(hold)Statement holdable CLOSE_CURSORS_AT_COMMIT 2
+01J07 :org.apache.derby.client.am.SqlWarning: ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
+Global prepareStatement(hold)Statement holdable HOLD_CURSORS_OVER_COMMIT 1
+01J07 :org.apache.derby.client.am.SqlWarning: ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
derby966 complete
XATest complete
Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/XATest.out Fri Apr 7 09:47:39 2006
@@ -41,7 +41,6 @@
GXID|STATUS |READONLY|USERNAME |TYPE
----------------------------------------------------------------
(1 |IDLE |NULL |APP |UserTransaction
-EXPECTED SQLSTATE(XJ05C): Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
Statement created in global has holdabilty: false
A
-----------
@@ -174,10 +173,10 @@
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.
-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.
-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 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.
derby966 complete
XATest complete
Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/master/checkDataSource30.out Fri Apr 7 09:47:39 2006
@@ -840,9 +840,9 @@
CONNECTION(held) HOLDABILITY true
CONNECTION(xa) HOLDABILITY false
Expected SQLException(setHoldability) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-Expected SQLException (Statement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-Expected SQLException (PreparedStatement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
-Expected SQLException (CallableStatement hold) Cannot set holdability ResultSet.HOLD_CURSORS_OVER_COMMIT for a global transaction.
+HOLDABLE Statement in global xact false connection warning ResultSetHoldability restricted to ResultSet.CLOSE_CURSORS_AT_COMMIT for a global transaction.
+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 true
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.
Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/XATest.java Fri Apr 7 09:47:39 2006
@@ -24,6 +24,7 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.sql.SQLWarning;
import java.sql.Statement;
import java.util.Properties;
@@ -545,15 +546,15 @@
conn.setAutoCommit(false);
// s was created in local mode so it has holdibilty
- // set,
- try {
- s.executeQuery("select * from APP.foo where A >= 2000");
- System.out.println("FAIL: query with holdable statement");
- } catch (SQLException sqle) {
- TestUtil.dumpSQLExceptions(sqle, true);
+ // set, will execute but ResultSet will have close on commit
+
+ if (TestUtil.isDerbyNetClientFramework()) { // DERBY-1158
+ s.executeQuery("select * from APP.foo where A >= 2000").close();
+ System.out.println("OK: query with holdable statement");
}
s.close();
-
+
+
s = conn.createStatement();
boolean holdable = s.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT;
System.out.println("Statement created in global has holdabilty: "
@@ -890,18 +891,11 @@
xar.start(xid, XAResource.TMNOFLAGS);
// Statements obtained while default was hold.
- // Only sch should work as held cursors not supported in XA
- try {
- sdh.executeQuery("SELECT * FROM APP.FOO").close();
- System.out.println("FAIL - held Statement in global");
- } catch (SQLException e) {
- TestUtil.dumpSQLExceptions(e, true);
- }
- try {
- shh.executeQuery("SELECT * FROM APP.FOO").close();
- System.out.println("FAIL - held Statement in global");
- } catch (SQLException e) {
- TestUtil.dumpSQLExceptions(e, true);
+ // 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();
@@ -909,13 +903,13 @@
// Only sch should work as held cursors not supported in XA
try {
psdh.executeQuery().close();
- System.out.println("FAIL - held Statement in global");
+ 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");
+ System.out.println("FAIL - held Statement in global pshh");
} catch (SQLException e) {
TestUtil.dumpSQLExceptions(e, true);
}
@@ -924,11 +918,8 @@
// Statements obtained while default was close.
// Only sch should work as held cursors not supported in XA
sdc.executeQuery("SELECT * FROM APP.FOO").close();
- try {
- shc.executeQuery("SELECT * FROM APP.FOO").close();
- System.out.println("FAIL - held Statement in global");
- } catch (SQLException e) {
- TestUtil.dumpSQLExceptions(e, true);
+ if (TestUtil.isDerbyNetClientFramework()) { // DERBY-1158
+ shc.executeQuery("SELECT * FROM APP.FOO").close();
}
scc.executeQuery("SELECT * FROM APP.FOO").close();
@@ -943,7 +934,6 @@
pscc.executeQuery().close();
// Test we cannot switch the connection to holdable
- // or create a statement with holdable.
try {
conn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);
System.out.println("FAIL - set holdability in global xact.");
@@ -952,25 +942,25 @@
TestUtil.dumpSQLExceptions(sqle, true);
}
- try {
- conn.createStatement(
+ // JDBC 4.0 (proposed final draft) section allows
+ // drivers to change the holdability when creating
+ // a Statement object and attach a warning to the Connection.
+ Statement sglobalhold = conn.createStatement(
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
- System.out.println("FAIL - Statement holdability in global xact.");
- } catch (SQLException sqle) {
- TestUtil.dumpSQLExceptions(sqle, true);
- }
- try {
- conn.prepareStatement(
+ showHoldStatus("Global createStatement(hold)", sglobalhold);
+ sglobalhold.close();
+
+ PreparedStatement psglobalhold = conn.prepareStatement(
"SELECT * FROM APP.FOO",
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY,
ResultSet.HOLD_CURSORS_OVER_COMMIT);
- System.out.println("FAIL - PreparedStatement holdability in global xact.");
- } catch (SQLException sqle) {
- TestUtil.dumpSQLExceptions(sqle, true);
- }
+ showHoldStatus("Global prepareStatement(hold)", psglobalhold);
+ psglobalhold.close();
+
+
xar.end(xid, XAResource.TMSUCCESS);
if (xar.prepare(xid) != XAResource.XA_RDONLY)
System.out.println("FAIL prepare didn't indicate r/o");
@@ -1052,6 +1042,13 @@
{
System.out.println(tag + "Statement holdable " +
holdStatus(s.getResultSetHoldability()));
+ SQLWarning w = s.getConnection().getWarnings();
+ while (w != null)
+ {
+ System.out.println(w.getSQLState() + " :" + w.toString());
+ w = w.getNextWarning();
+ }
+
}
/**
* Show the held status of the Connection.
Modified: db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java
URL: http://svn.apache.org/viewcvs/db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java?rev=392333&r1=392332&r2=392333&view=diff
==============================================================================
--- db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java (original)
+++ db/derby/code/branches/10.1/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/checkDataSource30.java Fri Apr 7 09:47:39 2006
@@ -300,27 +300,34 @@
}
// try to create a statement with held attributes
- try {
- Statement shxa = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
- System.out.println("FAIL opened statement with hold cursor attribute in global transaction");
- } catch (SQLException sqle) {
- System.out.println("Expected SQLException (Statement hold) " + sqle.getMessage());
- }
- try {
- Statement shxa = conn.prepareStatement("select id from hold_30",
+ // JDBC 4.0 (proposed final draft) section 16.1.3.1 allows Statements to
+ // be created with a different holdability if the driver cannot support it.
+ // In this case the driver does not support holdability in a global transaction
+ // so a valid statement is returned with close cursors on commit,
+
+ Statement shxa = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,
+ ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
+ System.out.println("HOLDABLE Statement in global xact " +
+ (s.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT) +
+ " connection warning " + conn.getWarnings().getMessage());
+ shxa.close();
+
+
+ shxa = conn.prepareStatement("select id from hold_30",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
- System.out.println("FAIL opened statement with hold cursor attribute in global transaction");
- } catch (SQLException sqle) {
- System.out.println("Expected SQLException (PreparedStatement hold) " + sqle.getMessage());
- }
- try {
- Statement shxa = conn.prepareCall("CALL XXX.TTT()",
+ System.out.println("HOLDABLE PreparedStatement in global xact " +
+ (s.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT) +
+ " connection warning " + conn.getWarnings().getMessage());
+ shxa.close();
+
+ shxa = conn.prepareCall("CALL SYSCS_UTIL.SYSCS_CHECKPOINT_DATABASE()",
ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT);
- System.out.println("FAIL opened statement with hold cursor attribute in global transaction");
- } catch (SQLException sqle) {
- System.out.println("Expected SQLException (CallableStatement hold) " + sqle.getMessage());
- }
-
+ System.out.println("HOLDABLE CallableStatement in global xact " +
+ (s.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT) +
+ " connection warning " + conn.getWarnings().getMessage());
+ shxa.close();
+
+
// check we cannot use a holdable statement set up in local mode.
System.out.println("STATEMENT HOLDABILITY " + (sh.getResultSetHoldability() == ResultSet.HOLD_CURSORS_OVER_COMMIT));
try {