Repository: cassandra Updated Branches: refs/heads/trunk 1b5fa8ce3 -> fa7103ffd
Fix ALTER TABLE ADD validation for frozen collections patch by Aleksey Yeschenko; reviewed by Tyler Hobbs for CASSANDRA-9816 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/fa7103ff Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/fa7103ff Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/fa7103ff Branch: refs/heads/trunk Commit: fa7103ffddd85ab38092c2aa01971d88f5c5ef3f Parents: 1b5fa8c Author: Aleksey Yeschenko <[email protected]> Authored: Sat Jul 18 01:04:02 2015 +0300 Committer: Aleksey Yeschenko <[email protected]> Committed: Sat Jul 18 01:04:02 2015 +0300 ---------------------------------------------------------------------- .../cql3/statements/AlterTableStatement.java | 20 +++++++++++++------- .../validation/entities/CollectionsTest.java | 9 +++++++++ 2 files changed, 22 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/fa7103ff/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java index a247cdb..ebd3d5b 100644 --- a/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/AlterTableStatement.java @@ -125,14 +125,20 @@ public class AlterTableStatement extends SchemaAlteringStatement if (cfm.isSuper()) throw new InvalidRequestException("Cannot use non-frozen collections with super column families"); - // If there used to be a collection column with the same name (that has been dropped), we could still have - // some data using the old type, and so we can't allow adding a collection with the same name unless - // the types are compatible (see #6276). + // If there used to be a non-frozen collection column with the same name (that has been dropped), + // we could still have some data using the old type, and so we can't allow adding a collection + // with the same name unless the types are compatible (see #6276). CFMetaData.DroppedColumn dropped = cfm.getDroppedColumns().get(columnName.bytes); - if (dropped != null && dropped.type instanceof CollectionType && !type.isCompatibleWith(dropped.type)) - throw new InvalidRequestException(String.format("Cannot add a collection with the name %s " + - "because a collection with the same name and a different type%s has already been used in the past", - columnName, " (" + dropped.type.asCQL3Type() + ')')); + if (dropped != null && dropped.type instanceof CollectionType + && dropped.type.isMultiCell() && !type.isCompatibleWith(dropped.type)) + { + String message = + String.format("Cannot add a collection with the name %s because a collection with the same name" + + " and a different type (%s) has already been used in the past", + columnName, + dropped.type.asCQL3Type()); + throw new InvalidRequestException(message); + } } Integer componentIndex = cfm.isCompound() ? cfm.comparator.size() : null; http://git-wip-us.apache.org/repos/asf/cassandra/blob/fa7103ff/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java index 72f5ad5..fdd3dfa 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java @@ -585,4 +585,13 @@ public class CollectionsTest extends CQLTester assertInvalid("alter table %s add v set<int>"); } + @Test + public void testDropAndReaddDroppedCollection() throws Throwable + { + createTable("create table %s (k int primary key, v frozen<set<text>>, x int)"); + execute("insert into %s (k, v) VALUES (0, {'fffffffff'})"); + flush(); + execute("alter table %s drop v"); + execute("alter table %s add v set<int>"); + } }
