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

Robert Stupp edited comment on CASSANDRA-10783 at 11/29/15 1:45 PM:
--------------------------------------------------------------------

--This is doable for 2.2 without being too intrusive.--

EDIT:
I've implemented a quick hack, which allows *constants* as function arguments. 
The crux at the moment is that it (mostly) requires an explicit cast, which 
looks awkward:
{code}
SELECT maxOf(val, (int)101) FROM maxValue WHERE id=1;
{code}
At parse time, we only know the _weak_ type of a constant 
(TEXT/VARINT/DECIMAL/BOOLEAN/UUID/DATE/TIME/etc.). So your example would be 
equivalent to
{code}
SELECT maxOf(val, (varint)101) FROM maxValue WHERE id=1;
{code}
(varint is the "best" type match for an integer and is not compatible with 
{{int}} ({{Int32Type.isCompatibleWith()}}).

I'm not very convinced to force users to add an explicit cast.
OTOH making it more "intuitive" would might make the statement ambiguous - 
especially if you think of overloading your function with something like 
{{maxOf(int, bigint)}} or  {{maxOf(int, double)}}.

It would be nicer if we also allow bind variables as function arguments. But 
that's more complicated - it's doable, of course, but feels too intrusive for 
2.2 & 3.0. The restrictions regarding "explicit" types are the same as for 
constants.

Altogether this needs more conceptual work to "do it right" - so, it's doable 
for 2.2, but I don't feel comfortable with it at the moment (i.e. for 2.2).


was (Author: snazy):
This is doable for 2.2 without being too intrusive.

> Allow literal value as parameter of UDF & UDA
> ---------------------------------------------
>
>                 Key: CASSANDRA-10783
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-10783
>             Project: Cassandra
>          Issue Type: Improvement
>          Components: CQL
>            Reporter: DOAN DuyHai
>            Assignee: Robert Stupp
>            Priority: Minor
>             Fix For: 3.x
>
>
> I have defined the following UDF
> {code:sql}
> CREATE OR REPLACE FUNCTION  maxOf(current int, testValue int) RETURNS NULL ON 
> NULL INPUT 
> RETURNS int 
> LANGUAGE java 
> AS  'return Math.max(current,testValue);'
> CREATE TABLE maxValue(id int primary key, val int);
> INSERT INTO maxValue(id, val) VALUES(1, 100);
> SELECT maxOf(val, 101) FROM maxValue WHERE id=1;
> {code}
> I got the following error message:
> {code}
> SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] 
> message="line 1:19 no viable alternative at input '101' (SELECT maxOf(val1, 
> [101]...)">
> {code}
>  It would be nice to allow literal value as parameter of UDF and UDA too.
>  I was thinking about an use-case for an UDA groupBy() function where the end 
> user can *inject* at runtime a literal value to select which aggregation he 
> want to display, something similar to GROUP BY ... HAVING <filter clause>



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to