db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Knut Anders Hatlen (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-5901) You can declare user-defined functions which shadow builtin functions by the same name.
Date Mon, 02 Dec 2013 14:47:36 GMT

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

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

There's also the question what to do with the ambiguous function names in triggers, views,
generation clauses and similar, where we store the original SQL text in system tables. Currently,
they will resolve to whatever was the correct function at some ill-defined point in time (such
as the last time the trigger SPS was recompiled). They should resolve to whatever was the
correct function at definition time.

DERBY-6362 has some code attached to it, which replaces unqualified identifiers with schema-qualified
identifiers in CHECK constraints before storing them. Although it's not the primary purpose
of DERBY-6362, it has the nice side effect that CHECK constraints will preserve the schema
that the function resolved to at the time the constraint was created. I think that code is
general enough to be used in triggers, views and generation clauses as well.

> 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)

Mime
View raw message