During buddy-testing, some confusion arose around how to case the USERNAME arguments of NATIVE procedures. Derby user names (specified on connection urls) are case-insensitive, but the USERNAME arguments to the NATIVE procedures are case-sensitive. This means that you create a user this way...

    -- create two separate users
    call syscs_util.syscs_create_user( 'FRED', 'fredPassword' );
    call syscs_util.syscs_create_user( 'fREd', 'fREdPassword' );

...FRED can log in like this...

    connect 'jdbc:derby:db;user=fred;password=fredPassword';

    or

    connect 'jdbc:derby:db;user=fREd;password=fredPassword';

...while fREd has to double-quote his user name in order to log in:

    connect 'jdbc:derby:memory:db;user="fREd";password=fredPassword';

The confusion arises because of the following:

1) Derby user names are SQL identifiers - That means that if you don't double-quote them, Derby will uppercase them internally. That is, the user name attribute is case-insensitive although the password attribute is case-sensitive. This is simply an odd fact about how Derby operates. It stems from the tight association among Derby user names, schema names, and authorization ids. The Derby wiki describes this situation (http://wiki.apache.org/db-derby/UserIdentifiers), although I think that the explanation is hard to follow.

2) The NATIVE procedures follow the pattern of the other SYSCS_UTIL procedures: arguments which represent SQL identifiers (like schema and table names) must be cased correctly. Unless the SQL object was declared with double-quotes, it is internally represented as uppercase; when you call a system procedure on that SQL object, you need to uppercase the name. This is the pattern across all of the system procedures in SYSCS_UTIL. Note that a different pattern applies to the jar file procedures in SQLJ. There Derby follows the rules laid out by the SQLJ committee fifteen years ago. The SQLJ arguments munge schema and object names into a single string, forcing you to put double-quotes around the schema name and the object name. This also is how you have to treat JDBC metadata methods which collapse 2-part SQL Standard names into a single string.

Here are some proposals for how to address this confusion:

A) Document the confusion. The Reference material on the NATIVE procedures should note that the USERNAME arguments are SQL identifiers like the schema and object names in other SYSCS_UTIL procedures. Usually you want to uppercase them.

+ Simplest solution.
- Does nothing to clean up the confusion about username casing in Derby.

B) Make the USERNAME arguments of the NATIVE procedures require double quotes like the object name arguments of the SQLJ procedures.

+ Might be less confusing to some end-users. Whenever you use double-quotes for a user name on a connection url, you would also use double quotes when managing that user's credentials. - The NATIVE procedures would not handle SQL identifiers the way that other SYSCS_UTIL procedures do.
- Involves more changes to the code and docs late in the release cycle.

C) Change the behavior of user names on connection requests when NATIVE authentication is on. That is, in this situation make user name attributes case-sensitive like password attributes are.

+ Would be the least confusing solution.
- Lots of edge-cases here.
- Would be a hassle for legacy applications migrating off of BUILTIN onto NATIVE authentication.

D) Replace the NATIVE procedures with new Derby-specific SQL statements. The statements would need to be designed in such a way that we would be confident that the SQL committee would not create a conflicting standard in this area. We would also have to create special GRANT/REVOKE syntax for managing permissions for the new commands.

+ This would make it clear that NATIVE user names are SQL identifiers, like the user names on connection urls.
- This is a fair amount of effort late in the release.

I am inclined to pursue option (A) unless there is a strong consensus to pursue one of the other options. If you have opinions about this topic, please share them by the end of this week. The other options have the potential of delaying the release of 10.9.

Thanks,
-Rick

Reply via email to