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

Knut Anders Hatlen commented on DERBY-5901:
-------------------------------------------

In the approach used in DERBY-6362, it means that the SQL text of a CHECK 
constraint is expanded before it is put into a column in SYS.SYSCHECKS. That 
is, if you execute "create table(x int, check(x < sin(pi())))", it would 
previously store 'check(x < sin(pi()))' in SYS.SYSCHECKS.CHECKDEFINITION, and 
now it will store 'check(x < "SYSFUN"."SIN"("SYSFUN"."PI"()))' instead.

We could do the same with the SQL text that we put into 
SYS.SYSTRIGGERS.TRIGGERDEFINITION, SYS.SYSTRIGGERS.WHENCLAUSETEXT, 
SYS.SYSVIEWS.VIEWDEFINITION and SYS.SYSCOLUMNS.COLUMNDEFAULT. As an extra 
bonus, it will also solve DERBY-6370 for us.

> You can declare user-defined functions which shadow builtin functions by the 
> same name.
> ---------------------------------------------------------------------------------------
>
>                 Key: DERBY-5901
>                 URL: https://issues.apache.org/jira/browse/DERBY-5901
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.10.1.1
>            Reporter: Rick Hillegas
>              Labels: derby_triage10_10
>
> You can override a Derby builtin function by creating a function with the 
> same name. This can give rise to wrong results.
> Consider the following user code:
> public class FakeSin
> {
>     public  static  Double  sin( Double input ) { return new Double( 3.0 ); }
> }
> Now run the following script:
> connect 'jdbc:derby:memory:db;create=true';
> values sin( 0.5 );
> create function sin( a double ) returns double language java parameter style 
> java no sql external name 'FakeSin.sin';
> values sin( 0.5 );
> values sin(  0.5 );
> Note the following:
> 1) The first invocation of sin() returns the expected result.
> 2) You are allowed to create a user-defined function named "sin" which can 
> shadow the builtin function.
> 3) The second invocation of sin() returns the result of running the builtin 
> function. This is because the second invocation is character-for-character 
> identical to the first, so Derby just uses the previously prepared statement. 
> 4) But the third invocation of sin() returns the result of running the 
> user-defined function. Note that the third invocation has an extra space in 
> it, which causes Derby to compile it from scratch, picking up the 
> user-defined function instead of the builtin one.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to