[ 
https://issues.apache.org/jira/browse/DERBY-4491?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12795671#action_12795671
 ] 

Rick Hillegas commented on DERBY-4491:
--------------------------------------

Here are some thoughts about how to address this issue.

DRDA does support user defined types and our existing protocol flows maintain a 
placeholder for UDT information. Right now we plug a null into that 
placeholder. For more detail on this support, see the February 2007 version of 
the DRDA spec, Volume 1 (Data Definition and Exchange), section 5.6.4.10 (SQL 
Descriptor User-Defined Type Group Description, aka SQLUDTGRP).

The DRDA support for user defined types, however, is not rich enough to 
describe the Java user defined types defined by part 13 of the ANSI/ISO SQL 
Standard. These are the user defined types identified by the JDBC type code 
java.sql.Types.JAVA_OBJECT. DRDA support only covers SQL distinct, struct, and 
ref types, that is, those which map to the STRUCT, DISTINCT, and REF constants 
in java.sql.Types. There is no corresponding DRDA constant mapping to 
java.sql.Types.JAVA_OBJECT. In addition, the DRDA protocol does not convey the 
Java class name needed to fulfill the JDBC contract for 
ResultSetMetaData.getColumnClassName() and 
ParameterMetaData.getParameterClassName().

Therefore, in order to fulfill the JDBC contract, we will have to extend the 
DRDA protocol. I propose the following:

1) For compatibility reasons, we will maintain the old, incorrect behavior if 
either the client or the server is NOT Derby code at level 10.6 or higher.

2) However, if the client and server are both Derby code at version 10.6 or 
higher, then the user will see the embedded behavior. Internally, we will 
implement this with Derby-specific extensions to DRDA. This affects the 
following methods:

ResultSet.getObject() - Will return the UDT object rather than the result of 
calling toString() on it.

PreparedStatement.setObject() - Will accept UDTs if the parameter is typed as 
JAVA_OBJECT. The object being set must be an instance of the Java class which 
was bound to the UDT by the CREATE TYPE statement.

ResultSetMetaData.getColumnType() and ParameterMetaData.getParameterType() - 
Will return JAVA_OBJECT rather than LONGVARBINARY.

ResultSetMetaData.getColumnTypeName() and 
ParameterMetaData.getParameterTypeName() - Will return the fully qualified name 
of the UDT rather than LONG VARCHAR FOR BIT DATA. However, for our legacy user 
defined types (the ones stored in the system tables), we will continue to 
follow the embedded practice of returning the class name without any schema 
qualifier. So, for a column of type Price, we will return what is required by 
the JDBC spec

  "APP"."PRICE"

but for SELECT ALIASINFO FROM SYS.SYSALIASES, we will return

  org.apache.derby.catalog.AliasInfo

This behavior for the system columns seems to fall short of the JDBC contract. 
However, these are special types and I am content to leave them alone. If we 
are not happy about this approach for the system columns, then we should open a 
new JIRA and come up with a better common behavior for both embedded and 
network usage.


ResultSetMetaData.getColumnClassName() and 
ParameterMetaData.getParameterClassName() - Will return the name of the class 
bound to the UDT when it was defined.

ResultSetMetaData.getColumnPrecision() and ParameterMetaData.getPrecision() - 
Will return 0 as in the embedded case.

ResultSetMetaData.getColumnScale() and ParameterMetaData.getScale()- Will 
return 0 as in the embedded case.

ResultSetMetaData.getColumnDisplaySize() - Will return 15 as in the embedded 
case. This is Derby's default column display size and seems arbitrary to me. 
However, I find it hard to argue for some other number. If we decide that some 
other number is better, then we should open a new JIRA and use the same number 
for both embedded and network situations.


> The network client changes UDTs into Strings and returns their type as 
> LONGVARBINARY.
> -------------------------------------------------------------------------------------
>
>                 Key: DERBY-4491
>                 URL: https://issues.apache.org/jira/browse/DERBY-4491
>             Project: Derby
>          Issue Type: Bug
>          Components: JDBC
>    Affects Versions: 10.0.2.0, 10.0.2.1, 10.1.1.0, 10.1.2.1, 10.1.3.1, 
> 10.2.1.6, 10.2.2.0, 10.3.1.4, 10.3.2.1, 10.3.3.0, 10.4.1.3, 10.4.2.0, 
> 10.5.1.1, 10.5.2.0, 10.5.3.0
>            Reporter: Rick Hillegas
>
> This is a pre-existing bug which seems to have been with Derby since the 
> beginning. Some of the columns in the system tables (e.g., 
> SYS.SYSALIASES.ALIASINFO) contain objects. If you select these columns:
> 1) In the embedded client you will get the correct results. You will get the 
> objects in these columns. In addition, the ResultSetMetaData for these 
> columns will correctly report that the columns have type JAVA_OBJECT and will 
> give a reasonable type name (the class name for the object in the column).
> 2) However, in the network client, you will get the wrong results. 
> ResultSet.getObject() will return Strings rather than the original objects. 
> In addition, the ResultSetMetaData for these columns will incorrectly report 
> that their type is LONGVARBINARY.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to