You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2018/11/20 15:27:08 UTC

[04/10] cassandra git commit: Cannot perform slice reads in reverse direction against tables with clustering columns in mixed order

Cannot perform slice reads in reverse direction against tables with clustering columns in mixed order

patch by Aleksey Yeschenko; reviewed by Alex Petrov for CASSANDRA-14899


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/cf6f7920
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/cf6f7920
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/cf6f7920

Branch: refs/heads/trunk
Commit: cf6f7920f7742bb9a17a23ad37499d9213807d81
Parents: dcd92a9
Author: Aleksey Yeshchenko <al...@apple.com>
Authored: Thu Nov 15 14:54:05 2018 +0000
Committer: Aleksey Yeshchenko <al...@apple.com>
Committed: Tue Nov 20 15:19:28 2018 +0000

----------------------------------------------------------------------
 CHANGES.txt                                     |  5 ++++
 .../restrictions/PrimaryKeyRestrictionSet.java  | 24 +++++++++++--------
 .../SelectMultiColumnRelationTest.java          | 25 ++++++++++++++++++++
 3 files changed, 44 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/cf6f7920/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 71c57ea..bca036d 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,7 +1,10 @@
 2.2.14
+ * 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)
  * Returns null instead of NaN or Infinity in JSON strings (CASSANDRA-14377)
 
+
 2.2.13
  * Fix bug that prevented compaction of SSTables after full repairs (CASSANDRA-14423)
  * Incorrect counting of pending messages in OutboundTcpConnection (CASSANDRA-11551)
@@ -15,6 +18,7 @@ Merged from 2.1:
  * Check checksum before decompressing data (CASSANDRA-14284)
  * CVE-2017-5929 Security vulnerability in Logback warning in NEWS.txt (CASSANDRA-14183)
 
+
 2.2.12
  * Fix the inspectJvmOptions startup check (CASSANDRA-14112)
  * Fix race that prevents submitting compaction for a table when executor is full (CASSANDRA-13801)
@@ -25,6 +29,7 @@ Merged from 2.1:
  * More PEP8 compliance for cqlsh (CASSANDRA-14021)
  * RPM package spec: fix permissions for installed jars and config files (CASSANDRA-14181)
 
+
 2.2.11
  * Safely handle empty buffers when outputting to JSON (CASSANDRA-13868)
  * Copy session properties on cqlsh.py do_login (CASSANDRA-13847)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/cf6f7920/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java
index 2549bdf..5136fee 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/PrimaryKeyRestrictionSet.java
@@ -20,8 +20,6 @@ package org.apache.cassandra.cql3.restrictions;
 import java.nio.ByteBuffer;
 import java.util.*;
 
-import com.google.common.collect.Lists;
-
 import org.apache.cassandra.config.CFMetaData;
 import org.apache.cassandra.config.ColumnDefinition;
 import org.apache.cassandra.cql3.QueryOptions;
@@ -195,14 +193,12 @@ final class PrimaryKeyRestrictionSet extends AbstractPrimaryKeyRestrictions impl
                 // It is clearly a hack but it does not make a lot of sense to refactor 2.2 for that as the problem is
                 // already solved in 3.0.
                 List<Composite> composites = filterAndSort(setEocs(r, bound, builder.build()));
-                return Lists.transform(composites, new com.google.common.base.Function<Composite, Composite>()
-                {
-                    @Override
-                    public Composite apply(Composite composite)
-                    {
-                        return composite.isEmpty() ? Composites.EMPTY: composite;
-                    }
-                });
+
+                for (Composite c : composites)
+                    if (c.isEmpty())
+                        return normalizeEmptyComposites(composites);
+
+                return composites;
             }
 
             r.appendBoundTo(cfm, builder, bound, options);
@@ -239,6 +235,14 @@ final class PrimaryKeyRestrictionSet extends AbstractPrimaryKeyRestrictions impl
         return new ArrayList<>(set);
     }
 
+    private List<Composite> normalizeEmptyComposites(List<Composite> composites)
+    {
+        List<Composite> transformed = new ArrayList<>(composites.size());
+        for (Composite c : composites)
+            transformed.add(c.isEmpty() ? Composites.EMPTY : c);
+        return transformed;
+    }
+
     /**
      * Sets EOCs for the composites returned by the specified slice restriction for the given bound.
      *

http://git-wip-us.apache.org/repos/asf/cassandra/blob/cf6f7920/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java
index 0975662..4e5a1e6 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java
@@ -1886,6 +1886,31 @@ public class SelectMultiColumnRelationTest extends CQLTester
         }
     }
 
+    @Test
+    public void testMixedOrderColumnsInReverse() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b, c)) WITH CLUSTERING ORDER BY (b ASC, c DESC);");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 3)");
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 2)");
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 1)");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 3)");
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 2)");
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 1)");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 3, 3)");
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 3, 2)");
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 3, 1)");
+
+        assertRows(execute("SELECT b, c FROM %s WHERE a = 0 AND (b, c) >= (2, 2) ORDER BY b DESC, c ASC;"),
+                   row(3, 1),
+                   row(3, 2),
+                   row(3, 3),
+                   row(2, 2),
+                   row(2, 3));
+    }
+
     /**
      * Check select on tuple relations, see CASSANDRA-8613
      * migrated from cql_tests.py:TestCQL.simple_tuple_query_test()


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org