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 ma...@apache.org on 2008/02/25 18:23:17 UTC

svn commit: r630941 - in /db/derby/code/branches/10.3/java: engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData40.java testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestDbMetaData.java

Author: mamta
Date: Mon Feb 25 09:22:58 2008
New Revision: 630941

URL: http://svn.apache.org/viewvc?rev=630941&view=rev
Log:
Merging revision 629395 from trunk into 10.3 codeline. The reason for merge is I would like
to merge changes for DERBY-3304 (629926) into trunk but that revision depends on
DERBY-3404 (629712) which depends on DERBY-3422 (629395)

The commit comments for 629395 were as follows

DERBY-3422: Embedded returns wrong value for DatabaseMetaData.autoCommitFailureClosesAllResultSets()

Return the correct value (true) and update the test so that it is able
to detect differences between returned value and actual behaviour. 


Modified:
    db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData40.java
    db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestDbMetaData.java

Modified: db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData40.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData40.java?rev=630941&r1=630940&r2=630941&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData40.java (original)
+++ db/derby/code/branches/10.3/java/engine/org/apache/derby/impl/jdbc/EmbedDatabaseMetaData40.java Mon Feb 25 09:22:58 2008
@@ -64,10 +64,16 @@
     public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException {
         return true;
     }
-     
+
+    /**
+     * Returns whether or not all open {@code ResultSet}s on a {@code
+     * Connection} are closed if an error occurs when auto-commit in enabled.
+     *
+     * @return {@code true}, since the embedded driver will close the open
+     * {@code ResultSet}s
+     */
     public boolean autoCommitFailureClosesAllResultSets() throws SQLException {
-        // TODO - find out what this really should be 
-        return false;
+        return true;
     }
    
     public boolean providesQueryObjectGenerator() throws SQLException {

Modified: db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestDbMetaData.java
URL: http://svn.apache.org/viewvc/db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestDbMetaData.java?rev=630941&r1=630940&r2=630941&view=diff
==============================================================================
--- db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestDbMetaData.java (original)
+++ db/derby/code/branches/10.3/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/TestDbMetaData.java Mon Feb 25 09:22:58 2008
@@ -99,7 +99,11 @@
     }
 
     public void testAutoCommitFailureClosesAllResultSets() throws SQLException {
-        assertFalse(meta.autoCommitFailureClosesAllResultSets());
+        if (usingEmbedded()) {
+            assertTrue(meta.autoCommitFailureClosesAllResultSets());
+        } else {
+            assertFalse(meta.autoCommitFailureClosesAllResultSets());
+        }
     }
 
     public void testGetClientInfoProperties() throws SQLException {
@@ -464,33 +468,57 @@
      * @exception SQLException if an unexpected database error occurs
      */
     public void testAutoCommitFailure() throws SQLException {
-        Connection con = getConnection();
-        con.setAutoCommit(true);
 
-        Statement s1 =
-            con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
-                                ResultSet.CONCUR_READ_ONLY,
-                                ResultSet.HOLD_CURSORS_OVER_COMMIT);
-        ResultSet resultSet = s1.executeQuery("VALUES (1, 2), (3, 4)");
+        // IMPORTANT: use auto-commit
+        getConnection().setAutoCommit(true);
+
+        ResultSet[] rss = new ResultSet[2];
+        // Use different statements so that both result sets are kept open
+        rss[0] = createStatement().executeQuery("VALUES 1, 2, 3, 4");
+        rss[1] = createStatement().executeQuery(
+                "SELECT * FROM SYSIBM.SYSDUMMY1");
+
+        // We want to test holdable result sets
+        for (ResultSet rs : rss) {
+            assertEquals("ResultSet should be holdable",
+                         ResultSet.HOLD_CURSORS_OVER_COMMIT,
+                         rs.getHoldability());
+        }
 
-        Statement s2 = con.createStatement();
         try {
             String query =
                 "SELECT dummy, nonexistent, phony FROM imaginarytable34521";
-            s2.execute(query);
+            // Create a new statement so we don't close any of the open result
+            // sets by re-executing a statement.
+            createStatement().execute(query);
             fail("Query didn't fail.");
         } catch (SQLException e) {
             // should fail, but we don't care how
         }
 
+        int closedResultSets = 0;
+        for (ResultSet rs : rss) {
+            // check if an operation fails with "ResultSet is closed"
+            try {
+                rs.next();
+                // OK, didn't fail, ResultSet wasn't closed
+            } catch (SQLException sqle) {
+                assertSQLState("XCL16", sqle);
+                // OK, ResultSet is closed, increase counter
+                closedResultSets++;
+            }
+        }
+
+        boolean allResultSetsWereClosed = (closedResultSets == rss.length);
+
         assertEquals("autoCommitFailureClosesAllResultSets() returned value " +
                      "which doesn't match actual behaviour.",
-                     resultSet.isClosed(),
+                     allResultSetsWereClosed,
                      meta.autoCommitFailureClosesAllResultSets());
 
-        resultSet.close();
-        s1.close();
-        s2.close();
+        for (ResultSet rs : rss) {
+            rs.close();
+        }
     }
 
     public void testIsWrapperForPositive() throws SQLException {