From ee186b6b05569537eb979027176ccee57354c4da Mon Sep 17 00:00:00 2001 From: blerer Date: Mon, 17 Aug 2015 10:58:37 +0200 Subject: [PATCH] Fix ordering with IN restriction on partition key patch by Benjamin Lerer; reviewed by Stefania Alborghetti for CASSANDRA-9970 --- .../PrimaryKeyRestrictionSet.java | 2 +- .../operations/SelectOrderByTest.java | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java index b49d774222..3a20f6a97a 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java @@ -98,7 +98,7 @@ final class PrimaryKeyRestrictionSet extends AbstractPrimaryKeyRestrictions this.slice = true; else if (restriction.isContains() || primaryKeyRestrictions.isContains()) this.contains = true; - else if (restriction.isIN()) + else if (restriction.isIN() || primaryKeyRestrictions.isIN()) this.in = true; else this.eq = true; diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderByTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderByTest.java index e78809530f..699ade8180 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderByTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderByTest.java @@ -22,6 +22,7 @@ import org.junit.Test; import org.apache.cassandra.cql3.CQLTester; import static org.junit.Assert.assertTrue; +import static java.util.Arrays.asList; public class SelectOrderByTest extends CQLTester { @@ -488,6 +489,48 @@ public class SelectOrderByTest extends CQLTester assertTrue(isFirstIntSorted(results)); } + @Test + public void testInOrderByWithTwoPartitionKeyColumns() throws Throwable + { + for (String option : asList("", "WITH CLUSTERING ORDER BY (col_3 DESC)")) + { + createTable("CREATE TABLE %s (col_1 int, col_2 int, col_3 int, PRIMARY KEY ((col_1, col_2), col_3)) " + option); + execute("INSERT INTO %s (col_1, col_2, col_3) VALUES(?, ?, ?)", 1, 1, 1); + execute("INSERT INTO %s (col_1, col_2, col_3) VALUES(?, ?, ?)", 1, 1, 2); + execute("INSERT INTO %s (col_1, col_2, col_3) VALUES(?, ?, ?)", 1, 1, 13); + execute("INSERT INTO %s (col_1, col_2, col_3) VALUES(?, ?, ?)", 1, 2, 10); + execute("INSERT INTO %s (col_1, col_2, col_3) VALUES(?, ?, ?)", 1, 2, 11); + + assertRows(execute("select * from %s where col_1=? and col_2 IN (?, ?) order by col_3;", 1, 1, 2), + row(1, 1, 1), + row(1, 1, 2), + row(1, 2, 10), + row(1, 2, 11), + row(1, 1, 13)); + + assertRows(execute("select * from %s where col_1=? and col_2 IN (?, ?) order by col_3 desc;", 1, 1, 2), + row(1, 1, 13), + row(1, 2, 11), + row(1, 2, 10), + row(1, 1, 2), + row(1, 1, 1)); + + assertRows(execute("select * from %s where col_2 IN (?, ?) and col_1=? order by col_3;", 1, 2, 1), + row(1, 1, 1), + row(1, 1, 2), + row(1, 2, 10), + row(1, 2, 11), + row(1, 1, 13)); + + assertRows(execute("select * from %s where col_2 IN (?, ?) and col_1=? order by col_3 desc;", 1, 2, 1), + row(1, 1, 13), + row(1, 2, 11), + row(1, 2, 10), + row(1, 1, 2), + row(1, 1, 1)); + } + } + private boolean isFirstIntSorted(Object[][] rows) { for (int i = 1; i < rows.length; i++)