Uploaded image for project: 'Derby'
  1. Derby
  2. DERBY-5872

Inconsistency between isWrapperFor() and unwrap() in logical statements

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 10.4.1.3, 10.5.1.1, 10.6.1.0, 10.7.1.1, 10.8.1.2, 10.9.1.0
    • Fix Version/s: 10.10.1.1
    • Component/s: JDBC

      Description

      I noticed this when I refactored the logical statement classes in DERBY-5868. The isWrapperFor() method forwards calls to the underlying physical statement, but the unwrap() method works purely at the logical level.

      For example, if you produce a LogicalPreparedStatement40 instance with this code

      ClientConnectionPoolDataSource ds = new ClientConnectionPoolDataSource();
      ds.setDatabaseName("testdb");
      ds.setCreateDatabase("create");
      ds.setMaxStatements(10);
      PooledConnection pc = ds.getPooledConnection();
      Connection c = pc.getConnection();
      PreparedStatement ps = c.prepareStatement("values 1");

      you'll see that

      System.out.println(ps.isWrapperFor(LogicalPreparedStatement40.class));

      prints false, telling that ps is not a wrapper for LogicalPreparedStatement40. However, trying to unwrap ps as a LogicalPreparedStatement succeeds:

      LogicalPreparedStatement40 lps = ps.unwrap(LogicalPreparedStatement40.class);

      On the other hand

      System.out.println(ps.isWrapperFor(PreparedStatement40.class));

      prints true, indicating that ps is a wrapper for PreparedStatement40, but trying to unwrap it as one, fails:

      PreparedStatement40 ps4 = ps.unwrap(PreparedStatement40.class);

      Exception in thread "main" java.sql.SQLException: Unable to unwrap for 'class org.apache.derby.client.am.PreparedStatement40'
      at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:108)
      at org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:364)
      at org.apache.derby.client.am.LogicalStatementEntity.unwrap(LogicalStatementEntity.java:258)
      at org.apache.derby.client.am.LogicalPreparedStatement.unwrap(LogicalPreparedStatement.java:57)
      at Test.main(Test.java:37)
      Caused by: org.apache.derby.client.am.SqlException: Unable to unwrap for 'class org.apache.derby.client.am.PreparedStatement40'
      ... 3 more

        Attachments

        1. derby-5872-1a.diff
          9 kB
          Knut Anders Hatlen

          Activity

            People

            • Assignee:
              knutanders Knut Anders Hatlen
              Reporter:
              knutanders Knut Anders Hatlen
            • Votes:
              0 Vote for this issue
              Watchers:
              6 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: