[
https://issues.apache.org/jira/browse/DERBY-651?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Rick Hillegas updated DERBY-651:
--------------------------------
Attachment: derby-651-02-af-udtColumnsRetvalsParams.diff
Attaching derby-651-02-af-udtColumnsRetvalsParams.diff. This patch makes it
possible to create UDT columns and store UDTs in them. This patch also makes it
possible to pass UDTs as parameters into functions and procedures and to return
UDTs from functions. The following is possible with this patch:
create type Price external name
'org.apache.derbyTesting.functionTests.tests.lang.Price' language java;
create table orders( orderID int generated always as identity,
customerID int, totalPrice price );
create function makePrice( currencyCode char( 3 ), amount decimal( 31,
5 ), timeInstant Timestamp )
returns Price language java parameter style java no sql
external name
'org.apache.derbyTesting.functionTests.tests.lang.Price.makePrice';
create function getCurrencyCode( price Price ) returns char( 3 )
language java parameter style java no sql
external name
'org.apache.derbyTesting.functionTests.tests.lang.Price.getCurrencyCode';
create function getAmount( price Price ) returns decimal( 31, 5 )
language java parameter style java no sql
external name
'org.apache.derbyTesting.functionTests.tests.lang.Price.getAmount';
create function getTimeInstant( price Price ) returns timestamp
language java parameter style java no sql
external name
'org.apache.derbyTesting.functionTests.tests.lang.Price.getTimeInstant';
insert into orders( customerID, totalPrice ) values
( 12345, makePrice( 'USD', cast( 9.99 as decimal( 31, 5 ) ),
timestamp('2009-10-16 14:24:43') ) );
select getCurrencyCode( totalPrice ), getAmount( totalPrice ),
getTimeInstant( totalPrice ) from orders;
select totalPrice from orders;
At least for small UDTs, it turns out that Derby still has the logic needed to
store the UDT values in columns. It appears (although I have not tested this
yet), that the Store can probably persist UDT values for UDTs which implement
SQLData in addition to UDTs which implement Serializable. What was needed was
the ability to identify UDTs by schema qualified names. Touches the following
files:
M java/engine/org/apache/derby/iapi/types/TypeId.java
M java/engine/org/apache/derby/iapi/types/UserType.java
M java/engine/org/apache/derby/catalog/TypeDescriptor.java
M java/engine/org/apache/derby/catalog/types/DecimalTypeIdImpl.java
M java/engine/org/apache/derby/catalog/types/TypeDescriptorImpl.java
M java/engine/org/apache/derby/catalog/types/BaseTypeIdImpl.java
M java/engine/org/apache/derby/catalog/types/UserDefinedTypeIdImpl.java
This adds a persistable schema qualified name to the existing UserDefinedType
object.
M java/engine/org/apache/derby/impl/sql/compile/sqlgrammar.jj
M java/engine/org/apache/derby/impl/sql/compile/MethodCallNode.java
M java/engine/org/apache/derby/impl/sql/compile/ColumnDefinitionNode.java
M java/engine/org/apache/derby/impl/sql/compile/CreateAliasNode.java
Changes to allow schema qualified UDT names in CREATE TABLE/FUNCTION/PROCEDURE
statements.
M java/engine/org/apache/derby/impl/sql/compile/QueryTreeNode.java
Adds logic to bind a UDT declaration. This means looking up the UDT in the
DataDictionary given its schema qualified name and then poking the
corresponding Java class name into the UDT type descriptor.
M java/engine/org/apache/derby/impl/sql/compile/StaticMethodCallNode.java
Small changes to support the use of UDT values at execution time.
A java/testing/org/apache/derbyTesting/functionTests/tests/lang/Price.java
M
java/testing/org/apache/derbyTesting/functionTests/tests/lang/UDTTest.java
Some basic tests to verify that you can create columns, parameters, and return
values of UDT type.
M
java/testing/org/apache/derbyTesting/functionTests/tests/lang/ErrorCodeTest.java
M
java/testing/org/apache/derbyTesting/functionTests/master/db2Compatibility.out
Changes some tests to account for the fact that the parser now raises a
different error when it encounters illegal type declarations.
The regression tests pass for me.
> Re-enable the storing of java objects in the database
> -----------------------------------------------------
>
> Key: DERBY-651
> URL: https://issues.apache.org/jira/browse/DERBY-651
> Project: Derby
> Issue Type: Improvement
> Components: SQL
> Reporter: Rick Hillegas
> Attachments: derby-651-01-aa-basicCreateDropType.diff,
> derby-651-02-af-udtColumnsRetvalsParams.diff, UserDefinedTypes.html,
> UserDefinedTypes.html, UserDefinedTypes.html, UserDefinedTypes.html
>
>
> Islay Symonette, in an email thread called "Storing Java Objects in a table"
> on October 26, 2005 requests the ability to store java objects in the
> database.
> Old releases of Cloudscape allow users to declare a column's type to be a
> Serializable class. This feature was removed from Derby because the syntax
> was non-standard. However, most of the machinery to support objects
> serialized to columns is still in Derby and is even used in system tables. We
> need to agree on some standard syntax here and re-expose this useful feature.
> Some subset of the ANSI adt syntax, cumbersome as it is, would do.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.