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

Tyler Hobbs commented on CASSANDRA-9037:
----------------------------------------

I don't think we need to defer for collection args, only return types.  The 
get() method for collection Terminals (e.g. {{Lists.Value.get()}}) serializes 
the collection based on the requested protocol version (the highest version 
supported by the driver, in this case).  The function will also execute 
assuming that same protocol version, so it will have no problems deserializing 
the collection.  The reason that the return type specifically is problematic is 
that the function results may need further processing (such as another function 
call) or reserialization (if the protocol version is less than 3).  Basically, 
the serialization format for the results has to match the protocol version in 
use.

Also, don't forget to handle tuple and UDT return types specially.  If they 
contain collections, those collections will be serialized with the format for 
whatever protocol version we execute the function with.

> Terminal UDFs evaluated at prepare time throw protocol version error
> --------------------------------------------------------------------
>
>                 Key: CASSANDRA-9037
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-9037
>             Project: Cassandra
>          Issue Type: Bug
>            Reporter: Sam Tunnicliffe
>            Assignee: Sam Tunnicliffe
>             Fix For: 3.0
>
>
> When a pure function with only terminal arguments (or with no arguments) is 
> used in a where clause, it's executed at prepare time and 
> {{Server.CURRENT_VERSION}} passed as the protocol version for serialization 
> purposes. For native functions, this isn't a problem, but UDFs use classes in 
> the bundled java-driver-core jar for (de)serialization of args and return 
> values. When {{Server.CURRENT_VERSION}} is greater than the highest version 
> supported by the bundled java driver the execution fails with the following 
> exception:
> {noformat}
> ERROR [SharedPool-Worker-1] 2015-03-24 18:10:59,391 QueryMessage.java:132 - 
> Unexpected error during query
> org.apache.cassandra.exceptions.FunctionExecutionException: execution of 
> 'ks.overloaded[text]' failed: java.lang.IllegalArgumentException: No protocol 
> version matching integer version 4
>     at 
> org.apache.cassandra.exceptions.FunctionExecutionException.create(FunctionExecutionException.java:35)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.udf.gen.Cksoverloaded_1.execute(Cksoverloaded_1.java)
>  ~[na:na]
>     at 
> org.apache.cassandra.cql3.functions.FunctionCall.executeInternal(FunctionCall.java:78)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.functions.FunctionCall.access$200(FunctionCall.java:34)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.functions.FunctionCall$Raw.execute(FunctionCall.java:176)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.functions.FunctionCall$Raw.prepare(FunctionCall.java:161)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.SingleColumnRelation.toTerm(SingleColumnRelation.java:108)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.SingleColumnRelation.newEQRestriction(SingleColumnRelation.java:143)
>  ~[main/:na]
>     at org.apache.cassandra.cql3.Relation.toRestriction(Relation.java:127) 
> ~[main/:na]
>     at 
> org.apache.cassandra.cql3.restrictions.StatementRestrictions.<init>(StatementRestrictions.java:126)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.statements.SelectStatement$RawStatement.prepareRestrictions(SelectStatement.java:787)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.statements.SelectStatement$RawStatement.prepare(SelectStatement.java:740)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.QueryProcessor.getStatement(QueryProcessor.java:488)
>  ~[main/:na]
>     at 
> org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:252) 
> ~[main/:na]
>     at 
> org.apache.cassandra.cql3.QueryProcessor.process(QueryProcessor.java:246) 
> ~[main/:na]
>     at 
> org.apache.cassandra.transport.messages.QueryMessage.execute(QueryMessage.java:119)
>  ~[main/:na]
>     at 
> org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:475)
>  [main/:na]
>     at 
> org.apache.cassandra.transport.Message$Dispatcher.channelRead0(Message.java:371)
>  [main/:na]
>     at 
> io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
>  [netty-all-4.0.23.Final.jar:4.0.23.Final]
>     at 
> io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
>  [netty-all-4.0.23.Final.jar:4.0.23.Final]
>     at 
> io.netty.channel.AbstractChannelHandlerContext.access$700(AbstractChannelHandlerContext.java:32)
>  [netty-all-4.0.23.Final.jar:4.0.23.Final]
>     at 
> io.netty.channel.AbstractChannelHandlerContext$8.run(AbstractChannelHandlerContext.java:324)
>  [netty-all-4.0.23.Final.jar:4.0.23.Final]
>     at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
> [na:1.7.0_71]
>     at 
> org.apache.cassandra.concurrent.AbstractTracingAwareExecutorService$FutureTask.run(AbstractTracingAwareExecutorService.java:164)
>  [main/:na]
>     at org.apache.cassandra.concurrent.SEPWorker.run(SEPWorker.java:105) 
> [main/:na]
>     at java.lang.Thread.run(Thread.java:745) [na:1.7.0_71]
> Caused by: java.lang.IllegalArgumentException: No protocol version matching 
> integer version 4
>     at 
> com.datastax.driver.core.ProtocolVersion.fromInt(ProtocolVersion.java:89) 
> ~[cassandra-driver-core-2.1.2.jar:na]
>     at 
> org.apache.cassandra.cql3.functions.UDFunction.compose(UDFunction.java:177) 
> ~[main/:na]
>     ... 25 common frames omitted
> {noformat}
> This is currently the case on trunk following the bump of 
> {{Server.CURRENT_VERSION}} to 4 by CASSANDRA-7660.



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

Reply via email to