cassandra-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Robert Stupp (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (CASSANDRA-9321) Aggregate UDFs allow SFUNC return type to differ from STYPE if FFUNC specified
Date Thu, 07 May 2015 09:32:00 GMT

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

Robert Stupp updated CASSANDRA-9321:
------------------------------------
    Attachment: 9321.txt

The attached patch tackles both issues:
* now always checks {{STYPE}} against {{SFUNC}} return type (argument type is implicitly checked
using {{Functions.find()}})
* the "new NPE", which is caused by the broken aggregate ({{UDAggregate}} could not be initialized
- so {{stateFunction}} was {{null}})
* added new utest against the original issue (SFUNC return type and arg type differs)


> Aggregate UDFs allow SFUNC return type to differ from STYPE if FFUNC specified
> ------------------------------------------------------------------------------
>
>                 Key: CASSANDRA-9321
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-9321
>             Project: Cassandra
>          Issue Type: Bug
>          Components: Core
>            Reporter: Zachary Kurey
>            Assignee: Robert Stupp
>             Fix For: 3.0
>
>         Attachments: 9321.txt
>
>
> When a final function is specified in an aggregate C* allows the return type of the state
function to not match the state type.  
> Allowing the mismatch if a final function is specified seems to be intentional as if
you don't provide a final function and you provide a state function with a return type that
doesn't match the state type, then C* gives you an error that states that they must match
"unless a final function is specified".  
> It seems incorrect regardless of whether or not a final function is present to allow
the state functions return type to vary from state type.  And indeed if you do so it produces
an error when you try to use the aggregate.
> Here is a simple example that shows the problem:
> {code}
> CREATE OR REPLACE FUNCTION state_func(state int, p2 int)
> RETURNS double LANGUAGE java AS 'return Double.valueOf(1.0);';
> CREATE OR REPLACE FUNCTION final_func(state int)
> RETURNS int
> LANGUAGE java
> AS 'return Integer.valueOf(1);';
> CREATE OR REPLACE AGGREGATE my_aggregate( int )
> SFUNC state_func
> STYPE int
> FINALFUNC final_func
> INITCOND 1;
> SELECT my_aggregate(column) FROM table;
> {code}
> The select produces the error:
> {noformat}
> Aggregate 'ks.my_aggregate : (int) -> int' exists but hasn't been loaded successfully
for the following reason: Referenced state function 'ks.state_func [double, int]' for aggregate
'ks.my_aggregate' does not exist.
> {noformat}
> I was reproducing this with 3.0 trunk, though now I just grabbed the latest and there
is an NPE instead of the error above:
> {noformat}
> java.lang.NullPointerException: at index 1
> 	at com.google.common.collect.ObjectArrays.checkElementNotNull(ObjectArrays.java:240)
~[guava-16.0.jar:na]
> 	at com.google.common.collect.ImmutableSet.construct(ImmutableSet.java:195) ~[guava-16.0.jar:na]
> 	at com.google.common.collect.ImmutableSet.of(ImmutableSet.java:116) ~[guava-16.0.jar:na]
> 	at org.apache.cassandra.cql3.functions.UDAggregate.getFunctions(UDAggregate.java:110)
~[main/:na]
> 	at org.apache.cassandra.cql3.selection.AbstractFunctionSelector$1.getFunctions(AbstractFunctionSelector.java:78)
~[main/:na]
> 	at org.apache.cassandra.cql3.selection.SelectorFactories.getFunctions(SelectorFactories.java:105)
~[main/:na]
> {noformat}



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

Mime
View raw message