You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-dev@db.apache.org by "Rick Hillegas (JIRA)" <ji...@apache.org> on 2009/12/31 21:53:29 UTC

[jira] Commented: (DERBY-4491) The network client changes UDTs into Strings and returns their type as LONGVARBINARY.

    [ 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.