Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.2 4985fcc86 -> 61ac125a4
  refs/heads/cassandra-3.0 70c8a53de -> b0f2266b2
  refs/heads/trunk 29066afea -> 5edd148c2


Replacing an aggregate with a new version doesn't reset INITCOND

patch by Robert Stupp; reviewed by Benjamin Lerer for CASSANDRA-10840


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

Branch: refs/heads/cassandra-2.2
Commit: 61ac125a4d493ea6707fab6e3e61d6a41526eb34
Parents: 4985fcc
Author: Robert Stupp <sn...@snazy.de>
Authored: Sat Feb 20 10:59:54 2016 +0100
Committer: Robert Stupp <sn...@snazy.de>
Committed: Sat Feb 20 10:59:54 2016 +0100

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../cassandra/schema/LegacySchemaTables.java    |  9 +--
 .../validation/operations/AggregationTest.java  | 59 +++++++++++++++++++-
 3 files changed, 61 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/61ac125a/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index d3dcdbc..9d0046b 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.2.6
+ * Replacing an aggregate with a new version doesn't reset INITCOND 
(CASSANDRA-10840)
  * (cqlsh) cqlsh cannot be called through symlink (CASSANDRA-11037)
  * fix ohc and java-driver pom dependencies in build.xml (CASSANDRA-10793)
  * Protect from keyspace dropped during repair (CASSANDRA-11065)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/61ac125a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java 
b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java
index 5eae60b..0ef9852 100644
--- a/src/java/org/apache/cassandra/schema/LegacySchemaTables.java
+++ b/src/java/org/apache/cassandra/schema/LegacySchemaTables.java
@@ -1394,12 +1394,9 @@ public class LegacySchemaTables
         adder.resetCollection("argument_types");
         adder.add("return_type", aggregate.returnType().toString());
         adder.add("state_func", aggregate.stateFunction().name().name);
-        if (aggregate.stateType() != null)
-            adder.add("state_type", aggregate.stateType().toString());
-        if (aggregate.finalFunction() != null)
-            adder.add("final_func", aggregate.finalFunction().name().name);
-        if (aggregate.initialCondition() != null)
-            adder.add("initcond", aggregate.initialCondition());
+        adder.add("state_type", aggregate.stateType().toString());
+        adder.add("final_func", aggregate.finalFunction() != null ? 
aggregate.finalFunction().name().name : null);
+        adder.add("initcond", aggregate.initialCondition() != null ? 
aggregate.initialCondition() : null);
 
         for (AbstractType<?> argType : aggregate.argTypes())
             adder.addListEntry("argument_types", argType.toString());

http://git-wip-us.apache.org/repos/asf/cassandra/blob/61ac125a/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java
----------------------------------------------------------------------
diff --git 
a/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java
 
b/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java
index 0e0313c..e7f47a2 100644
--- 
a/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java
+++ 
b/test/unit/org/apache/cassandra/cql3/validation/operations/AggregationTest.java
@@ -18,6 +18,7 @@
 package org.apache.cassandra.cql3.validation.operations;
 
 import java.math.BigDecimal;
+import java.nio.ByteBuffer;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
@@ -37,7 +38,6 @@ import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.exceptions.FunctionExecutionException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.transport.Event;
 import org.apache.cassandra.transport.messages.ResultMessage;
 
@@ -387,7 +387,7 @@ public class AggregationTest extends CQLTester
         assertRows(execute("SELECT " + copySign + "(c, d) FROM %s"), row(1.2), 
row(-1.3), row(1.4));
         assertRows(execute("SELECT max(" + copySign + "(c, d)) FROM %s"), 
row(1.4));
         assertRows(execute("SELECT " + copySign + "(c, max(c)) FROM %s"), 
row(1.2));
-        assertRows(execute("SELECT " + copySign + "(max(c), c) FROM %s"), 
row(-1.4));;
+        assertRows(execute("SELECT " + copySign + "(max(c), c) FROM %s"), 
row(-1.4));
     }
 
     @Test
@@ -1684,4 +1684,59 @@ public class AggregationTest extends CQLTester
         assertRows(execute("SELECT " + aRNON + "(b) FROM %s"), row("fin"));
 
     }
+
+    @Test
+    public void testOrReplaceOptionals() throws Throwable
+    {
+        String fState = createFunction(KEYSPACE,
+                                       "list<text>, int",
+                                       "CREATE FUNCTION %s(s list<text>, i 
int) " +
+                                       "CALLED ON NULL INPUT " +
+                                       "RETURNS list<text> " +
+                                       "LANGUAGE java " +
+                                       "AS 'if (i != null) 
s.add(String.valueOf(i)); return s;'");
+
+        String fFinal = shortFunctionName(createFunction(KEYSPACE,
+                                                         "list<text>",
+                                                         "CREATE FUNCTION %s(s 
list<text>) " +
+                                                         "CALLED ON NULL INPUT 
" +
+                                                         "RETURNS list<text> " 
+
+                                                         "LANGUAGE java " +
+                                                         "AS 'return s;'"));
+
+        String a = createAggregate(KEYSPACE,
+                                   "int",
+                                   "CREATE AGGREGATE %s(int) " +
+                                   "SFUNC " + shortFunctionName(fState) + ' ' +
+                                   "STYPE list<text> ");
+
+        checkOptionals(a, null, null);
+
+        String ddlPrefix = "CREATE OR REPLACE AGGREGATE " + a + "(int) " +
+                           "SFUNC " + shortFunctionName(fState) + ' ' +
+                           "STYPE list<text> ";
+
+        // Test replacing INITCOND
+        for (String condition : new String[]{"", "INITCOND null"})
+        {
+            execute(ddlPrefix + "INITCOND [  ] ");
+            checkOptionals(a, null, ByteBuffer.allocate(4));
+
+            execute(ddlPrefix + condition);
+            checkOptionals(a, null, null);
+        }
+
+        // Test replacing FINALFUNC
+        execute(ddlPrefix + "FINALFUNC " + shortFunctionName(fFinal) + " ");
+        checkOptionals(a, shortFunctionName(fFinal), null);
+
+        execute(ddlPrefix);
+        checkOptionals(a, null, null);
+    }
+
+    private void checkOptionals(String aggregateName, String finalFunc, 
ByteBuffer initCond) throws Throwable
+    {
+        assertRows(execute("SELECT final_func, initcond FROM 
system.schema_aggregates WHERE keyspace_name=? AND aggregate_name=?", KEYSPACE, 
shortFunctionName(aggregateName)),
+                   row(finalFunc, initCond));
+    }
 }

Reply via email to