Don't skip entire sstables when reading backwards with mixed clustering column order
patch by Aleksey Yeschenko; reviewed by Alex Petrov for CASSANDRA-14910 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/afa45638 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/afa45638 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/afa45638 Branch: refs/heads/trunk Commit: afa4563864889c78569e29466047b411cd866b38 Parents: cf6f792 Author: Aleksey Yeshchenko <alek...@apple.com> Authored: Thu Nov 22 14:59:22 2018 +0000 Committer: Aleksey Yeshchenko <alek...@apple.com> Committed: Tue Nov 27 21:03:56 2018 +0000 ---------------------------------------------------------------------- CHANGES.txt | 2 + .../apache/cassandra/db/filter/ColumnSlice.java | 5 +- .../operations/SelectOrderByTest.java | 78 ++++++++++++++++++++ 3 files changed, 84 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/afa45638/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index bca036d..b989f3c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 2.2.14 + * Don't skip entire sstables when reading backwards with mixed clustering column order + (CASSANDRA-14910) * Cannot perform slice reads in reverse direction against tables with clustering columns in mixed order (CASSANDRA-14899) * Fix incorrect cqlsh results when selecting same columns multiple times (CASSANDRA-13262) http://git-wip-us.apache.org/repos/asf/cassandra/blob/afa45638/src/java/org/apache/cassandra/db/filter/ColumnSlice.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/filter/ColumnSlice.java b/src/java/org/apache/cassandra/db/filter/ColumnSlice.java index 1cc348c..316226d 100644 --- a/src/java/org/apache/cassandra/db/filter/ColumnSlice.java +++ b/src/java/org/apache/cassandra/db/filter/ColumnSlice.java @@ -68,7 +68,10 @@ public class ColumnSlice Composite sStart = reversed ? finish : start; Composite sEnd = reversed ? start : finish; - if (compare(sStart, maxCellNames, comparator, true) > 0 || compare(sEnd, minCellNames, comparator, false) < 0) + // don't compare static slice bounds with min/max cell names to determine intersection - that can yield unexpected + // results, in particular with ReverseType comparators; see CASSANDRA-14910 for more context. + if ((!sStart.isStatic() && compare(sStart, maxCellNames, comparator, true) > 0) + || (!sEnd.isStatic() && compare(sEnd, minCellNames, comparator, false) < 0)) return false; // We could safely return true here, but there's a minor optimization: if the first component is restricted http://git-wip-us.apache.org/repos/asf/cassandra/blob/afa45638/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderByTest.java ---------------------------------------------------------------------- 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 32d800a..e21074b 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderByTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderByTest.java @@ -732,6 +732,84 @@ public class SelectOrderByTest extends CQLTester } } + @Test + public void testSelectWithReversedTypeInReverseOrderWithStaticColumnsWithoutStaticRow() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int, d int static, PRIMARY KEY (a, b)) WITH CLUSTERING ORDER BY (b DESC);"); + + execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 1);"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 2);"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 3);"); + + // read in comparator order + assertRows(execute("SELECT b, c FROM %s WHERE a = 1 ORDER BY b DESC;"), + row(3, 3), + row(2, 2), + row(1, 1)); + + // read in reverse comparator order + assertRows(execute("SELECT b, c FROM %s WHERE a = 1 ORDER BY b ASC;"), + row(1, 1), + row(2, 2), + row(3, 3)); + + /* + * Flush the sstable. We *should* see the same results when reading in both directions, but prior to CASSANDRA-14910 + * fix this would now have returned an empty result set when reading in reverse comparator order. + */ + flush(); + + // read in comparator order + assertRows(execute("SELECT b, c FROM %s WHERE a = 1 ORDER BY b DESC;"), + row(3, 3), + row(2, 2), + row(1, 1)); + + // read in reverse comparator order + assertRows(execute("SELECT b, c FROM %s WHERE a = 1 ORDER BY b ASC;"), + row(1, 1), + row(2, 2), + row(3, 3)); + } + + @Test + public void testSelectWithReversedTypeInReverseOrderWithStaticColumnsWithStaticRow() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int, d int static, PRIMARY KEY (a, b)) WITH CLUSTERING ORDER BY (b DESC)"); + + execute("INSERT INTO %s (a, d) VALUES (1, 0);"); + + execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 1);"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 2);"); + execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 3);"); + + // read in comparator order + assertRows(execute("SELECT b, c, d FROM %s WHERE a = 1 ORDER BY b DESC;"), + row(3, 3, 0), + row(2, 2, 0), + row(1, 1, 0)); + + // read in reverse comparator order + assertRows(execute("SELECT b, c, d FROM %s WHERE a = 1 ORDER BY b ASC;"), + row(1, 1, 0), + row(2, 2, 0), + row(3, 3, 0)); + + flush(); + + // read in comparator order + assertRows(execute("SELECT b, c, d FROM %s WHERE a = 1 ORDER BY b DESC;"), + row(3, 3, 0), + row(2, 2, 0), + row(1, 1, 0)); + + // read in reverse comparator order + assertRows(execute("SELECT b, c, d FROM %s WHERE a = 1 ORDER BY b ASC;"), + row(1, 1, 0), + row(2, 2, 0), + row(3, 3, 0)); + } + private boolean isFirstIntSorted(Object[][] rows) { for (int i = 1; i < rows.length; i++) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org