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 2007/03/27 13:53:58 UTC

svn commit: r522873 - in /db/derby/code/trunk/java: client/org/apache/derby/client/am/ client/org/apache/derby/client/net/ testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/ testing/o...

Author: kahatlen
Date: Tue Mar 27 04:53:57 2007
New Revision: 522873

URL: http://svn.apache.org/viewvc?view=rev&rev=522873
Log:
DERBY-2443: Implement ResultSet updateClob/updateBlob methods on the
NetworkClient

Patch contributed by V. Narayanan.

Modified:
    db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java
    db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ResultSetTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/ResultSetJDBC30Test.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/UpdatableResultSetTest.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdatableResultSetTest.java

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java?view=diff&rev=522873&r1=522872&r2=522873
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/am/ResultSet.java Tue Mar 27 04:53:57 2007
@@ -3805,20 +3805,124 @@
         throw jdbc3MethodNotSupported();
     }
 
+    /**
+     * Updates the designated column with a <code>java.sql.Blob</code> value.
+     * The updater methods are used to update column values in the
+     * current row or the insert row.  The updater methods do not
+     * update the underlying database; instead the <code>updateRow</code> or
+     * <code>insertRow</code> methods are called to update the database.
+     *
+     * @param columnIndex the first column is 1, the second is 2, ...
+     * @param x the new column value
+     * @throws SQLException if the columnIndex is not valid;
+     * if a database access error occurs;
+     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     * or this method is called on a closed result set
+     */
     public void updateBlob(int columnIndex, java.sql.Blob x) throws SQLException {
-        throw jdbc3MethodNotSupported();
+        synchronized (connection_) {
+            if (agent_.loggingEnabled()) {
+                agent_.logWriter_.traceEntry(this, "updateBlob",
+                        columnIndex, x);
+            }
+            try {
+                checkUpdatePreconditions(columnIndex, "updateBlob");
+                updateColumn(columnIndex,
+                             agent_.crossConverters_.setObject(
+                                    resultSetMetaData_.types_[columnIndex -1],
+                                    x));
+            } catch (SqlException se) {
+                throw se.getSQLException();
+            }
+        }
     }
 
+    /**
+     * Updates the designated column with a <code>java.sql.Blob</code> value.
+     * The updater methods are used to update column values in the
+     * current row or the insert row.  The updater methods do not
+     * update the underlying database; instead the <code>updateRow</code> or
+     * <code>insertRow</code> methods are called to update the database.
+     *
+     * @param columnName the label for the column specified with the SQL AS
+     * clause. If the SQL AS clause was not specified, then the label is the
+     * name of the column
+     * @param x the new column value
+     * @throws SQLException if the columnLabel is not valid;
+     * if a database access error occurs;
+     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     * or this method is called on a closed result set
+     */
     public void updateBlob(String columnName, java.sql.Blob x) throws SQLException {
-        throw jdbc3MethodNotSupported();
+        try {
+            updateBlob(findColumnX(columnName), x);
+        } catch (SqlException se) {
+            throw se.getSQLException();
+        }
     }
