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

Reply via email to