Merge branch 'cassandra-2.0' into cassandra-2.1.0 Conflicts: CHANGES.txt src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/ce46d661 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/ce46d661 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/ce46d661 Branch: refs/heads/trunk Commit: ce46d6619b05465a89ffaaf8fb3e4c2c1f1e547b Parents: eb4032e 6893130 Author: Sylvain Lebresne <sylv...@datastax.com> Authored: Wed Jul 9 18:22:04 2014 +0200 Committer: Sylvain Lebresne <sylv...@datastax.com> Committed: Wed Jul 9 18:22:04 2014 +0200 ---------------------------------------------------------------------- CHANGES.txt | 2 + .../cql3/statements/SelectStatement.java | 17 +- .../cassandra/cql3/StaticColumnsQueryTest.java | 263 +++++++++++++++++++ 3 files changed, 277 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce46d661/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index 7fff2d4,3553e4a..e459638 --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -1,25 -1,4 +1,27 @@@ -2.0.10 +2.1.0-final + * (Windows) fix startup when WMI memory query fails (CASSANDRA-7505) + * Anti-compaction proceeds if any part of the repair failed (CASANDRA-7521) ++Merged from 2.0: ++ * Fix error when doing reversed queries with static columns (CASSANDRA-7490) + + +2.1.0-rc3 + * Consider expiry when reconciling otherwise equal cells (CASSANDRA-7403) + * Introduce CQL support for stress tool (CASSANDRA-6146) + * Fix ClassCastException processing expired messages (CASSANDRA-7496) + * Fix prepared marker for collections inside UDT (CASSANDRA-7472) + * Remove left-over populate_io_cache_on_flush and replicate_on_write + uses (CASSANDRA-7493) + * (Windows) handle spaces in path names (CASSANDRA-7451) + * Ensure writes have completed after dropping a table, before recycling + commit log segments (CASSANDRA-7437) + * Remove left-over rows_per_partition_to_cache (CASSANDRA-7493) + * Fix error when CONTAINS is used with a bind marker (CASSANDRA-7502) + * Properly reject unknown UDT field (CASSANDRA-7484) +Merged from 2.0: + * Fix CC#collectTimeOrderedData() tombstone optimisations (CASSANDRA-7394) + * Support DISTINCT for static columns and fix behaviour when DISTINC is + not use (CASSANDRA-7305). * Workaround JVM NPE on JMX bind failure (CASSANDRA-7254) * Fix race in FileCacheService RemovalListener (CASSANDRA-7278) * Fix inconsistent use of consistencyForCommit that allowed LOCAL_QUORUM http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce46d661/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index c9572c2,523302f..e4ef0a8 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@@ -460,13 -469,20 +460,20 @@@ public class SelectStatement implement if (startBounds.size() == 1) { ColumnSlice slice = new ColumnSlice(startBounds.get(0), endBounds.get(0)); - if (slice.isAlwaysEmpty(cfDef.cfm.comparator, isReversed)) + if (slice.isAlwaysEmpty(cfm.comparator, isReversed)) return staticSlice == null ? null : sliceFilter(staticSlice, limit, toGroup); - return staticSlice == null - ? sliceFilter(slice, limit, toGroup) - : (slice.includes(cfm.comparator, staticSlice.finish) ? sliceFilter(new ColumnSlice(staticSlice.start, slice.finish), limit, toGroup) - : sliceFilter(new ColumnSlice[]{ staticSlice, slice }, limit, toGroup)); + if (staticSlice == null) + return sliceFilter(slice, limit, toGroup); + + if (isReversed) - return slice.includes(cfDef.cfm.comparator.reverseComparator, staticSlice.start) ++ return slice.includes(cfm.comparator.reverseComparator(), staticSlice.start) + ? sliceFilter(new ColumnSlice(slice.start, staticSlice.finish), limit, toGroup) + : sliceFilter(new ColumnSlice[]{ slice, staticSlice }, limit, toGroup); + else - return slice.includes(cfDef.cfm.comparator, staticSlice.finish) ++ return slice.includes(cfm.comparator, staticSlice.finish) + ? sliceFilter(new ColumnSlice(staticSlice.start, slice.finish), limit, toGroup) + : sliceFilter(new ColumnSlice[]{ staticSlice, slice }, limit, toGroup); } List<ColumnSlice> l = new ArrayList<ColumnSlice>(startBounds.size()); @@@ -487,10 -504,10 +494,10 @@@ ColumnSlice[] slices; if (isReversed) { - if (l.get(l.size() - 1).includes(cfm.comparator, staticSlice.start)) - if (l.get(l.size() - 1).includes(cfDef.cfm.comparator.reverseComparator, staticSlice.start)) ++ if (l.get(l.size() - 1).includes(cfm.comparator.reverseComparator(), staticSlice.start)) { slices = l.toArray(new ColumnSlice[l.size()]); - slices[slices.length-1] = new ColumnSlice(slices[slices.length-1].start, ByteBufferUtil.EMPTY_BYTE_BUFFER); + slices[slices.length-1] = new ColumnSlice(slices[slices.length-1].start, Composites.EMPTY); } else { http://git-wip-us.apache.org/repos/asf/cassandra/blob/ce46d661/test/unit/org/apache/cassandra/cql3/StaticColumnsQueryTest.java ---------------------------------------------------------------------- diff --cc test/unit/org/apache/cassandra/cql3/StaticColumnsQueryTest.java index 0000000,0000000..b386026 new file mode 100644 --- /dev/null +++ b/test/unit/org/apache/cassandra/cql3/StaticColumnsQueryTest.java @@@ -1,0 -1,0 +1,263 @@@ ++package org.apache.cassandra.cql3; ++ ++import org.junit.Test; ++ ++/** ++ * Test column ranges and ordering with static column in table ++ */ ++public class StaticColumnsQueryTest extends CQLTester ++{ ++ @Test ++ public void testSingleClustering() throws Throwable ++ { ++ createTable("CREATE TABLE %s (p text, c text, v text, s text static, PRIMARY KEY (p, c))"); ++ ++ execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); ++ execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); ++ execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=?", "p1"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=?", "p2"), ++ row("p2", null, "sv2", null) ++ ); ++ ++ // Ascending order ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? ORDER BY c ASC", "p1"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? ORDER BY c ASC", "p2"), ++ row("p2", null, "sv2", null) ++ ); ++ ++ // Descending order ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? ORDER BY c DESC", "p1"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? ORDER BY c DESC", "p2"), ++ row("p2", null, "sv2", null) ++ ); ++ ++ // No order with one relation ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=?", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=?", "p1", "k2"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c>=?", "p1", "k3")); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c =?", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c<=?", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c<=?", "p1", "k0")); ++ ++ // Ascending with one relation ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c ASC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c ASC", "p1", "k2"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c ASC", "p1", "k3")); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c =? ORDER BY c ASC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c<=? ORDER BY c ASC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c<=? ORDER BY c ASC", "p1", "k0")); ++ ++ // Descending with one relation ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c DESC", "p1", "k1"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c DESC", "p1", "k2"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c DESC", "p1", "k3")); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c =? ORDER BY c DESC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c<=? ORDER BY c DESC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c<=? ORDER BY c DESC", "p1", "k0")); ++ ++ // IN ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c IN (?, ?)", "p1", "k1", "k2"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c IN (?, ?) ORDER BY c ASC", "p1", "k1", "k2"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c IN (?, ?) ORDER BY c DESC", "p1", "k1", "k2"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ } ++ ++ @Test ++ public void testSingleClusteringReversed() throws Throwable ++ { ++ createTable("CREATE TABLE %s (p text, c text, v text, s text static, PRIMARY KEY (p, c)) WITH CLUSTERING ORDER BY (c DESC)"); ++ ++ execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1"); ++ execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2"); ++ execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2"); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=?", "p1"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=?", "p2"), ++ row("p2", null, "sv2", null) ++ ); ++ ++ // Ascending order ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? ORDER BY c ASC", "p1"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? ORDER BY c ASC", "p2"), ++ row("p2", null, "sv2", null) ++ ); ++ ++ // Descending order ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? ORDER BY c DESC", "p1"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? ORDER BY c DESC", "p2"), ++ row("p2", null, "sv2", null) ++ ); ++ ++ // No order with one relation ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=?", "p1", "k1"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=?", "p1", "k2"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c>=?", "p1", "k3")); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c=?", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c<=?", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c<=?", "p1", "k0")); ++ ++ // Ascending with one relation ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c ASC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c ASC", "p1", "k2"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c ASC", "p1", "k3")); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c=? ORDER BY c ASC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c<=? ORDER BY c ASC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c<=? ORDER BY c ASC", "p1", "k0")); ++ ++ // Descending with one relation ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c DESC", "p1", "k1"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c DESC", "p1", "k2"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c>=? ORDER BY c DESC", "p1", "k3")); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c=? ORDER BY c DESC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c<=? ORDER BY c DESC", "p1", "k1"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertEmpty(execute("SELECT * FROM %s WHERE p=? AND c<=? ORDER BY c DESC", "p1", "k0")); ++ ++ // IN ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c IN (?, ?)", "p1", "k1", "k2"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c IN (?, ?) ORDER BY c ASC", "p1", "k1", "k2"), ++ row("p1", "k1", "sv1", "v1"), ++ row("p1", "k2", "sv1", "v2") ++ ); ++ ++ assertRows(execute("SELECT * FROM %s WHERE p=? AND c IN (?, ?) ORDER BY c DESC", "p1", "k1", "k2"), ++ row("p1", "k2", "sv1", "v2"), ++ row("p1", "k1", "sv1", "v1") ++ ); ++ } ++}