-
-    public void updateClob(int columnIndex, java.sql.Clob x) throws SQLException {
-        throw jdbc3MethodNotSupported();
+  
+    /**
+     * Updates the designated column using the given input stream, which
+     * will have the specified number of bytes.
+     * The updater methods are used to update column values in the
+     * current row or the insert row.  The updater methods do not
+     * update the underlying database; instead the <code>updateRow</code> or
+     * <code>insertRow</code> methods are called to update the database.
+     *
+     * @param columnIndex the first column is 1, the second is 2, ...
+     * @param x An object that contains the data to set the parameter
+     * value to.
+     * @param length the number of bytes in the parameter data.
+     * @exception SQLException if the columnIndex is not valid;
+     * if a database access error occurs;
+     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     * or this method is called on a closed result set
+     */
+    public void updateBlob(int columnIndex, InputStream x, long length)
+                            throws SQLException {
+        synchronized (connection_) {
+            if (agent_.loggingEnabled()) {
+                agent_.logWriter_.traceEntry(this, "updateBlob",
+                        columnIndex, x, (int)length);
+            }
+            try {
+                checkUpdatePreconditions(columnIndex, "updateBlob");
+                updateColumn(columnIndex,
+                             agent_.crossConverters_.setObject(
+                                    resultSetMetaData_.types_[columnIndex -1],
+                                    new Blob(agent_, x, (int)length)));
+            } catch (SqlException se) {
+                throw se.getSQLException();
+            }
+        }
     }
 
-    public void updateClob(String columnName, java.sql.Clob x) throws SQLException {
-        throw jdbc3MethodNotSupported();
+    /**
+     * Updates the designated column using the given input stream, which
+     * will have the specified number of bytes.
+     * The updater methods are used to update column values in the
+     * current row or the insert row.  The updater methods do not
+     * update the underlying database; instead the <code>updateRow</code> or
+     * <code>insertRow</code> methods are called to update the database.
+     *
+     * @param columnName the label for the column specified with the
+     * SQL AS clause.  If the SQL AS clause was not specified, then the
+     * label is the name of the column
+     * @param x An object that contains the data to set the parameter
+     * value to.
+     * @param length the number of bytes in the parameter data.
+     * @exception SQLException if the columnLabel is not valid;
+     * if a database access error occurs;
+     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     * or this method is called on a closed result set
+     */
+    public void updateBlob(String columnName, InputStream x, long length)
+                           throws SQLException {
+        try {
+            updateBlob(findColumnX(columnName), x, length);
+        } catch (SqlException se) {
+            throw se.getSQLException();
+        }
     }
 
     public void updateArray(int columnIndex, java.sql.Array x) throws SQLException {
@@ -5917,6 +6021,145 @@
             throws SQLException {
         try {
             updateClob(findColumnX(columnLabel), reader);
+        } catch (SqlException se) {
+            throw se.getSQLException();
+        }
+    }
+      
+    /**
+     * Updates the designated column using the given <code>Reader</code>
+     * object, which is the given number of characters long.
+     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * parameter, it may be more practical to send it via a
+     * <code>java.io.Reader</code> object. The JDBC driver will
+     * do any necessary conversion from UNICODE to the database char format.
+     *
+     * <p>
+     * The updater methods are used to update column values in the
+     * current row or the insert row.  The updater methods do not
+     * update the underlying database; instead the <code>updateRow</code> or
+     * <code>insertRow</code> methods are called to update the database.
+     *
+     * @param columnIndex the first column is 1, the second is 2, ...
+     * @param x An object that contains the data to set the parameter value to.
+     * @param length the number of characters in the parameter data.
+     * @exception SQLException if the columnIndex is not valid;
+     * if a database access error occurs;
+     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     * or this method is called on a closed result set
+     * @throws SQLFeatureNotSupportedException if the JDBC driver does not
+     * support this method
+     */
+    public void updateClob(int columnIndex, Reader x, long length)
+                throws SQLException {
+        synchronized (connection_) {
+            if (agent_.loggingEnabled()) {
+                agent_.logWriter_.traceEntry(this, "updateClob",
+                        columnIndex, x, (int)length);
+            }
+            try {
+                checkUpdatePreconditions(columnIndex, "updateClob");
+                updateColumn(columnIndex,
+                             agent_.crossConverters_.setObject(
+                                 resultSetMetaData_.types_[columnIndex -1],
+                                 new Clob(agent_, x, (int)length)));
+            } catch (SqlException se) {
+                throw se.getSQLException();
+            }
+        }
+    }
+
+    /**
+     * Updates the designated column using the given <code>Reader</code>
+     * object, which is the given number of characters long.
+     * When a very large UNICODE value is input to a <code>LONGVARCHAR</code>
+     * parameter, it may be more practical to send it via a
+     * <code>java.io.Reader</code> object.  The JDBC driver will
+     * do any necessary conversion from UNICODE to the database char format.
+     *
+     * <p>
+     * The updater methods are used to update column values in the
+     * current row or the insert row.  The updater methods do not
+     * update the underlying database; instead the <code>updateRow</code> or
+     * <code>insertRow</code> methods are called to update the database.
+     *
+     * @param columnName the label for the column specified with the
+     * SQL AS clause.  If the SQL AS clause was not specified,
+     * then the label is the name of the column
+     * @param x An object that contains the data to set the parameter value to.
+     * @param length the number of characters in the parameter data.
+     * @exception SQLException if the columnLabel is not valid;
+     * if a database access error occurs;
+     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     * or this method is called on a closed result set
+     * @throws SQLFeatureNotSupportedException if the JDBC driver does not
+     * support this method
+     */
+
+    public void updateClob(String columnName, Reader x, long length)
+                           throws SQLException {
+        try {
+            updateClob(findColumnX(columnName), x);
+        } catch (SqlException se) {
+            throw se.getSQLException();
+        }
+    }
+   
+    /**
+     * Updates the designated column with a <code>java.sql.Clob</code> value.
+     * The updater methods are used to update column values in the
+     * current row or the insert row.  The updater methods do not
+     * update the underlying database; instead the <code>updateRow</code> or
+     * <code>insertRow</code> methods are called to update the database.
+     *
+     * @param columnIndex the label for the column specified with the SQL AS
+     *                    clause. If the SQL AS clause was not specified, then
+     *                    the label is the name of the column
+     * @param x the new column value
+     * @throws SQLException if the columnLabel is not valid;
+     * if a database access error occurs;
+     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     * or this method is called on a closed result set
+     */
+    public void updateClob(int columnIndex, java.sql.Clob x)
+            throws SQLException {
+        synchronized (connection_) {
+            if (agent_.loggingEnabled()) {
+                agent_.logWriter_.traceEntry(this, "updateClob",
+                        columnIndex, x);
+            }
+            try {
+                checkUpdatePreconditions(columnIndex, "updateClob");
+                updateColumn(columnIndex,
+                             agent_.crossConverters_.setObject(
+                                 resultSetMetaData_.types_[columnIndex -1],
+                                 x));
+            } catch (SqlException se) {
+                throw se.getSQLException();
+            }
+        }
+    }
+
+    /**
+     * Updates the designated column with a <code>java.sql.Clob</code> value.
+     * The updater methods are used to update column values in the
+     * current row or the insert row.  The updater methods do not
+     * update the underlying database; instead the <code>updateRow</code> or
+     * <code>insertRow</code> methods are called to update the database.
+     *
+     * @param columnLabel the label for the column specified with the SQL AS
+     *                    clause. If the SQL AS clause was not specified, then
+     *                    the label is the name of the column
+     * @param x the new column value
+     * @throws SQLException if the columnLabel is not valid;
+     * if a database access error occurs;
+     * the result set concurrency is <code>CONCUR_READ_ONLY</code>
+     * or this method is called on a closed result set
+     */
+    public void updateClob(String columnLabel, java.sql.Clob x)
+            throws SQLException {
+        try {
+            updateClob(findColumnX(columnLabel), x);
         } catch (SqlException se) {
             throw se.getSQLException();
         }

Modified: db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java?view=diff&rev=522873&r1=522872&r2=522873
==============================================================================
--- db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java (original)
+++ db/derby/code/trunk/java/client/org/apache/derby/client/net/NetResultSet40.java Tue Mar 27 04:53:57 2007
@@ -188,103 +188,7 @@
             throw se.getSQLException();
         }
     }
-    
-    /**
-     * Updates the designated column with a java.sql.Blob value. The updater
-     * methods are used to update column values in the current row or the insert
-     * row. The updater methods do not update the underlying database; instead
-     * the updateRow or insertRow methods are called to update the database.
-     *
-     * @param columnIndex -
-     *            the first column is 1, the second is 2
-     * @param x -
-     *            the new column value
-     * @param length -
-     *            the length of the Blob datatype
-     * @exception SQLException
-     *
-     */
-    public void updateBlob(int columnIndex, InputStream x, long length)
-                            throws SQLException {
-        throw SQLExceptionFactory.notImplemented("updateBlob(int,InputStream,long)");
-    }
 
-    /**
-     * Updates the designated column with a java.sql.Blob value. The updater
-     * methods are used to update column values in the current row or the insert
-     * row. The updater methods do not update the underlying database; instead
-     * the updateRow or insertRow methods are called to update the database.
-     *
-     * @param columnName -
-     *            the name of the column to be updated
-     * @param x -
-     *            the new column value
-     * @param length -
-     *            the length of the Blob datatype
-     * @exception SQLException
-     *
-     */
-
-    public void updateBlob(String columnName, InputStream x, long length)
-                           throws SQLException {
-        throw SQLExceptionFactory.notImplemented("updateBlob(String,inputStream,long)");
-    }
-
-    /**
-     * Updates the designated column with a java.sql.Clob value. The updater
-     * methods are used to update column values in the current row or the insert
-     * row. The updater methods do not update the underlying database; instead
-     * the updateRow or insertRow methods are called to update the database.
-     *
-     * @param columnIndex -
-     *            the first column is 1, the second is 2
-     * @param x -
-     *            the new column value
-     * @exception SQLException
-     *                Feature not implemented for now.
-     */
-    public void updateClob(int columnIndex, Reader x, long length)
-                throws SQLException {
-        throw SQLExceptionFactory.notImplemented("updateClob(int,Reader,long)");
-    }
-
-    /**
-     * Updates the designated column with a java.sql.Clob value. The updater
-     * methods are used to update column values in the current row or the insert
-     * row. The updater methods do not update the underlying database; instead
-     * the updateRow or insertRow methods are called to update the database.
-     *
-     * @param columnName -
-     *            the name of the Clob column
-     * @param x -
-     *            the new column value
-     * @exception SQLException
-     *                Feature not implemented for now.
-     */
-
-     public void updateClob(String columnName, InputStream x, long length)
-                           throws SQLException {
-         throw SQLExceptionFactory.notImplemented("updateClob(String,InputStream,long)");
-     }
-
-     /**
-     * Updates the designated column with a java.sql.Clob value. The updater
-     * methods are used to update column values in the current row or the insert
-     * row. The updater methods do not update the underlying database; instead
-     * the updateRow or insertRow methods are called to update the database.
-     *
-     * @param columnName -
-     *            the name of the Clob column
-     * @param x -
-     *            the new column value
-     * @exception SQLException
-     *                Feature not implemented for now.
-     */
-
-     public void updateClob(String columnName, Reader x, long length)
-                           throws SQLException {
-         throw SQLExceptionFactory.notImplemented("updateClob(String,Reader,long)");
-     }
 
      /**
      * Updates the designated column with a java.sql.NClob value. The updater

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ResultSetTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ResultSetTest.java?view=diff&rev=522873&r1=522872&r2=522873
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ResultSetTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbc4/ResultSetTest.java Tue Mar 27 04:53:57 2007
@@ -52,6 +52,11 @@
             0x65, 0x66, 0x67, 0x68, 0x69
         };
 
+    private static final String str1 =
+        "I am the main Input string and I will be Updated";
+
+    private static final String str2 = "I am the string used to update";
+
     /** 
      * Key used to identify inserted rows.
      * Use method <code>requestKey</code> to obtain it. 
@@ -915,7 +920,7 @@
      *
      * @throws SQLException if some error occurs while calling the method
      */
-    public void embeddedUpdateClob()
+    public void testUpdateClob()
     throws Exception {
         //Byte array in which the returned bytes from
         //the Database after the update are stored. This
@@ -1004,13 +1009,47 @@
         rs1.close();
     }
 
+    /**
+     * Test the Clob method that accepts a Input Stream and its length
+     * as input parameter.
+     *
+     * @throws Exception
+     */
+    public void testUpdateClobwithLengthofIS()
+            throws Exception {
+        Reader r1 = new java.io.StringReader(str1);
+        // InputStream for insertion.
+        Reader r2 = new java.io.StringReader(str2);
+
+        // Prepared Statement used to insert the data
+        PreparedStatement ps_sb = prep("dClob");
+        ps_sb.setInt(1, key);
+        ps_sb.setCharacterStream(2, r1);
+        ps_sb.executeUpdate();
+        ps_sb.close();
+
+        // Update operation
+        ResultSet rs1 = fetchUpd("dClob", key);
+        rs1.next();
+        rs1.updateClob(1, r2, str2.length());
+        rs1.updateRow();
+        rs1.close();
+
+        // Query to see whether the data that has been updated.
+        rs1 = fetch("dClob", key);
+        rs1.next();
+        assertEquals(new StringReader(str2),
+                     rs1.getCharacterStream(1));
+        rs1.close();
+    }
+
      /**
      * This methods tests the ResultSet interface method
      * updateBlob
      *
      * @throws SQLException if some error occurs while calling the method
      */
-    public void embeddedUpdateBlob()
+    public void testUpdateBlob()
     throws Exception {
         //Byte array in which the returned bytes from
         //the Database after the update are stored. This
@@ -1099,12 +1138,77 @@
     }
 
     /**
+     * tests the updateBlob that accepts a input stream and the length of the IS.
+     *
+     * @throws an Exception
+     */
+    public void testUpdateBlobWithLengthofIS()
+            throws Exception {
+        InputStream is1 = new java.io.ByteArrayInputStream(BYTES1);
+        // InputStream for insertion.
+        InputStream is2 = new java.io.ByteArrayInputStream(BYTES2);
+
+        // Prepared Statement used to insert the data
+        PreparedStatement ps_sb = prep("dBlob");
+        ps_sb.setInt(1, key);
+        ps_sb.setBinaryStream(2, is1);
+        ps_sb.executeUpdate();
+        ps_sb.close();
+
+        // Update operation
+        ResultSet rs1 = fetchUpd("dBlob", key);
+        rs1.next();
+        rs1.updateBlob(1, is2, BYTES2.length);
+        rs1.updateRow();
+        rs1.close();
+
+        // Query to see whether the data that has been updated.
+        rs1 = fetch("dBlob", key);
+        rs1.next();
+        assertEquals(new ByteArrayInputStream(BYTES2), rs1.getBinaryStream(1));
+        rs1.close();
+    }
+
+    /**
+     * Tests the updateBlob that accepts a input stream and the length of the IS
+     * and the parameter name String.
+     *
+     * @throws an Exception
+     */
+    public void testUpdateBlobStringParameterNameWithLengthofIS()
+            throws Exception {
+        InputStream is1 = new java.io.ByteArrayInputStream(BYTES1);
+        // InputStream for insertion.
+        InputStream is2 = new java.io.ByteArrayInputStream(BYTES2);
+
+        // Prepared Statement used to insert the data
+        PreparedStatement ps_sb = prep("dBlob");
+        ps_sb.setInt(1, key);
+        ps_sb.setBinaryStream(2, is1);
+        ps_sb.executeUpdate();
+        ps_sb.close();
+
+        // Update operation
+        ResultSet rs1 = fetchUpd("dBlob", key);
+        rs1.next();
+        rs1.updateBlob("dBlob", is2, BYTES2.length);
+        rs1.updateRow();
+        rs1.close();
+
+        // Query to see whether the data that has been updated.
+        rs1 = fetch("dBlob", key);
+        rs1.next();
+        assertEquals(new ByteArrayInputStream(BYTES2), rs1.getBinaryStream(1));
+        rs1.close();
+    }
+
+    /**
      * This methods tests the ResultSet interface method
      * updateClob
      *
      * @throws SQLException if some error occurs while calling the method
      */
-    public void embeddedUpdateClobStringParameterName()
+    public void testUpdateClobStringParameterName()
     throws Exception {
         //Byte array in which the returned bytes from
         //the Database after the update are stored. This
@@ -1193,13 +1297,47 @@
         rs1.close();
     }
 
+    /**
+     * Tests the updateClob that accepts a input stream and the length of the IS
+     * and the parameter name String.
+     *
+     * @throws an Exception
+     */
+    public void testUpdateClobStringParameterNameWithLengthofIS()
+            throws Exception {
+        Reader r1 = new java.io.StringReader(str1);
+        // InputStream for insertion.
+        Reader r2 = new java.io.StringReader(str2);
+
+        // Prepared Statement used to insert the data
+        PreparedStatement ps_sb = prep("dClob");
+        ps_sb.setInt(1, key);
+        ps_sb.setCharacterStream(2, r1);
+        ps_sb.executeUpdate();
+        ps_sb.close();
+
+        // Update operation
+        ResultSet rs1 = fetchUpd("dClob", key);
+        rs1.next();
+        rs1.updateClob("dClob", r2, str2.length());
+        rs1.updateRow();
+        rs1.close();
+
+        // Query to see whether the data that has been updated.
+        rs1 = fetch("dClob", key);
+        rs1.next();
+        assertEquals(new StringReader(str2),
+                     rs1.getCharacterStream(1));
+        rs1.close();
+    }
+
      /**
      * This methods tests the ResultSet interface method
      * updateBlob
      *
      * @throws SQLException if some error occurs while calling the method
      */
-    public void embeddedUpdateBlobStringParameterName()
+    public void testUpdateBlobStringParameterName()
     throws Exception {
         //Byte array in which the returned bytes from
         //the Database after the update are stored. This
@@ -1291,42 +1429,10 @@
      **                        T E S T  S E T U P                           *
      ************************************************************************/
 
-    /**
-     * Create suite containing client-only tests.
-     */
-    private static TestSuite clientSuite(String name) {
-        TestSuite clientSuite = new TestSuite(name);
-        return clientSuite;
-    }
-
-    /**
-     * Create suite containing embedded-only tests.
-     */
-    private static TestSuite embeddedSuite(String name) {
-        TestSuite embeddedSuite = new TestSuite(name);
-        embeddedSuite.addTest(new ResultSetTest(
-                    "embeddedUpdateBlob"));
-        embeddedSuite.addTest(new ResultSetTest(
-                    "embeddedUpdateClob"));
-        embeddedSuite.addTest(new ResultSetTest(
-                    "embeddedUpdateClobStringParameterName"));
-        return embeddedSuite;
-    }
-
     public static Test suite() {
         TestSuite rsSuite = new TestSuite("ResultSetTest suite");
-
-        TestSuite embedded = new TestSuite("ResultSetTest:embedded");
-        embedded.addTestSuite(ResultSetTest.class);
-        embedded.addTest(embeddedSuite("ResultSetTest:embedded-only"));
-        rsSuite.addTest(decorateTestSuite(embedded));
-
-        TestSuite client = new TestSuite("ResultSetTest:client");
-        client.addTestSuite(ResultSetTest.class);
-        client.addTest(clientSuite("ResultSetTest:client-only"));
-        rsSuite.addTest(TestConfiguration.clientServerDecorator(
-            decorateTestSuite(client)));
-
+        rsSuite.addTest(decorateTestSuite(TestConfiguration.defaultSuite
+            (ResultSetTest.class,false)));
         return rsSuite;
     }
 

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/ResultSetJDBC30Test.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/ResultSetJDBC30Test.java?view=diff&rev=522873&r1=522872&r2=522873
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/ResultSetJDBC30Test.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/ResultSetJDBC30Test.java Tue Mar 27 04:53:57 2007
@@ -115,11 +115,7 @@
                         " yet.");
             }
         } catch (SQLException se) {
-            if (usingEmbedded()) {
-                assertSQLState(UPDATABLE_RESULTSET_API_DISALLOWED, se);
-            } else {
-                assertSQLState(NOT_IMPLEMENTED, se);
-            }
+            assertSQLState(UPDATABLE_RESULTSET_API_DISALLOWED, se);
         }
         try {
             rs.updateBlob("c", null);
@@ -131,11 +127,7 @@
                         " yet.");
             }
         } catch (SQLException se) {
-            if (usingEmbedded()) {
-                assertSQLState(UPDATABLE_RESULTSET_API_DISALLOWED, se);
-            } else {
-                assertSQLState(NOT_IMPLEMENTED, se);
-            }
+            assertSQLState(UPDATABLE_RESULTSET_API_DISALLOWED, se);
         }
         try {
             rs.updateClob(8, null);
@@ -147,11 +139,7 @@
                         " yet.");
             }
         } catch (SQLException se) {
-            if (usingEmbedded()) {
-                assertSQLState(UPDATABLE_RESULTSET_API_DISALLOWED, se);
-            } else {
-                assertSQLState(NOT_IMPLEMENTED, se);
-            }
+            assertSQLState(UPDATABLE_RESULTSET_API_DISALLOWED, se);
         }
         try {
             rs.updateClob("c", null);
@@ -163,11 +151,7 @@
                         " yet.");
             }
         } catch (SQLException se) {
-            if (usingEmbedded()) {
-                assertSQLState(UPDATABLE_RESULTSET_API_DISALLOWED, se);
-            } else {
-                assertSQLState(NOT_IMPLEMENTED, se);
-            }
+            assertSQLState(UPDATABLE_RESULTSET_API_DISALLOWED, se);
         }
         try {
             rs.updateArray(8, null);

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/UpdatableResultSetTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/UpdatableResultSetTest.java?view=diff&rev=522873&r1=522872&r2=522873
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/UpdatableResultSetTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/jdbcapi/UpdatableResultSetTest.java Tue Mar 27 04:53:57 2007
@@ -25,6 +25,7 @@
 
 import junit.framework.*;
 import java.sql.*;
+import java.io.*;
 
 /**
  * Tests updatable result sets.
@@ -35,6 +36,24 @@
  */
 public class UpdatableResultSetTest extends BaseJDBCTestCase {
     
+    private static final byte[] BYTES1 = {
+            0x65, 0x66, 0x67, 0x68, 0x69,
+            0x69, 0x68, 0x67, 0x66, 0x65
+        };
+
+    private static final byte[] BYTES2 = {
+            0x69, 0x68, 0x67, 0x66, 0x65,
+            0x65, 0x66, 0x67, 0x68, 0x69
+        };
+
+    /**
+     * Key used to identify inserted rows.
+     * Use method <code>requestKey</code> to obtain it.
+     **/
+    private static int insertKey = 0;
+
+    private int key = -1;
+
     /** Creates a new instance of UpdatableResultSetTest */
     public UpdatableResultSetTest(String name) {
         super(name);
@@ -51,6 +70,13 @@
         conn.setAutoCommit(false);
         Statement stmt = conn.createStatement();
         
+        stmt.execute("create table UpdateTestTableResultSet (" +
+                            "sno int not null unique," +
+                            "dBlob BLOB," +
+                            "dClob CLOB," +
+                            "dLongVarchar LONG VARCHAR," +
+                            "dLongBit LONG VARCHAR FOR BIT DATA)");
+
         // Quoted table
         stmt.executeUpdate("create table \"my \"\"quoted\"\" table\" (x int)");
         stmt.executeUpdate("insert into \"my \"\"quoted\"\" table\" (x) " +
@@ -368,5 +394,330 @@
         }
         rs.close();
         stmt.close();                
+    }
+
+    /**
+     * This methods tests the ResultSet interface method
+     * updateBlob
+     *
+     * @throws Exception
+     */
+    public void testUpdateBlob()
+    throws Exception {
+        //Byte array in which the returned bytes from
+        //the Database after the update are stored. This
+        //array is then checked to determine if it
+        //has the same elements of the Byte array used for
+        //the update operation
+
+        byte[] bytes_ret = new byte[10];
+
+        //1 Input Stream for insertion
+        InputStream is1 = new java.io.ByteArrayInputStream(BYTES1);
+
+        //2 Input Stream for insertion
+        InputStream is2 = new java.io.ByteArrayInputStream(BYTES2);
+
+        //Prepared Statement used to insert the data
+        PreparedStatement ps_sb = prep("dBlob");
+
+        //first insert
+        ps_sb.setInt(1, key);
+        ps_sb.setBinaryStream(2,is1,BYTES1.length);
+        ps_sb.executeUpdate();
+
+        //second insert
+        int key2 = requestKey();
+        ps_sb.setInt(1, key2);
+        ps_sb.setBinaryStream(2,is2,BYTES2.length);
+        ps_sb.executeUpdate();
+
+        ps_sb.close();
+
+        //Update operation
+        //use a different ResultSet variable so that the
+        //other tests can go on unimpacted
+        //we do not have set methods on Clob and Blob implemented
+        //So query the first Clob from the database
+        //update the second result set with this
+        //Clob value
+
+        ResultSet rs1 = fetch("dBlob", key);
+        rs1.next();
+        Blob blob = rs1.getBlob(1);
+        rs1.close();
+
+        rs1 = fetchUpd("dBlob", key2);
+        rs1.next();
+        rs1.updateBlob(1,blob);
+        rs1.updateRow();
+        rs1.close();
+
+        //Query to see whether the data that has been updated
+        //using the updateBlob method is the same
+        //data that we expected
+
+        rs1 = fetch("dBlob", key2);
+        rs1.next();
+        assertEquals(blob, rs1.getBlob(1));
+        rs1.close();
+    }
+
+    /**
+     * This methods tests the ResultSet interface method
+     * updateBlob
+     *
+     * @throws Exception
+     */
+    public void testUpdateBlobStringParameterName()
+    throws Exception {
+        //Byte array in which the returned bytes from
+        //the Database after the update are stored. This
+        //array is then checked to determine if it
+        //has the same elements of the Byte array used for
+        //the update operation
+
+        byte[] bytes_ret = new byte[10];
+
+        //1 Input Stream for insertion
+        InputStream is1 = new java.io.ByteArrayInputStream(BYTES1);
+
+        //2 Input Stream for insertion
+        InputStream is2 = new java.io.ByteArrayInputStream(BYTES2);
+
+        //Prepared Statement used to insert the data
+        PreparedStatement ps_sb = prep("dBlob");
+
+        //first insert
+        ps_sb.setInt(1, key);
+        ps_sb.setBinaryStream(2,is1,BYTES1.length);
+        ps_sb.executeUpdate();
+
+        //second insert
+        int key2 = requestKey();
+        ps_sb.setInt(1, key2);
+        ps_sb.setBinaryStream(2,is2,BYTES2.length);
+        ps_sb.executeUpdate();
+
+        ps_sb.close();
+
+        //Update operation
+        //use a different ResultSet variable so that the
+        //other tests can go on unimpacted
+        //we do not have set methods on Clob and Blob implemented
+        //So query the first Clob from the database
+        //update the second result set with this
+        //Clob value
+
+        ResultSet rs1 = fetch("dBlob", key);
+        rs1.next();
+        Blob blob = rs1.getBlob(1);
+        rs1.close();
+
+        rs1 = fetchUpd("dBlob", key2);
+        rs1.next();
+        rs1.updateBlob("dBlob",blob);
+        rs1.updateRow();
+        rs1.close();
+
+        //Query to see whether the data that has been updated
+        //using the updateBlob method is the same
+        //data that we expected
+
+        rs1 = fetch("dBlob", key2);
+        rs1.next();
+        assertEquals(blob, rs1.getBlob(1));
+        rs1.close();
+    }
+
+    /**
+     * This methods tests the ResultSet interface method
+     * updateClob
+     *
+     * @throws Exception
+     */
+    public void testUpdateClob()
+    throws Exception {
+        //Byte array in which the returned bytes from
+        //the Database after the update are stored. This
+        //array is then checked to determine if it
+        //has the same elements of the Byte array used for
+        //the update operation
+
+        byte[] bytes_ret = new byte[10];
+
+        //1 Input Stream for insertion
+        InputStream is1 = new java.io.ByteArrayInputStream(BYTES1);
+
+        //2 Input Stream for insertion
+        InputStream is2 = new java.io.ByteArrayInputStream(BYTES2);
+
+        //Prepared Statement used to insert the data
+        PreparedStatement ps_sb = prep("dClob");
+
+        //first insert
+        ps_sb.setInt(1,key);
+        ps_sb.setAsciiStream(2,is1,BYTES1.length);
+        ps_sb.executeUpdate();
+
+        //second insert
+        int key2 = requestKey();
+        ps_sb.setInt(1,key2);
+        ps_sb.setAsciiStream(2,is2,BYTES2.length);
+        ps_sb.executeUpdate();
+
+        ps_sb.close();
+
+        //Update operation
+        //use a different ResultSet variable so that the
+        //other tests can go on unimpacted
+        //we do not have set methods on Clob and Blob implemented
+        //So query the first Clob from the database
+        //update the second result set with this
+        //Clob value
+
+        ResultSet rs1 = fetchUpd("dClob", key);
+        rs1.next();
+        Clob clob = rs1.getClob(1);
+        rs1.close();
+
+        rs1 = fetchUpd("dClob", key2);
+        rs1.next();
+        rs1.updateClob(1,clob);
+        rs1.updateRow();
+        rs1.close();
+
+        //Query to see whether the data that has been updated
+        //using the updateClob method is the same
+        //data that we expected
+
+        rs1 = fetch("dClob", key2);
+        rs1.next();
+        assertEquals(clob, rs1.getClob(1));
+        rs1.close();
+    }
+
+    /**
+     * This methods tests the ResultSet interface method
+     * updateClob
+     *
+     * @throws Exception
+     */
+    public void testUpdateClobStringParameterName()
+    throws Exception {
+        //Byte array in which the returned bytes from
+        //the Database after the update are stored. This
+        //array is then checked to determine if it
+        //has the same elements of the Byte array used for
+        //the update operation
+
+        byte[] bytes_ret = new byte[10];
+
+        //1 Input Stream for insertion
+        InputStream is1 = new java.io.ByteArrayInputStream(BYTES1);
+
+        //2 Input Stream for insertion
+        InputStream is2 = new java.io.ByteArrayInputStream(BYTES2);
+
+        //Prepared Statement used to insert the data
+        PreparedStatement ps_sb = prep("dClob");
+
+        //first insert
+        ps_sb.setInt(1, key);
+        ps_sb.setAsciiStream(2,is1,BYTES1.length);
+        ps_sb.executeUpdate();
+
+        //second insert
+        int key2 = requestKey();
+        ps_sb.setInt(1, key2);
+        ps_sb.setAsciiStream(2,is2,BYTES2.length);
+        ps_sb.executeUpdate();
+
+        ps_sb.close();
+
+        //Update operation
+        //use a different ResultSet variable so that the
+        //other tests can go on unimpacted
+        //we do not have set methods on Clob and Blob implemented
+        //So query the first Clob from the database
+        //update the second result set with this
+        //Clob value
+
+        ResultSet rs1 = fetch("dClob", key);
+        rs1.next();
+        Clob clob = rs1.getClob(1);
+        rs1.close();
+
+        rs1 = fetchUpd("dClob", key2);
+        rs1.next();
+        rs1.updateClob("dClob",clob);
+        rs1.updateRow();
+        rs1.close();
+
+        //Query to see whether the data that has been updated
+        //using the updateClob method is the same
+        //data that we expected
+
+        rs1 = fetch("dClob", key2);
+        rs1.next();
+        assertEquals(clob, rs1.getClob(1));
+        rs1.close();
+    }
+
+    /**
+     * Get a key that is used to identify an inserted row.
+     * Introduced to avoid having to delete table contents after each test,
+     * and because the order of the tests is not guaranteed.
+     *
+     * @return an integer in range [1, Integer.MAX_VALUE -1]
+     */
+    private static final int requestKey() {
+        return ++insertKey;
+    }
+
+    /**
+     * Prepare commonly used statement to insert a row.
+     *
+     * @param colName name of the column to insert into
+     * @throws SQLException
+     */
+    private PreparedStatement prep(String colName)
+            throws SQLException {
+        return prepareStatement("insert into UpdateTestTableResultSet " +
+                "(sno, " + colName + ") values (?,?)");
+    }
+
+    /**
+     * Fetch the specified row for update.
+     *
+     * @param colName name of the column to fetch
+     * @param key identifier for row to fetch
+     * @return a <code>ResultSet</code> with zero or one row, depending on
+     *      the key used
+     * @throws SQLException
+     */
+    private ResultSet fetchUpd(String colName, int key)
+            throws SQLException {
+        Statement stmt = createStatement(ResultSet.TYPE_FORWARD_ONLY,
+                                             ResultSet.CONCUR_UPDATABLE);
+        return stmt.executeQuery("select " + colName +
+                " from UpdateTestTableResultSet where sno = " + key +
+                " for update");
+    }
+
+    /**
+     * Fetch the specified row.
+     *
+     * @param colName name of the column to fetch
+     * @param key identifier for row to fetch
+     * @return a <code>ResultSet</code> with zero or one row, depending on
+     *      the key used
+     * @throws SQLException
+     */
+    private ResultSet fetch(String colName, int key)
+            throws SQLException {
+        Statement stmt = createStatement();
+        return stmt.executeQuery("select " + colName +
+                " from UpdateTestTableResultSet where sno = " + key);
     }
 }

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdatableResultSetTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdatableResultSetTest.java?view=diff&rev=522873&r1=522872&r2=522873
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdatableResultSetTest.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/functionTests/tests/lang/UpdatableResultSetTest.java Tue Mar 27 04:53:57 2007
@@ -205,23 +205,23 @@
         //                                            e        m
         //                                            a
         //                                            m
-        /* 0 SMALLINT      */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "22018", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "0A000", "XCL12", "XCL12", "XCL12", "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 1 INTEGER       */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "22018", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "0A000", "XCL12", "XCL12", "XCL12", "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 2 BIGINT        */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "22018", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "0A000", "XCL12", "XCL12", "XCL12", "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 3 DECIMAL       */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "22018", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "0A000", "XCL12", "XCL12", "XCL12", "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 4 REAL          */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "0A000", "XCL12", "XCL12", "XCL12", "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 5 DOUBLE        */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "0A000", "XCL12", "XCL12", "XCL12", "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 6 CHAR          */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "0A000", "PASS",  "PASS",  "PASS",  "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 7 VARCHAR       */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "0A000", "PASS",  "PASS",  "PASS",  "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 8 LONGVARCHAR   */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "0A000", "PASS",  "PASS",  "PASS",  "0A000", "PASS",  "PASS", "0A000", "0A000"},
-        /* 9 CHAR FOR BIT  */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "0A000", "XCL12", "XCL12", "XCL12", "0A000", "XCL12", "PASS", "0A000", "0A000"},
-        /* 10 VARCH. BIT   */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "0A000", "XCL12", "XCL12", "XCL12", "0A000", "XCL12", "PASS", "0A000", "0A000"},
-        /* 11 LONGVAR. BIT */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "0A000", "XCL12", "XCL12", "XCL12", "0A000", "XCL12", "PASS", "0A000", "0A000"},
-        /* 12 CLOB         */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "0A000", "XCL12", "XCL12", "XCL12", "0A000", "XCL12", "PASS", "0A000", "0A000"},
-        /* 13 DATE         */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "0A000", "PASS",  "XCL12", "PASS",  "0A000", "XCL12", "PASS", "0A000", "0A000"},
-        /* 14 TIME         */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "0A000", "XCL12", "PASS",  "PASS",  "0A000", "XCL12", "PASS", "0A000", "0A000"},
-        /* 15 TIMESTAMP    */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "0A000", "PASS",  "XCL12", "PASS",  "0A000", "XCL12", "PASS", "0A000", "0A000"},
-        /* 16 BLOB         */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "0A000", "XCL12", "XCL12", "XCL12", "0A000", "XCL12", "PASS", "0A000", "0A000"},
+        /* 0 SMALLINT      */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "22018", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 1 INTEGER       */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "22018", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 2 BIGINT        */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "22018", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 3 DECIMAL       */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "22018", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 4 REAL          */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 5 DOUBLE        */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 6 CHAR          */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "PASS",  "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 7 VARCHAR       */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "PASS",  "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 8 LONGVARCHAR   */ {"PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "PASS",  "XCL12", "PASS",  "PASS", "0A000", "0A000"},
+        /* 9 CHAR FOR BIT  */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS", "0A000", "0A000"},
+        /* 10 VARCH. BIT   */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS", "0A000", "0A000"},
+        /* 11 LONGVAR. BIT */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS", "0A000", "0A000"},
+        /* 12 CLOB         */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "PASS", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS", "0A000", "0A000"},
+        /* 13 DATE         */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "XCL12", "PASS",  "XCL12", "XCL12", "PASS", "0A000", "0A000"},
+        /* 14 TIME         */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "XCL12", "XCL12", "PASS", "0A000", "0A000"},
+        /* 15 TIMESTAMP    */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "XCL12", "PASS",  "XCL12", "XCL12", "PASS", "0A000", "0A000"},
+        /* 16 BLOB         */ {"XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "XCL12", "PASS",  "PASS",  "XCL12", "XCL12", "XCL12", "XCL12", "PASS", "XCL12", "PASS", "0A000", "0A000"},
     };
     
     // This table contains the expected result of the combination of datatype
@@ -2449,18 +2449,9 @@
                 } catch (SQLException e) {
                     // updateArray and updateRef are not implemented on both 
                     // drivers
-                    // updateClob is not implemented in the client
-                    // updateBlob is not implemented in the client
-                    if (
-                            (updateXXXName == 20) || (updateXXXName == 21) || 
-                            (usingDerbyNetClient() && updateXXXName == 13) || 
-                            (usingDerbyNetClient() && updateXXXName == 17))   
-                    {
+                    if((updateXXXName == 20) || (updateXXXName == 21)) {
                         assertSQLState("FAIL - unexpected exception on " + 
                                 allUpdateXXXNames[updateXXXName-1], "0A000", e);
-                    } else {
-                        assertSQLState("FAIL - unexpected exception on " + 
-                                allUpdateXXXNames[updateXXXName-1], "XJ083", e);
                     }
                 }
                 rs.close();