Repository: cassandra Updated Branches: refs/heads/cassandra-3.0 4a00438a2 -> 18e2fca8b
Fix handling counters in supercolumns when parsing schema patch by Aleksey Yeschenko; reviewed by Sylvain Lebresne for CASSANDRA-10365 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/18e2fca8 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/18e2fca8 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/18e2fca8 Branch: refs/heads/cassandra-3.0 Commit: 18e2fca8b47f9e2dc84ad43c957f0d226dd883d7 Parents: 4a00438 Author: Aleksey Yeschenko <alek...@apache.org> Authored: Thu Nov 5 11:01:51 2015 +0000 Committer: Aleksey Yeschenko <alek...@apache.org> Committed: Thu Nov 5 11:18:38 2015 +0000 ---------------------------------------------------------------------- .../org/apache/cassandra/cql3/CQL3Type.java | 22 +++++++++++++++++--- .../apache/cassandra/schema/CQLTypeParser.java | 2 +- src/java/org/apache/cassandra/schema/Types.java | 2 +- 3 files changed, 21 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/18e2fca8/src/java/org/apache/cassandra/cql3/CQL3Type.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/CQL3Type.java b/src/java/org/apache/cassandra/cql3/CQL3Type.java index 7f5afa6..fde3fab 100644 --- a/src/java/org/apache/cassandra/cql3/CQL3Type.java +++ b/src/java/org/apache/cassandra/cql3/CQL3Type.java @@ -17,10 +17,8 @@ */ package org.apache.cassandra.cql3; -import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; -import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -355,6 +353,11 @@ public interface CQL3Type public abstract CQL3Type prepare(String keyspace, Types udts) throws InvalidRequestException; + public CQL3Type prepareInternal(String keyspace, Types udts) throws InvalidRequestException + { + return prepare(keyspace, udts); + } + public boolean referencesUserType(String name) { return false; @@ -461,11 +464,24 @@ public interface CQL3Type public CQL3Type prepare(String keyspace, Types udts) throws InvalidRequestException { + return prepare(keyspace, udts, false); + } + + public CQL3Type prepareInternal(String keyspace, Types udts) + { + return prepare(keyspace, udts, true); + } + + public CQL3Type prepare(String keyspace, Types udts, boolean isInternal) throws InvalidRequestException + { assert values != null : "Got null values type for a collection"; if (!frozen && values.supportsFreezing() && !values.frozen) throw new InvalidRequestException("Non-frozen collections are not allowed inside collections: " + this); - if (values.isCounter()) + + // we represent Thrift supercolumns as maps, internally, and we do allow counters in supercolumns. Thus, + // for internal type parsing (think schema) we have to make an exception and allow counters as (map) values + if (values.isCounter() && !isInternal) throw new InvalidRequestException("Counters are not allowed inside collections: " + this); if (keys != null) http://git-wip-us.apache.org/repos/asf/cassandra/blob/18e2fca8/src/java/org/apache/cassandra/schema/CQLTypeParser.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/schema/CQLTypeParser.java b/src/java/org/apache/cassandra/schema/CQLTypeParser.java index 87eebd7..ed68498 100644 --- a/src/java/org/apache/cassandra/schema/CQLTypeParser.java +++ b/src/java/org/apache/cassandra/schema/CQLTypeParser.java @@ -52,7 +52,7 @@ public final class CQLTypeParser if (udt != null) return udt; - return parseRaw(unparsed).prepare(keyspace, userTypes).getType(); + return parseRaw(unparsed).prepareInternal(keyspace, userTypes).getType(); } static CQL3Type.Raw parseRaw(String type) http://git-wip-us.apache.org/repos/asf/cassandra/blob/18e2fca8/src/java/org/apache/cassandra/schema/Types.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/schema/Types.java b/src/java/org/apache/cassandra/schema/Types.java index 0d6e36d..4f3d78c 100644 --- a/src/java/org/apache/cassandra/schema/Types.java +++ b/src/java/org/apache/cassandra/schema/Types.java @@ -274,7 +274,7 @@ public final class Types implements Iterable<UserType> List<AbstractType<?>> preparedFieldTypes = fieldTypes.stream() - .map(t -> t.prepare(keyspace, types).getType()) + .map(t -> t.prepareInternal(keyspace, types).getType()) .collect(toList()); return new UserType(keyspace, bytes(name), preparedFieldNames, preparedFieldTypes);