Thank you Yun for the new patch.
message change patch
DERBY-2769-3-b.diff looks fine. I will run tests and check that in.
remove import org.apache.derby.impl.jdbc.Util;
This is unused and may bring engine code into the client which is not good.
For the condition below there are a few issues:
if (offset + len > str.length())
throw new SqlException(agent_.logWriter_,
new Integer(offset), new Integer(len));
Even though we are sharing a SQLState with SQLState.LANG_SUBSTR_START_OR_LEN_OUT_OF_RANGE we need a new message, because the existing one, "The second or third argument of the SUBSTR function is out of range." doesn't make sense in this context and doesn't take parameters. I think the way to do this is add a new constant to SQLState.java with value "22011.S.1", then add that message to messages.xml. The message should be something like: "The range specified for the substring with offset
is not valid". There is another step too when adding SQLState messages to the client. They have to be added to java/build/org/apache/derbyBuild/splitmessages.java to get picked up by the client build. Otherwise it will just print UNKOWN MESSAGE. After making the changes, you may want to verify them manually or temporarily print out the message in your JUnit test to make sure it all worked. Unfortunately our JUnit tests just check SQLState so can miss issues with message text.
There is a comment
//if offset + len == str.length(), it's accepted.
I think this is incorrect and the test case below it useds str.length() -1
Again we should use a new message instead of LANG_SUBSTR_START_OR_LEN_OUT_OF_RANGE
I think the new checking causes some cases that used to execute to now fail with client. For example I found I could execute setString(1,"goodbye",2,6) where the offset + len were greater than the length of the string before the change, but not after. I think the changes are ok but we should probably have a release note.