Thanks, Mamta. That was very helpful. I think I am beginning to
understand this better. At the end of this message I include a script
which I believe demonstrates the following:
1) The collation of string literals changes depending on your
compilation schema.
2) However, the collation of columns, routine args, and routine return
types is invariant, regardless of your compilation schema.
3) Collation is only consulted when comparing two string values. The
values must have the same collation.
4) Collation is unimportant when passing a string value as a routine
argument or inserting a string value into a column. The string value and
the argument type can have different collations.
Thanks,
-Rick
connect
'jdbc:derby:memory:db;create=true;collation=TERRITORY_BASED;user=test_dbo;password=test_dbopassword';
create table t( a varchar( 128 ) );
create function f( a varchar( 128 ) ) returns int language java
parameter style java no sql external name 'java.lang.Integer.parseInt';
--
-- Test return types of system function in territory based schema
--
-- fails because 'foo' is territory based but the function returns a
UCS_BASIC value
select a from test_dbo.t where 'foo' =
syscs_util.syscs_get_database_property( 'derby.database.collation' );
-- succeeds because the column and function return value are both UCS_BASIC
select tablename from sys.systables where tablename =
syscs_util.syscs_get_database_property( 'derby.database.collation' );
-- fails because the column is territory based but the return value is
UCS_BASIC
select a from test_dbo.t where a =
syscs_util.syscs_get_database_property( 'derby.database.collation' );
--
-- Test argument types of system function in territory based schema
--
--
-- All of these succeed. Collation of argument type doesn't matter.
--
select a from test_dbo.t where syscs_util.syscs_get_database_property( a
) is not null;
select tablename from sys.systables where
syscs_util.syscs_get_database_property( tablename ) is not null;
select a from test_dbo.t where syscs_util.syscs_get_database_property(
'derby.database.collation' ) is null;
--
-- Test argument types of user function in territory based schema
--
--
-- All of these succeed. Collation of argument type doesn't matter.
--
select a from test_dbo.t where test_dbo.f( '1' ) is null;
select tablename from sys.systables where tablename is null and
test_dbo.f( tablename ) is null;
select a from test_dbo.t where a is null and test_dbo.f( a ) is null;
--
-- Test insertions into territory based column in territory based schema
--
-- All of these succeed. Collation of inserted string doesn't matter.
--
insert into test_dbo.t( a ) values ( 'foo' );
insert into test_dbo.t( a ) select tablename from sys.systables;
insert into test_dbo.t( a ) select a from t;
set schema sys;
--
-- Test return types of system function in UCS_BASIC schema
--
-- succeeds because the string and return value are both UCS_BASIC
select a from test_dbo.t where 'foo' =
syscs_util.syscs_get_database_property( 'derby.database.collation' );
-- succeeds because the column and return value are both UCS_BASIC
select tablename from sys.systables where tablename =
syscs_util.syscs_get_database_property( 'derby.database.collation' );
-- fails because the column is territory based but the return value is
UCS_BASIC
select a from test_dbo.t where a =
syscs_util.syscs_get_database_property( 'derby.database.collation' );
--
-- Test argument types of system function in UCS_BASIC schema
--
--
-- All of these succeed. Collation of argument type doesn't matter.
--
select a from test_dbo.t where syscs_util.syscs_get_database_property( a
) is not null;
select tablename from sys.systables where
syscs_util.syscs_get_database_property( tablename ) is not null;
select a from test_dbo.t where syscs_util.syscs_get_database_property(
'derby.database.collation' ) is null;
--
-- Test argument types of user function in UCS_BASIC schema
--
--
-- All of these succeed. Collation of argument type doesn't matter.
--
select a from test_dbo.t where test_dbo.f( '1' ) is null;
select tablename from sys.systables where tablename is null and
test_dbo.f( tablename ) is null;
select a from test_dbo.t where a is null and test_dbo.f( a ) is null;
--
-- Test insertions into territory based column in UCS_BASIC schema
--
--
-- All of these succeed. Collation of inserted string doesn't matter.
--
insert into test_dbo.t( a ) values ( 'foo' );
insert into test_dbo.t( a ) select tablename from sys.systables;
insert into test_dbo.t( a ) select a from test_dbo.t;