[ 
https://issues.apache.org/jira/browse/TRAFODION-1145?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Selvaganesan Govindarajan updated TRAFODION-1145:
-------------------------------------------------
    Fix Version/s:     (was: 2.3)
                   2.4

> LP Bug: 1441784 - UDF: Lack of checking for scalar UDF input/output values
> --------------------------------------------------------------------------
>
>                 Key: TRAFODION-1145
>                 URL: https://issues.apache.org/jira/browse/TRAFODION-1145
>             Project: Apache Trafodion
>          Issue Type: Bug
>          Components: sql-exe
>            Reporter: Weishiun Tsai
>            Assignee: Suresh Subbiah
>            Priority: Critical
>             Fix For: 2.4
>
>         Attachments: udf_bug (1).tar
>
>
> Ideally, input/output values for a scalar UDF should be verified at the 
> create function time.  But this check is not in place right now.  As a 
> result, a lot of ill-constructed input/output values are left to be handled 
> at the run time.  And the behavior at the run time is haphazard at best.
> Here shows 3 examples of such behavior:
> (a) myudf1 defines 2 input values with the same name.  Create function does 
> not return an error.  But the invocation at the run time returns a perplexing 
> 4457 error indicating internal out-of-range index error.
> (b) myudf2 defines an input value and an output value with the same name.  
> Create function does not return an error.  But the invocation at the run time 
> returns a perplexing 4457 error complaining that there is no output value.
> (c) myudf3 defines 2 output values with the same name.  Create function does 
> not return an error.  The invocation at the run time simply ignores the 2nd 
> output value, as well as the fact that the C function only defines 1 output 
> value.  It returns one value as if the 2nd output value was never defined at 
> all.
> This is seen on the v0407 build installed on a workstation. To reproduce it:
> (1) Download the attached tar file and untar it to get the 3 files in there. 
> Put the files in any directory <mydir>.
> (2) Make sure that you have run ./sqenv.sh of your Trafodion instance first 
> as building UDF needs $MY_SQROOT for the header files.
> (3) run build.sh
> (4) Change the line “create library qa_udf_lib file '<mydir>/myudf.so';”; in 
> mytest.sql and fill in <mydir>
> (5) From sqlci, obey mytest.sql
> --------------------------------------------------------------------------------
> Here is the execution output:
> >>create schema mytest;
> --- SQL operation complete.
> >>set schema mytest;
> --- SQL operation complete.
> >>
> >>create library qa_udf_lib file '<mydir>/myudf.so';
> --- SQL operation complete.
> >>
> >>create table mytable (a int, b int);
> --- SQL operation complete.
> >>insert into mytable values (1,1),(2,2),(3,3);
> --- 3 row(s) inserted.
> >>
> >>create function myudf1
> +>(INVAL int, INVAL int)
> +>returns (OUTVAL int)
> +>language c
> +>parameter style sql
> +>external name 'qa_func_int32'
> +>library qa_udf_lib
> +>deterministic
> +>state area size 1024
> +>allow any parallelism
> +>no sql;
> --- SQL operation complete.
> >>
> >>select myudf1(a, b) from mytable;
> *** ERROR[4457] An error was encountered processing metadata for user-defined 
> function TRAFODION.MYTEST.MYUDF1.  Details: Internal error in 
> setInOrOutParam(): index position out of range..
> *** ERROR[8822] The statement was not prepared.
> >>
> >>create function myudf2
> +>(INVAL int)
> +>returns (INVAL int)
> +>language c
> +>parameter style sql
> +>external name 'qa_func_int32'
> +>library qa_udf_lib
> +>deterministic
> +>state area size 1024
> +>allow any parallelism
> +>no sql;
> --- SQL operation complete.
> >>
> >>select myudf2(a) from mytable;
> *** ERROR[4457] An error was encountered processing metadata for user-defined 
> function TRAFODION.MYTEST.MYUDF2.  Details: User-defined functions must have 
> at least one registered output value.
> *** ERROR[8822] The statement was not prepared.
> >>
> >>create function myudf3
> +>(INVAL int)
> +>returns (OUTVAL int, OUTVAL int)
> +>language c
> +>parameter style sql
> +>external name 'qa_func_int32'
> +>library qa_udf_lib
> +>deterministic
> +>state area size 1024
> +>allow any parallelism
> +>no sql;
> --- SQL operation complete.
> >>
> >>select myudf3(a) from mytable;
> OUTVAL
> -----------
>           1
>           2
>           3
> --- 3 row(s) selected.
> >>
> >>drop function myudf1 cascade;
> --- SQL operation complete.
> >>drop function myudf2 cascade;
> --- SQL operation complete.
> >>drop function myudf3 cascade;
> --- SQL operation complete.
> >>drop library qa_udf_lib cascade;
> --- SQL operation complete.
> >>drop schema mytest cascade;
> --- SQL operation complete.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to