Repository: cassandra Updated Branches: refs/heads/trunk 149a152fc -> aef76ddac
Fix token() + multi-column relation on clustering cols Patch by Tyler Hobbs; reviewed by Benjamin Lerer for CASSANDRA-8797 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/ee160a97 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/ee160a97 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/ee160a97 Branch: refs/heads/trunk Commit: ee160a971a52134a7d2715cb1123472f539c0ace Parents: 6214e35 Author: Tyler Hobbs <[email protected]> Authored: Thu Feb 19 13:16:56 2015 -0600 Committer: Tyler Hobbs <[email protected]> Committed: Thu Feb 19 13:16:56 2015 -0600 ---------------------------------------------------------------------- CHANGES.txt | 2 ++ src/java/org/apache/cassandra/cql3/Relation.java | 5 +++++ .../org/apache/cassandra/cql3/SingleColumnRelation.java | 5 +++++ .../cassandra/cql3/statements/SelectStatement.java | 6 +++++- .../cassandra/cql3/SelectWithTokenFunctionTest.java | 11 +++++++++++ 5 files changed, 28 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/ee160a97/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 09d6d2f..f2b4469 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 2.0.13: + * Fix combining token() function with multi-column relations on + clustering columns (CASSANDRA-8797) * Make CFS.markReferenced() resistant to bad refcounting (CASSANDRA-8829) * Fix StreamTransferTask abort/complete bad refcounting (CASSANDRA-8815) * Fix AssertionError when querying a DESC clustering ordered http://git-wip-us.apache.org/repos/asf/cassandra/blob/ee160a97/src/java/org/apache/cassandra/cql3/Relation.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/Relation.java b/src/java/org/apache/cassandra/cql3/Relation.java index 0f1366d..e7c5f2d 100644 --- a/src/java/org/apache/cassandra/cql3/Relation.java +++ b/src/java/org/apache/cassandra/cql3/Relation.java @@ -54,4 +54,9 @@ public abstract class Relation { } public abstract boolean isMultiColumn(); + + public boolean isOnToken() + { + return false; + } } http://git-wip-us.apache.org/repos/asf/cassandra/blob/ee160a97/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java index d63493e..388d938 100644 --- a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java +++ b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java @@ -84,6 +84,11 @@ public class SingleColumnRelation extends Relation return false; } + public boolean isOnToken() + { + return onToken; + } + public SingleColumnRelation withNonStrictOperator() { switch (relationType) http://git-wip-us.apache.org/repos/asf/cassandra/blob/ee160a97/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 2fa57b9..59ed6e1 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -1906,8 +1906,12 @@ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache Iterator<Name> iter = Iterators.cycle(cfDef.partitionKeys()); for (Relation relation : whereClause) { + if (!relation.isOnToken()) + continue; + + assert !relation.isMultiColumn() : "Unexpectedly got multi-column token relation"; SingleColumnRelation singleColumnRelation = (SingleColumnRelation) relation; - if (singleColumnRelation.onToken && !cfDef.get(singleColumnRelation.getEntity().prepare(cfDef.cfm)).equals(iter.next())) + if (!cfDef.get(singleColumnRelation.getEntity().prepare(cfDef.cfm)).equals(iter.next())) throw new InvalidRequestException(String.format("The token function arguments must be in the partition key order: %s", Joiner.on(',').join(cfDef.partitionKeys()))); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/ee160a97/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java b/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java index 9199862..c222f35 100644 --- a/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java +++ b/test/unit/org/apache/cassandra/cql3/SelectWithTokenFunctionTest.java @@ -47,6 +47,7 @@ public class SelectWithTokenFunctionTest executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.single_partition (a int PRIMARY KEY, b text)"); executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.compound_partition (a int, b text, PRIMARY KEY ((a, b)))"); executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.single_clustering (a int, b text, PRIMARY KEY (a, b))"); + executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.compound_with_clustering (a int, b int, c int, d int, PRIMARY KEY ((a, b), c, d))"); clientState = ClientState.forInternalCalls(); } @@ -168,4 +169,14 @@ public class SelectWithTokenFunctionTest { execute("SELECT * FROM %s.compound_partition WHERE token(a) > token(0) and token(b) > token('c')"); } + + @Test + public void testTokenFunctionWithCompoundPartitionAndClusteringCols() throws Throwable + { + // just test that the queries don't error + execute("SELECT * FROM %s.compound_with_clustering WHERE token(a, b) > token(0, 0) AND c > 10 ALLOW FILTERING;"); + execute("SELECT * FROM %s.compound_with_clustering WHERE c > 10 AND token(a, b) > token(0, 0) ALLOW FILTERING;"); + execute("SELECT * FROM %s.compound_with_clustering WHERE token(a, b) > token(0, 0) AND (c, d) > (0, 0) ALLOW FILTERING;"); + execute("SELECT * FROM %s.compound_with_clustering WHERE (c, d) > (0, 0) AND token(a, b) > token(0, 0) ALLOW FILTERING;"); + } }
