/**
   * Test that <code>Clob.getCharacterStream(long,long)</code> works on CLOBs that are streamed from
   * store. (DERBY-2891)
   */
  public void testGetCharacterStreamLongOnLargeClob() throws Exception {
    getConnection().setAutoCommit(false);

    // create large (>32k) clob that can be read from store
    final int size = 33000;
    StringBuilder sb = new StringBuilder(size);
    for (int i = 0; i < size; i += 10) {
      sb.append("1234567890");
    }

    final int id = BlobClobTestSetup.getID();
    PreparedStatement ps =
        prepareStatement("insert into blobclob(id, clobdata) values (?,cast(? as clob))");
    ps.setInt(1, id);
    ps.setString(2, sb.toString());
    ps.executeUpdate();
    ps.close();

    Statement s = createStatement();
    ResultSet rs = s.executeQuery("select clobdata from blobclob where id = " + id);
    assertTrue(rs.next());
    Clob c = rs.getClob(1);

    // request a small region of the clob
    BufferedReader r = new BufferedReader(c.getCharacterStream(4L, 3L));
    assertEquals("456", r.readLine());

    r.close();
    c.free();
    rs.close();
    s.close();
    rollback();
  }
 protected void tearDown() throws Exception {
   if (clob != null) {
     clob.free();
     clob = null;
   }
   excludedMethodSet = null;
   super.tearDown();
 }
  /**
   * Test that a lock held on the corresponding row is released when free() is called on the Clob
   * object.
   *
   * @throws java.sql.SQLException
   */
  public void testLockingAfterFree() throws SQLException {
    int id = initializeLongClob(); // Opens clob object
    executeParallelUpdate(id, true); // Test that timeout occurs

    // Test that update goes through after the clob is closed
    clob.free();
    executeParallelUpdate(id, false);

    commit();
  }
  /**
   * Test that a lock held on the corresponding row is released when free() is called on the Clob
   * object if the isolation level is Read Uncommitted
   *
   * @throws java.sql.SQLException
   */
  public void testLockingAfterFreeWithDirtyReads() throws SQLException {
    getConnection().setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
    int id = initializeLongClob(); // Opens clob object
    executeParallelUpdate(id, true); // Test that timeout occurs

    // Test that update goes through after the clob is closed
    clob.free();
    executeParallelUpdate(id, false);

    commit();
  }
  /**
   * Test that a lock held on the corresponding row is NOT released when free() is called on the
   * Clob object if the isolation level is Repeatable Read
   *
   * @throws java.sql.SQLException
   */
  public void testLockingAfterFreeWithRR() throws SQLException {
    getConnection().setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
    int id = initializeLongClob(); // Opens clob object
    executeParallelUpdate(id, true); // Test that timeout occurs

    // Test that update still times out after the clob is closed
    clob.free();
    executeParallelUpdate(id, true);

    // Test that the update goes through after the transaction has committed
    commit();
    executeParallelUpdate(id, false);
  }
  /**
   * Tests the implementation for the free() method in the Clob interface.
   *
   * @throws SQLException if an error occurs during releasing the Clob resources
   */
  public void testFreeandMethodsAfterCallingFree()
      throws IllegalAccessException, InvocationTargetException, SQLException {
    clob = BlobClobTestSetup.getSampleClob(getConnection());

    // call the buildHashSetMethod to initialize the
    // HashSet with the method signatures that are exempted
    // from throwing a SQLException after free has been called
    // on the Clob object.
    buildHashSet();

    InputStream asciiStream = clob.getAsciiStream();
    Reader charStream = clob.getCharacterStream();
    clob.free();
    // testing the idempotence of the free() method
    // the method can be called multiple times on

    // the first are treated as no-ops
    clob.free();

    // to the free method so testing calling
    // a method on this invalid object should throw
    // an SQLException
    buildMethodList(clob);
  }