jaikiran pai created CASSANDRA-13788:
----------------------------------------

             Summary: Seemingly valid Java UDF fails compilation with error 
"type cannot be resolved. It is indirectly referenced from required .class 
files"
                 Key: CASSANDRA-13788
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-13788
             Project: Cassandra
          Issue Type: Bug
          Components: CQL
         Environment: Cassandra 3.11.0 

java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

            Reporter: jaikiran pai


We are moving to Cassandra 3.11.0 from Cassandra 2.x. We have a Java UDF which 
is straightforward and looks something like:

{code}
CREATE FUNCTION utf8_text_size (val TEXT)
CALLED ON NULL INPUT
RETURNS INT
LANGUAGE java
AS 'if (val == null) {                return 0;            }            try {   
             return val.getBytes("UTF-8").length;            } catch (Exception 
e) {                throw new RuntimeException("Failed to compute size of UTF-8 
text", e);            }';
{code}

This works fine in Cassandra 2.x. In Cassandra 3.11.0 when this UDF is being 
created, we keep running into this exception when the UDF is being (internally) 
compiled:

{code}
InvalidRequest: Error from server: code=2200 [Invalid query] message="Java 
source compilation failed:
Line 1: The type java.io.UnsupportedEncodingException cannot be resolved. It is 
indirectly referenced from required .class files
Line 1: The type java.nio.charset.Charset cannot be resolved. It is indirectly 
referenced from required .class files
Line 1: The method getBytes(String) from the type String refers to the missing 
type UnsupportedEncodingException
{code}


I realize there have been changes to the UDF support in Cassandra 3.x and I 
also have read this[1] article related to it. However, I don't see anything 
wrong with the above UDF. In fact, I enabled TRACE logging of 
{{org.apache.cassandra.cql3.functions}} which is where the 
{{JavaBasedUDFunction}} resides to see what the generated source looks like. 
Here's what it looks like (I have modified the classname etc, but nothing else):

{code}
package org.myapp;

import java.nio.ByteBuffer;
import java.util.*;

import org.apache.cassandra.cql3.functions.JavaUDF;
import org.apache.cassandra.cql3.functions.UDFContext;
import org.apache.cassandra.transport.ProtocolVersion;

import com.datastax.driver.core.TypeCodec;
import com.datastax.driver.core.TupleValue;
import com.datastax.driver.core.UDTValue;

public final class CassandraUDFTest extends JavaUDF
{
    public CassandraUDFTest(TypeCodec<Object> returnCodec, TypeCodec<Object>[] 
argCodecs, UDFContext udfContext)
    {
        super(returnCodec, argCodecs, udfContext);
    }

    protected ByteBuffer executeImpl(ProtocolVersion protocolVersion, 
List<ByteBuffer> params)
    {
        Integer result = xsome_keyspace_2eutf8_text_size_3232115_9(
            /* parameter 'val' */
            (String) super.compose(protocolVersion, 0, params.get(0))
        );
        return super.decompose(protocolVersion, result);
    }

    protected Object executeAggregateImpl(ProtocolVersion protocolVersion, 
Object firstParam, List<ByteBuffer> params)
    {
        Integer result = xsome_keyspace_2eutf8_text_size_3232115_9(
            /* parameter 'val' */
            (String) firstParam
        );
        return result;
    }

    private Integer xsome_keyspace_2eutf8_text_size_3232115_9(String val)
    {
if (val == null) {                return 0;            }            try {       
         return val.getBytes("UTF-8").length;            } catch (Exception e) 
{                throw new RuntimeException("Failed to compute size of UTF-8 
text", e);            }
    }
}
{code}

I then went ahead and compiled this generated class from command line using the 
(Oracle) Java compiler as follows:

{code}
javac -cp "/opt/cassandra/apache-cassandra-3.11.0/lib/*" 
org/myapp/CassandraUDFTest.java
{code}

and it compiled fine without any errors. 

Looking at the {{JavaBasedUDFunction}} which compiles this UDF at runtime, it's 
using Eclipse JDT compiler. I haven't looked into why it would be running into 
these compilation errors.



[1] http://batey.info/cassandra-udfs.html



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to