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

Rick Hillegas edited comment on DERBY-3069 at 10/26/12 6:54 PM:
----------------------------------------------------------------

Here is my current thinking on this topic:

1) We would clearly mark this as a Derby extension by using a new DERBY 
parameter style.

2) We would clearly mark routines which were meant to resolve against vararg 
methods. If the last (and only the last) argument of the routine declaration 
ended with an ellipsis token (...), then the routine would have to resolve to a 
Java varargs method.

So, for example, consider the following SQL function definition. Note the use 
of the DERBY parameter style and the ellipsis token:

create function maximum( a int... ) returns int
language java parameter style derby no sql
external name 'IntFunctions.maximum';

This SQL signature would resolve to the following Java vararg method:

    public  static  Integer maximum( Integer... args )
    {
        if ( args == null ) { return null; }
        if ( args.length == 0 ) { return null; }

        int     result = Integer.MIN_VALUE;
        for ( Integer value : args )
        {
            if ( value == null ) { return null; }
            else { result = Math.max( result, value.intValue() ); }
        }

        return result;
    }

3) We would need to decide what to do about procedures which return dynamic 
ResultSets. That is because dynamic ResultSets and Java varargs both make 
claims on the trailing arguments of the Java method signature. Here are some 
possible ways to handle this problem:

3a) Do not allow varargs if the procedure is defined with a DYNAMIC RESULT SETS 
greater than 0.

3b) Allow the Java varargs argument to come AFTER the ResultSet[] arguments. So 
the Java method signature would begin with the non-vararg arguments, followed 
by a number of ResultSet[] arguments equal to the value of DYNAMIC RESULT SETS, 
followed by a trailing ellipsis tagged argument. So this SQL declaration

create procedure varargProcWithDynamicResultSets
( in a int, b int, in f bigint... )
language java parameter style derby reads sql data
dynamic result sets 2
external name 'Procs.varargProcWithDynamicResultSets';

would bind to this Java signature:

public static void varargProcWithDynamicResultSets
( int a, int b, int c, ResultSet[] d, ResultSet[] e, long... f )


What do other people think?

Thanks,
-Rick
                
      was (Author: rhillegas):
    Here is my current thinking on this topic:

1) We would clearly mark this as a Derby extension by using a new DERBY 
parameter style.

2) We would clearly mark routines which were meant to resolve against vararg 
methods. If the last (and only the last) argument of the routine declaration 
ended with an ellipsis token (...), then the routine would have to resolve to a 
Java varargs method.

So, for example, consider the following SQL function definition. Note the use 
of the DERBY parameter style and the ellipsis token:

create function maximum( a int... ) returns int
language java parameter style derby no sql
external name 'IntFunctions.maximum';

This SQL signature would resolve to the following Java vararg method:

    public  static  Integer maximum( Integer... args )
    {
        if ( args == null ) { return null; }
        if ( args.length == 0 ) { return null; }

        int     result = Integer.MIN_VALUE;
        for ( Integer value : args )
        {
            if ( value == null ) { return null; }
            else { result = Math.max( result, value.intValue() ); }
        }

        return result;
    }

3) We would need to decide what to do about procedures which return dynamic 
ResultSets. That is because dynamic ResultSets and Java varargs both make 
claims on the trailing arguments of the Java method signature. Here are some 
possible ways to handle this problem:

3a) Do not allow varargs if the procedure is defined with a DYNAMIC RESULT SETS 
greater than 0.

3b) Allow the Java varargs argument to come AFTER the ResultSet[] arguments. So 
the Java method signature would begin with the non-vararg arguments, followed 
by a number of ResultSet[] arguments equal to the value of DYNAMIC RESULT SETS, 
followed by a trailing ellipsis tagged argument. So this SQL declaration

create procedure varargProcWithDynamicResultSets
( in a int, b int, in f bigint... )
language java parameter style java reads sql data
dynamic result sets 2
external name 'Procs.varargProcWithDynamicResultSets';

would bind to this Java signature:

public static void varargProcWithDynamicResultSets
( int a, int b, int c, ResultSet[] d, ResultSet[] e, long... f )


What do other people think?

Thanks,
-Rick
                  
> Derby does not resolve functions bound to methods with varargs.
> ---------------------------------------------------------------
>
>                 Key: DERBY-3069
>                 URL: https://issues.apache.org/jira/browse/DERBY-3069
>             Project: Derby
>          Issue Type: Improvement
>          Components: SQL
>    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
>            Reporter: Rick Hillegas
>              Labels: derby_triage10_10
>         Attachments: derby-3069-01-varargs-aa.diff, 
> derby-3069-01-varargs-ab.diff, derby-3069-02-backout.diff, z.java, z.sql
>
>
> Varargs were added in Java 5. It would be nice if Derby let you invoke a 
> function bound to a method with a variable length argument list. The 
> Reference Guide states a small number of restrictions for methods which can 
> be invoked as Derby functions: They must be public, static, and not have 
> arguments which are long datatypes. I see no reason that Derby shouldn't be 
> able to resolve and invoke functions which are bound to methods which don't 
> suffer these limitations but which have variable argument lists.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to