I am considering adding metadata wrapper functions to the Derby product. I would like the community's feedback on how to expose these functions. Also, if anyone objects to adding this behavior, I would like to understand your reservations.

Currently, the code is attached to DERBY-3973, DERBY-4926, and DERBY-4927. These wrapper functions let you use SQL to examine database, ResultSet, and parameter metadata. Wrappers have been written for all of the methods in DatabaseMetaData (scalar functions wrap scalar methods, table functions wrap the methods which can return ResultSets). In addition, two other table functions wrap ResultSetMetaData and ParameterMetaData.

Two years ago Myrna suggested that the DatabaseMetaData wrappers should be added to Derby (see her 2008-12-04 comment on DERBY-3973). Dag recently made a similar point on DERBY-4927. I think that this should be possible with a little effort.

The wrapper functions would support the following use-cases:

1) By joining the table functions, you can simulate many of the views defined in the SQL Information Schema. This makes it easier to answer metadata questions which we get from time to time. Right now we answer these questions by writing queries against the system catalogs. In some cases we cannot provide a catalog-based query because the information we need is locked inside descriptor objects in the system tables.

2) The functions take a database URL as an argument. This makes it possible to deploy them against foreign databases like Oracle, DB2, MySQL--any database which provides a JDBC driver. 3rd parties can use these functions in order to write database-agnostic tools.

3) Derby developers can use these functions in ij to probe how our metadata works. That's why they were written originally.

The actual code behind these functions weighs 31K. That would not bloat the product significantly, so I think it would be ok to package this code in the engine jar. Registering the functions takes a couple seconds. For that reason I believe this registration should be optional and not incurred by every database creation. I can imagine that loading and using these optional functions might look something like this:

call syscs_util.syscs_load_metadata_wrappers( true );
select type_name, minimum_scale, maximum_scale from table( sysmetadata.getTypeInfo() ) s;

Please let me know your thoughts about this proposal.

Thanks,
-Rick

Reply via email to