Generic Java UDF types broken for RETURNS NULL ON NULL INPUT

patch by Robert Stupp; reviewed by Tyler Hobbs for CASSANDRA-11309


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/902877a6
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/902877a6
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/902877a6

Branch: refs/heads/trunk
Commit: 902877a652267872358c02080ccf5b5f8e93d60a
Parents: 04e7723
Author: Robert Stupp <[email protected]>
Authored: Thu May 12 12:04:28 2016 +0100
Committer: Robert Stupp <[email protected]>
Committed: Thu May 12 12:04:28 2016 +0100

----------------------------------------------------------------------
 .../apache/cassandra/cql3/functions/UDHelper.java | 15 +++++++--------
 .../cql3/validation/entities/UFTest.java          | 18 +++++++++++++++++-
 2 files changed, 24 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/902877a6/src/java/org/apache/cassandra/cql3/functions/UDHelper.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java 
b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java
index 9f322e5..86cb89d 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UDHelper.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UDHelper.java
@@ -89,20 +89,19 @@ public final class UDHelper
                 // only care about classes that can be used in a data type
                 Class<?> clazz = typeToken.getRawType();
                 if (clazz == Integer.class)
-                    clazz = int.class;
+                    typeToken = TypeToken.of(int.class);
                 else if (clazz == Long.class)
-                    clazz = long.class;
+                    typeToken = TypeToken.of(long.class);
                 else if (clazz == Byte.class)
-                    clazz = byte.class;
+                    typeToken = TypeToken.of(byte.class);
                 else if (clazz == Short.class)
-                    clazz = short.class;
+                    typeToken = TypeToken.of(short.class);
                 else if (clazz == Float.class)
-                    clazz = float.class;
+                    typeToken = TypeToken.of(float.class);
                 else if (clazz == Double.class)
-                    clazz = double.class;
+                    typeToken = TypeToken.of(double.class);
                 else if (clazz == Boolean.class)
-                    clazz = boolean.class;
-                typeToken = TypeToken.of(clazz);
+                    typeToken = TypeToken.of(boolean.class);
             }
             paramTypes[i] = typeToken;
         }

http://git-wip-us.apache.org/repos/asf/cassandra/blob/902877a6/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java 
b/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java
index 3cd5be7..e7c46a5 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java
@@ -2504,7 +2504,23 @@ public class UFTest extends CQLTester
 
         String typeName = createType("CREATE TYPE %s (txt text, i int)");
 
-        String f = createFunction(KEYSPACE, "text",
+        createFunction(KEYSPACE, "map<text,bigint>,list<text>",
+                       "CREATE FUNCTION IF NOT EXISTS %s(state 
map<text,bigint>, styles list<text>)\n" +
+                       "  RETURNS NULL ON NULL INPUT\n" +
+                       "  RETURNS map<text,bigint>\n" +
+                       "  LANGUAGE java\n" +
+                       "  AS $$\n" +
+                       "    for (String style : styles) {\n" +
+                       "      if (state.containsKey(style)) {\n" +
+                       "        state.put(style, state.get(style) + 1L);\n" +
+                       "      } else {\n" +
+                       "        state.put(style, 1L);\n" +
+                       "      }\n" +
+                       "    }\n" +
+                       "    return state;\n" +
+                       "  $$");
+
+        createFunction(KEYSPACE, "text",
                                   "CREATE OR REPLACE FUNCTION %s("             
    +
                                   "  listText list<text>,"                     
    +
                                   "  setText set<text>,"                       
    +

Reply via email to