Merge branch 'cassandra-2.0' into cassandra-2.1.0 Conflicts: CHANGES.txt src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/889f3ac5 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/889f3ac5 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/889f3ac5 Branch: refs/heads/trunk Commit: 889f3ac5548b89c17bade2f39781067db95a0c27 Parents: 63c21a3 2015072 Author: Sylvain Lebresne <sylv...@datastax.com> Authored: Mon Aug 25 16:41:08 2014 +0200 Committer: Sylvain Lebresne <sylv...@datastax.com> Committed: Mon Aug 25 16:41:08 2014 +0200 ---------------------------------------------------------------------- CHANGES.txt | 2 ++ .../org/apache/cassandra/cql3/statements/SelectStatement.java | 5 +++++ 2 files changed, 7 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/889f3ac5/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index 15e41da,e716cb5..80747dc --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -1,12 -1,9 +1,14 @@@ -2.0.11: +2.1.0 + * Correctly remove tmplink files (CASSANDRA-7803) + * (cqlsh) Fix column name formatting for functions, CAS operations, + and UDT field selections (CASSANDRA-7806) + * (cqlsh) Fix COPY FROM handling of null/empty primary key + values (CASSANDRA-7792) + * Fix ordering of static cells (CASSANDRA-7763) +Merged from 2.0: + * Always reject inequality on the partition key without token() + (CASSANDRA-7722) * Always send Paxos commit to all replicas (CASSANDRA-7479) - -2.0.10 * Don't send schema change responses and events for no-op DDL statements (CASSANDRA-7600) * (Hadoop) fix cluster initialisation for a split fetching (CASSANDRA-7774) http://git-wip-us.apache.org/repos/asf/cassandra/blob/889f3ac5/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index e4ef0a8,a360d49..20b5f57 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@@ -1675,38 -1704,23 +1675,43 @@@ public class SelectStatement implement case GTE: case LT: case LTE: + { + if (existingRestriction == null) + existingRestriction = new SingleColumnRestriction.Slice(newRel.onToken); + else if (!existingRestriction.isSlice()) + throw new InvalidRequestException(String.format("Column \"%s\" cannot be restricted by both an equality and an inequality relation", def.name)); + else if (existingRestriction.isMultiColumn()) + throw new InvalidRequestException(String.format("Column \"%s\" cannot be restricted by both a tuple notation inequality and a single column inequality (%s)", def.name, newRel)); ++ else if (existingRestriction.isOnToken() != newRel.onToken) ++ // For partition keys, we shouldn't have slice restrictions without token(). And while this is rejected later by ++ // processPartitionKeysRestrictions, we shouldn't update the existing restriction by the new one if the old one was using token() ++ // and the new one isn't since that would bypass that later test. ++ throw new InvalidRequestException("Only EQ and IN relation are supported on the partition key (unless you use the token() function)"); + + Term t = newRel.getValue().prepare(keyspace(), receiver); + t.collectMarkerSpecification(boundNames); + ((SingleColumnRestriction.Slice)existingRestriction).setBound(def.name, newRel.operator(), t); + } + break; + case CONTAINS_KEY: + if (!(receiver.type instanceof MapType)) + throw new InvalidRequestException(String.format("Cannot use CONTAINS_KEY on non-map column %s", def.name)); + // Fallthrough on purpose + case CONTAINS: { + if (!receiver.type.isCollection()) + throw new InvalidRequestException(String.format("Cannot use %s relation on non collection column %s", newRel.operator(), def.name)); + if (existingRestriction == null) - existingRestriction = new SingleColumnRestriction.Slice(newRel.onToken); - else if (!existingRestriction.isSlice()) - throw new InvalidRequestException(String.format("Column \"%s\" cannot be restricted by both an equality and an inequality relation", name)); - else if (existingRestriction.isOnToken() != newRel.onToken) - // For partition keys, we shouldn't have slice restrictions without token(). And while this is rejected later by - // processPartitionKeysRestrictions, we shouldn't update the existing restriction by the new one if the old one was using token() - // and the new one isn't since that would bypass that later test. - throw new InvalidRequestException("Only EQ and IN relation are supported on the partition key (unless you use the token() function)"); - else if (existingRestriction.isMultiColumn()) - throw new InvalidRequestException(String.format("Column \"%s\" cannot be restricted by both a tuple notation inequality and a single column inequality (%s)", name, newRel)); - Term t = newRel.getValue().prepare(receiver); + existingRestriction = new SingleColumnRestriction.Contains(); + else if (!existingRestriction.isContains()) + throw new InvalidRequestException(String.format("Collection column %s can only be restricted by CONTAINS or CONTAINS KEY", def.name)); + boolean isKey = newRel.operator() == Relation.Type.CONTAINS_KEY; + receiver = makeCollectionReceiver(receiver, isKey); + Term t = newRel.getValue().prepare(keyspace(), receiver); t.collectMarkerSpecification(boundNames); - ((SingleColumnRestriction.Slice)existingRestriction).setBound(newRel.operator(), t); + ((SingleColumnRestriction.Contains)existingRestriction).add(t, isKey); } - break; } return existingRestriction; }