Derby is correct.  The clarified JDBC 4 javadocs indicates the following:

getSubString

java.lang.String getSubString(long pos,
                              int length)
                              throws SQLException
Retrieves a copy of the specified substring in the CLOB value designated by this Clob object. The substring begins at position pos and has up to length consecutive characters.

Parameters:
pos - the first character of the substring to be extracted. The first character is at position 1.
length - the number of consecutive characters to be copied
Returns:
a String that is the specified substring in the CLOB value designated by this Clob object
Throws:
SQLException - if there is an error accessing the CLOB value or if pos is less than 1
SQLFeatureNotSupportedException - if the JDBC driver does not support this method
Since:
1.2


Hopefully you will find many mysteries solved in JDBC 4 (and yes i am sure there are still some, but we knocked a ton of the off)

Kathey Marsden wrote:
In this  recent thread the question came up.
http://www.nabble.com/The-tutorial-on-migrating-DB-to-derby-tf1787729.html#a4874605

Derby does not allow a length of 0 for Clob.getSubstring().

Is this a bug in Derby?  I am not sure from reading the javadoc:
http://java.sun.com/j2se/1.5.0/docs/api/java/sql/Clob.html#getSubString(long,%20int)

Kathey