Derby
  1. Derby
  2. DERBY-3977

Clob.truncate with a value greater than the Clob length raises different exceptions in embedded and client driver

    Details

    • Type: Bug Bug
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 10.3.3.0, 10.4.2.0, 10.5.1.1
    • Fix Version/s: 10.5.1.1
    • Component/s: JDBC
    • Labels:
      None
    • Issue & fix info:
      Release Note Needed
    • Bug behavior facts:
      Embedded/Client difference

      Description

      Calling Clob.truncate with a value that is greater then the Clob length raises different SQLExceptions in the client and the embedded driver.
      o Client: SQLState.BLOB_LENGTH_TOO_LONG - XJ079
      o Embedded: SQLState.BLOB_POSITION_TOO_LARGE - XJ076

      I believe the fix is simple enough - change one of the exceptions.
      Which one most closely describes the situation?

      A release note is needed for this fix.

      Also note the following from the Java API docs:
      "void truncate(long len)
      throws SQLException

      Truncates the CLOB value that this Clob designates to have a length of len characters.

      Note: If the value specified for pos is greater then the length+1 of the CLOB value then the behavior is undefined. Some JDBC drivers may throw a SQLException while other drivers may support this operation.
      "

      This opens for a change of behavior as well.
      There seems to an inconsistency in the docs, possibly due to rephrasing - it references both len and pos. The latter isn't used anywhere else in the JavaDoc for truncate.
      And what should the result of truncate(length+1) be?

      1. releaseNote.html
        4 kB
        Kristian Waagan
      2. releaseNote.html
        4 kB
        Kristian Waagan
      3. derby-3977-2a-error_message_typo_fix.stat
        0.1 kB
        Kristian Waagan
      4. derby-3977-2a-error_message_typo_fix.diff
        4 kB
        Kristian Waagan
      5. derby-3977-1a-change_emb_exception.diff
        2 kB
        Kristian Waagan

        Activity

        Hide
        Knut Anders Hatlen added a comment -

        Since it's a length and not a position, I guess the exception thrown by the client is more accurate.

        If we throw exceptions for length+2 and up, I think it's reasonable to throw an exception for length+1 as well, even though the wording in the spec is a bit unclear. Do we have any other alternatives?

        Show
        Knut Anders Hatlen added a comment - Since it's a length and not a position, I guess the exception thrown by the client is more accurate. If we throw exceptions for length+2 and up, I think it's reasonable to throw an exception for length+1 as well, even though the wording in the spec is a bit unclear. Do we have any other alternatives?
        Hide
        Kristian Waagan added a comment -

        We don't have any good alternatives in my opinion, but I'm curious about what the databases that do support truncating to length+1 do!

        I'll make a patch for the issue.

        Show
        Kristian Waagan added a comment - We don't have any good alternatives in my opinion, but I'm curious about what the databases that do support truncating to length+1 do! I'll make a patch for the issue.
        Hide
        Knut Anders Hatlen added a comment -

        PostgreSQL's JDBC driver doesn't appear to throw an exception for len>=length+1. In code called from Clob.truncate(), I found this comment:

        /**

        • Truncates the large object to the given length in bytes.
        • If the number of bytes is larger than the current large
        • object length, the large object will be filled with zero
        • bytes. This method does not modify the current file offset.
          */

        The comment talks about bytes, but the code is also used for character data, so I guess truncate(length+1) appends "\u0000".

        MySQL Connector/J throws an exception, if I read the code correctly.

        Show
        Knut Anders Hatlen added a comment - PostgreSQL's JDBC driver doesn't appear to throw an exception for len>=length+1. In code called from Clob.truncate(), I found this comment: /** Truncates the large object to the given length in bytes. If the number of bytes is larger than the current large object length, the large object will be filled with zero bytes. This method does not modify the current file offset. */ The comment talks about bytes, but the code is also used for character data, so I guess truncate(length+1) appends "\u0000". MySQL Connector/J throws an exception, if I read the code correctly.
        Hide
        Kathey Marsden added a comment -

        JCC 3.57 with DB2 throws an SQLException, SQLState 42815. Invalid length x

        Show
        Kathey Marsden added a comment - JCC 3.57 with DB2 throws an SQLException, SQLState 42815. Invalid length x
        Hide
        Kristian Waagan added a comment -

        Patch 1a changes the exception thrown in the embedded driver from XJ076 to XJ079. It now matches the client driver.
        I ran derbyall and suites.All, and got no failures due to the change of exception (except for the two new tests, which I have modified in the patch).

        Patch ready for review.

        Show
        Kristian Waagan added a comment - Patch 1a changes the exception thrown in the embedded driver from XJ076 to XJ079. It now matches the client driver. I ran derbyall and suites.All, and got no failures due to the change of exception (except for the two new tests, which I have modified in the patch). Patch ready for review.
        Hide
        Kristian Waagan added a comment -

        Attached a first revision of the release notes. Please give me feedback on it.

        I also discovered a typo in the error message for one of the exceptions.
        Fixing that doesn't warrant another release note, does it?

        Show
        Kristian Waagan added a comment - Attached a first revision of the release notes. Please give me feedback on it. I also discovered a typo in the error message for one of the exceptions. Fixing that doesn't warrant another release note, does it?
        Hide
        Knut Anders Hatlen added a comment -

        The release note looks good to me. Some minor comments:
        Perhaps the example error messages should have a real number instead of

        {0}

        in them? And maybe that section is clearer if we say "Before: XJ076: ...." and "Now: XJ079: ....".
        In the "Application Changes Required" section, we should repeat that it's only when calling Clob.truncate() one should look for XJ079 instead of XJ076, since we still use XJ076 other places. For example: "Look for SQLState XJ079 instead of XJ076 when Clob.truncate() is called."

        Show
        Knut Anders Hatlen added a comment - The release note looks good to me. Some minor comments: Perhaps the example error messages should have a real number instead of {0} in them? And maybe that section is clearer if we say "Before: XJ076: ...." and "Now: XJ079: ....". In the "Application Changes Required" section, we should repeat that it's only when calling Clob.truncate() one should look for XJ079 instead of XJ076, since we still use XJ076 other places. For example: "Look for SQLState XJ079 instead of XJ076 when Clob.truncate() is called."
        Hide
        Kristian Waagan added a comment -

        Thank you for the feedback, Knut Anders.

        Attaching new revision of the release notes where the suggested changes have been addressed.

        Show
        Kristian Waagan added a comment - Thank you for the feedback, Knut Anders. Attaching new revision of the release notes where the suggested changes have been addressed.
        Hide
        Kristian Waagan added a comment -

        Patch 2a fixes the typo in the error message. The XML file and 4 translation files are touched.

        Show
        Kristian Waagan added a comment - Patch 2a fixes the typo in the error message. The XML file and 4 translation files are touched.
        Hide
        Kristian Waagan added a comment -

        Committed patch 1a to trunk with revision 726695.

        Show
        Kristian Waagan added a comment - Committed patch 1a to trunk with revision 726695.
        Hide
        Knut Anders Hatlen added a comment -

        Thanks for the updated release note. It looks good to me.

        Show
        Knut Anders Hatlen added a comment - Thanks for the updated release note. It looks good to me.
        Hide
        Kristian Waagan added a comment -

        Issue has been fixed.
        Thanks for the feedback on the release notes, Knut Anders.

        Show
        Kristian Waagan added a comment - Issue has been fixed. Thanks for the feedback on the release notes, Knut Anders.
        Hide
        Kristian Waagan added a comment -

        Release note attached and the issue has been fixed. Closing.

        Show
        Kristian Waagan added a comment - Release note attached and the issue has been fixed. Closing.

          People

          • Assignee:
            Kristian Waagan
            Reporter:
            Kristian Waagan
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development