Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.0 6214e3540 -> ee160a971


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/cassandra-2.0
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;");
+    }
 }

Reply via email to