Updated Branches: refs/heads/trunk da3ab363b -> 7a1a7b9b7
Force provided columns in clustering key order in 'CLUSTERING ORDER BY' patch by slebresne; reviewed by jbellis for CASSANDRA-4881 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/7a1a7b9b Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/7a1a7b9b Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/7a1a7b9b Branch: refs/heads/trunk Commit: 7a1a7b9b790f786a7b091406cac322fc861085dc Parents: da3ab36 Author: Sylvain Lebresne <[email protected]> Authored: Wed Oct 31 15:32:10 2012 +0100 Committer: Sylvain Lebresne <[email protected]> Committed: Wed Oct 31 15:32:10 2012 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../statements/CreateColumnFamilyStatement.java | 25 ++++++++++++++- 2 files changed, 25 insertions(+), 1 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a1a7b9b/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 12cc92a..48cb945 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -43,6 +43,7 @@ * Fix binary protocol NEW_NODE event (CASSANDRA-4679) * Fix potential infinite loop in tombstone compaction (CASSANDRA-4781) * Remove system tables accounting from schema (CASSANDRA-4850) + * Force provided columns in clustering key order in 'CLUSTERING ORDER BY' (CASSANDRA-4881) Merged from 1.1: * add get[Row|Key]CacheEntries to CacheServiceMBean (CASSANDRA-4859) * fix get_paged_slice to wrap to next row correctly (CASSANDRA-4816) http://git-wip-us.apache.org/repos/asf/cassandra/blob/7a1a7b9b/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java index 1775398..b8ea732 100644 --- a/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/CreateColumnFamilyStatement.java @@ -20,6 +20,7 @@ package org.apache.cassandra.cql3.statements; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -144,7 +145,7 @@ public class CreateColumnFamilyStatement extends SchemaAlteringStatement private final List<List<ColumnIdentifier>> keyAliases = new ArrayList<List<ColumnIdentifier>>(); private final List<ColumnIdentifier> columnAliases = new ArrayList<ColumnIdentifier>(); - private final Map<ColumnIdentifier, Boolean> definedOrdering = new HashMap<ColumnIdentifier, Boolean>(); + private final Map<ColumnIdentifier, Boolean> definedOrdering = new LinkedHashMap<ColumnIdentifier, Boolean>(); // Insertion ordering is important private boolean useCompactStorage; private final Multiset<ColumnIdentifier> definedNames = HashMultiset.create(1); @@ -305,6 +306,28 @@ public class CreateColumnFamilyStatement extends SchemaAlteringStatement : CFDefinition.definitionType; } + + // If we give a clustering order, we must explicitely do so for all aliases and in the order of the PK + if (!definedOrdering.isEmpty()) + { + if (definedOrdering.size() > columnAliases.size()) + throw new InvalidRequestException("Too much columns provided for CLUSTERING ORDER"); + + int i = 0; + for (ColumnIdentifier id : definedOrdering.keySet()) + { + ColumnIdentifier c = columnAliases.get(i); + if (!id.equals(c)) + { + if (definedOrdering.containsKey(c)) + throw new InvalidRequestException(String.format("The order of columns in the CLUSTERING ORDER directive must be the one of the clustering key (%s must appear before %s)", c, id)); + else + throw new InvalidRequestException(String.format("Missing CLUSTERING ORDER for column %s", c)); + } + ++i; + } + } + return new ParsedStatement.Prepared(stmt); }
