Merge branch 'cassandra-2.2' into cassandra-3.0
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/d300a185 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/d300a185 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/d300a185 Branch: refs/heads/cassandra-3.1 Commit: d300a1850b4c9aa8b854f5fbc7921c8f9b2892b0 Parents: e8091d5 b3e6a43 Author: Robert Stupp <sn...@snazy.de> Authored: Fri Nov 27 10:51:23 2015 +0100 Committer: Robert Stupp <sn...@snazy.de> Committed: Fri Nov 27 10:55:02 2015 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cql3/statements/DropAggregateStatement.java | 15 ++++---- .../cql3/statements/DropFunctionStatement.java | 27 +++++++++----- .../cql3/statements/DropTableStatement.java | 2 ++ .../cql3/statements/DropTypeStatement.java | 10 ++++-- .../org/apache/cassandra/cql3/ViewTest.java | 10 ++++++ .../cql3/validation/entities/TypeTest.java | 10 ++++++ .../cql3/validation/entities/UFTest.java | 14 ++++++++ .../validation/operations/AggregationTest.java | 14 ++++++++ .../cql3/validation/operations/DropTest.java | 37 ++++++++++++++++++++ 10 files changed, 123 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/d300a185/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index bc183fc,c2940cc..5e6c03c --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -17,7 -5,16 +17,8 @@@ Merged from 2.2 * Fix SimpleDateType type compatibility (CASSANDRA-10027) * (Hadoop) fix splits calculation (CASSANDRA-10640) * (Hadoop) ensure that Cluster instances are always closed (CASSANDRA-10058) - * (cqlsh) show partial trace if incomplete after max_trace_wait (CASSANDRA-7645) - * Use most up-to-date version of schema for system tables (CASSANDRA-10652) - * Deprecate memory_allocator in cassandra.yaml (CASSANDRA-10581,10628) - * Expose phi values from failure detector via JMX and tweak debug - and trace logging (CASSANDRA-9526) - * Fix RangeNamesQueryPager (CASSANDRA-10509) - * Deprecate Pig support (CASSANDRA-10542) - * Reduce contention getting instances of CompositeType (CASSANDRA-10433) Merged from 2.1: + * Some DROP ... IF EXISTS incorrectly result in exceptions on non-existing KS (CASSANDRA-10658) * DeletionTime.compareTo wrong in rare cases (CASSANDRA-10749) * Force encoding when computing statement ids (CASSANDRA-10755) * Properly reject counters as map keys (CASSANDRA-10760) http://git-wip-us.apache.org/repos/asf/cassandra/blob/d300a185/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java index bef9e74,2d5ea70..2b1432b --- a/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropAggregateStatement.java @@@ -88,14 -94,14 +88,17 @@@ public final class DropAggregateStateme "'DESCRIBE AGGREGATE %s' command to find all overloads", functionName, functionName, functionName)); -- List<AbstractType<?>> argTypes = new ArrayList<>(argRawTypes.size()); -- for (CQL3Type.Raw rawType : argRawTypes) -- argTypes.add(prepareType("arguments", rawType)); -- -- Function old; ++ Function old = null; if (argsPresent) { - old = Schema.instance.findFunction(functionName, argTypes).orElse(null); - old = Functions.find(functionName, argTypes); ++ if (Schema.instance.getKSMetaData(functionName.keyspace) != null) ++ { ++ List<AbstractType<?>> argTypes = new ArrayList<>(argRawTypes.size()); ++ for (CQL3Type.Raw rawType : argRawTypes) ++ argTypes.add(prepareType("arguments", rawType)); ++ ++ old = Schema.instance.findFunction(functionName, argTypes).orElse(null); ++ } if (old == null || !(old instanceof AggregateFunction)) { if (ifExists) http://git-wip-us.apache.org/repos/asf/cassandra/blob/d300a185/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java index 3cef2da,edd8a65..6f11f9c --- a/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropFunctionStatement.java @@@ -64,19 -62,19 +64,23 @@@ public final class DropFunctionStatemen @Override public Prepared prepare() throws InvalidRequestException { -- argTypes = new ArrayList<>(argRawTypes.size()); -- for (CQL3Type.Raw rawType : argRawTypes) ++ if (Schema.instance.getKSMetaData(functionName.keyspace) != null) { -- if (rawType.isFrozen()) -- throw new InvalidRequestException("The function arguments should not be frozen; remove the frozen<> modifier"); ++ argTypes = new ArrayList<>(argRawTypes.size()); ++ for (CQL3Type.Raw rawType : argRawTypes) ++ { ++ if (rawType.isFrozen()) ++ throw new InvalidRequestException("The function arguments should not be frozen; remove the frozen<> modifier"); -- // UDT are not supported non frozen but we do not allow the frozen keyword for argument. So for the moment we -- // freeze them here -- if (!rawType.canBeNonFrozen()) -- rawType.freeze(); ++ // UDT are not supported non frozen but we do not allow the frozen keyword for argument. So for the moment we ++ // freeze them here ++ if (!rawType.canBeNonFrozen()) ++ rawType.freeze(); -- argTypes.add(rawType.prepare(functionName.keyspace).getType()); ++ argTypes.add(rawType.prepare(functionName.keyspace).getType()); ++ } } ++ return super.prepare(); } @@@ -161,7 -175,7 +165,12 @@@ Function old; if (argsPresent) { - old = Functions.find(functionName, argTypes); ++ if (argTypes == null) ++ { ++ return null; ++ } ++ + old = Schema.instance.findFunction(functionName, argTypes).orElse(null); if (old == null || !(old instanceof ScalarFunction)) { return null; http://git-wip-us.apache.org/repos/asf/cassandra/blob/d300a185/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java index 79c46f5,e690c3e..8e18cad --- a/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropTableStatement.java @@@ -62,34 -58,8 +62,36 @@@ public class DropTableStatement extend { try { + KeyspaceMetadata ksm = Schema.instance.getKSMetaData(keyspace()); ++ if (ksm == null) ++ throw new ConfigurationException(String.format("Cannot drop table in unknown keyspace '%s'", keyspace())); + CFMetaData cfm = ksm.getTableOrViewNullable(columnFamily()); + if (cfm != null) + { + if (cfm.isView()) + throw new InvalidRequestException("Cannot use DROP TABLE on Materialized View"); + + boolean rejectDrop = false; + StringBuilder messageBuilder = new StringBuilder(); + for (ViewDefinition def : ksm.views) + { + if (def.baseTableId.equals(cfm.cfId)) + { + if (rejectDrop) + messageBuilder.append(','); + rejectDrop = true; + messageBuilder.append(def.viewName); + } + } + if (rejectDrop) + { + throw new InvalidRequestException(String.format("Cannot drop table when materialized views still depend on it (%s.{%s})", + keyspace(), + messageBuilder.toString())); + } + } MigrationManager.announceColumnFamilyDrop(keyspace(), columnFamily(), isLocalOnly); - return true; + return new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TABLE, keyspace(), columnFamily()); } catch (ConfigurationException e) { http://git-wip-us.apache.org/repos/asf/cassandra/blob/d300a185/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java index 58abde9,6993ea3..6db47ca --- a/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/DropTypeStatement.java @@@ -54,11 -54,17 +54,16 @@@ public class DropTypeStatement extends public void validate(ClientState state) throws RequestValidationException { - KSMetaData ksm = Schema.instance.getKSMetaData(name.getKeyspace()); + KeyspaceMetadata ksm = Schema.instance.getKSMetaData(name.getKeyspace()); if (ksm == null) - throw new InvalidRequestException(String.format("Cannot drop type in unknown keyspace %s", name.getKeyspace())); + { + if (ifExists) + return; + else + throw new InvalidRequestException(String.format("Cannot drop type in unknown keyspace %s", name.getKeyspace())); + } - UserType old = ksm.userTypes.getType(name.getUserTypeName()); - if (old == null) + if (!ksm.types.get(name.getUserTypeName()).isPresent()) { if (ifExists) return; @@@ -130,17 -153,18 +135,18 @@@ return name.getKeyspace(); } - public boolean announceMigration(boolean isLocalOnly) throws InvalidRequestException, ConfigurationException + public Event.SchemaChange announceMigration(boolean isLocalOnly) throws InvalidRequestException, ConfigurationException { - KSMetaData ksm = Schema.instance.getKSMetaData(name.getKeyspace()); + KeyspaceMetadata ksm = Schema.instance.getKSMetaData(name.getKeyspace()); - assert ksm != null; + if (ksm == null) - return false; // do not assert (otherwise IF EXISTS case fails) ++ return null; // do not assert (otherwise IF EXISTS case fails) - UserType toDrop = ksm.userTypes.getType(name.getUserTypeName()); + UserType toDrop = ksm.types.getNullable(name.getUserTypeName()); // Can be null with ifExists if (toDrop == null) - return false; + return null; MigrationManager.announceTypeDrop(toDrop, isLocalOnly); - return true; + return new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TYPE, keyspace(), name.getStringTypeName()); } }