Tiago Espinha wrote:
Aha, we do indeed Knut, but I just found a bug that is present at least on 10.5.3.0. If you try to create a database using the client driver with 243 [excluding ;create=true] Latin characters (e.g. 'ç'), the server will throw the following exception:
--------------8<----------------
2010-09-13 20:26:11.052 GMT : fromIndex(518) > toIndex(275)
java.lang.IllegalArgumentException: fromIndex(518) > toIndex(275)
        at java.util.Arrays.rangeCheck(Arrays.java:1306)
        at java.util.Arrays.fill(Arrays.java:2567)
        at org.apache.derby.impl.drda.DDMWriter.padBytes(Unknown Source)
at org.apache.derby.impl.drda.DDMWriter.writeScalarPaddedBytes(Unknown Source)
        at org.apache.derby.impl.drda.DRDAConnThread.writeRDBNAM(Unknown Source)
------------8<-----------------------

This causes havoc as probably 'ç' is indeed requiring more than one byte to be encoded. I'm actually surprised this works at all but it's probably some obscure addition of EBCDIC on top of just regular US-ASCII. When I try to get the bytes for 'ç' in plain US-ASCII, I get 63 which is ASCII for the question mark.

This means that as it is, on the client driver, the limit will be shorter than 255 characters if these special characters are used. The only matter for concern is that in previous releases this limit isn't properly handled and we just let the server crash with a serious unhandled exception.

I'm all for raising this limit if the community agrees that this does not violate the DRDA protocol.
At this point, our driver contains several Derby-specific extensions to DRDA. This sounds like another reasonable extension to me. +1

Regards,
-Rick
I think Kathey also expressed some concern about the limit on JIRA, so it would be interesting to hear her thoughts on this.

Tiago

----- Original Message ----
From: Knut Anders Hatlen <[email protected]>
To: [email protected]
Sent: Mon, 13 September, 2010 12:53:11
Subject: Re: Database name length

Tiago Espinha <[email protected]> writes:

Thank you Knut, for your reply.

Your point #1 is correct. As for point #2 and #3 just a small correction. It is all characters falling outside the *US-ASCII* encoding that will get a length lower than 255 characters as anything other than ASCII requires more than just 1 byte to encode. I'm fairly sure that at this point we do not support ISO-8859-1 through the client driver as these characters (the extended ones like áéó etc)

fall outside US-ASCII. So hopefully this won't break anything as we didn't support these characters previously.

I think we do support this. At least, this code ran fine on my machine
with Derby 10.6.1.0 and created a database named áéó:

    Connection c = DriverManager.getConnection(
            "jdbc:derby://localhost/\u00E1\u00E9\u00F3;create=true");

As for your suggestion of increasing the length of the field, I'm not sure that's an option. This length limitation is imposed by the DRDA specification and the ACR unfortunately didn't change this. On the ACR it reads "As of DDM Level 7, the RDBNAM can accommodate an RDB name of up to 255 bytes in length, and its format will vary depending on the length of the RDB name". So essentially, we could easily support a much larger RDB name on Derby but the specification forbids it.

DRDA does allow product-unique extensions. I have a hard time seeing any
downside with extending the protocol here. Sending a longer string than
what a strict reading of the spec permits sounds like a lesser evil to
me than disallowing network access to the database.


Reply via email to