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)); + } }