Fix static column indexes patch by Andrés de la Peña; reviewed by Benjamin Lerer for CASSANDRA-13277
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/41befde2 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/41befde2 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/41befde2 Branch: refs/heads/trunk Commit: 41befde2273724e2070a28cd6c47a407e3e4426a Parents: 52fc62f Author: Andrés de la Peña <[email protected]> Authored: Tue Mar 28 13:15:17 2017 +0200 Committer: Benjamin Lerer <[email protected]> Committed: Tue Mar 28 13:17:46 2017 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../internal/composites/CompositesSearcher.java | 6 +++++ .../index/internal/CassandraIndexTest.java | 26 ++++++++++++++++++++ 3 files changed, 33 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/41befde2/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 038befb..2122227 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.11.0 + * Fix static column indexes (CASSANDRA-13277) * DataOutputBuffer.asNewBuffer broken (CASSANDRA-13298) * unittest CipherFactoryTest failed on MacOS (CASSANDRA-13370) * Forbid SELECT restrictions and CREATE INDEX over non-frozen UDT columns (CASSANDRA-13247) http://git-wip-us.apache.org/repos/asf/cassandra/blob/41befde2/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java index 324d939..e777620 100644 --- a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java +++ b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java @@ -114,6 +114,12 @@ public class CompositesSearcher extends CassandraIndexSearcher List<IndexEntry> entries = new ArrayList<>(); if (isStaticColumn()) { + // The index hit may not match the commad key constraint + if (!isMatchingEntry(partitionKey, nextEntry, command)) { + nextEntry = indexHits.hasNext() ? index.decodeEntry(indexKey, indexHits.next()) : null; + continue; + } + // If the index is on a static column, we just need to do a full read on the partition. // Note that we want to re-use the command.columnFilter() in case of future change. dataCmd = SinglePartitionReadCommand.create(index.baseCfs.metadata, http://git-wip-us.apache.org/repos/asf/cassandra/blob/41befde2/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java b/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java index 5c7d840..59d6860 100644 --- a/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java +++ b/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java @@ -358,6 +358,32 @@ public class CassandraIndexTest extends CQLTester } @Test + public void indexOnStaticColumn() throws Throwable + { + Object[] row1 = row("k0", "c0", "s0"); + Object[] row2 = row("k0", "c1", "s0"); + Object[] row3 = row("k1", "c0", "s1"); + Object[] row4 = row("k1", "c1", "s1"); + + createTable("CREATE TABLE %s (k text, c text, s text static, PRIMARY KEY (k, c));"); + createIndex("CREATE INDEX sc_index on %s(s)"); + + execute("INSERT INTO %s (k, c, s) VALUES (?, ?, ?)", row1); + execute("INSERT INTO %s (k, c, s) VALUES (?, ?, ?)", row2); + execute("INSERT INTO %s (k, c, s) VALUES (?, ?, ?)", row3); + execute("INSERT INTO %s (k, c, s) VALUES (?, ?, ?)", row4); + + assertRows(execute("SELECT * FROM %s WHERE s = ?", "s0"), row1, row2); + assertRows(execute("SELECT * FROM %s WHERE s = ?", "s1"), row3, row4); + + assertRows(execute("SELECT * FROM %s WHERE s = ? AND token(k) >= token(?)", "s0", "k0"), row1, row2); + assertRows(execute("SELECT * FROM %s WHERE s = ? AND token(k) >= token(?)", "s1", "k1"), row3, row4); + + assertEmpty(execute("SELECT * FROM %s WHERE s = ? AND token(k) < token(?)", "s0", "k0")); + assertEmpty(execute("SELECT * FROM %s WHERE s = ? AND token(k) < token(?)", "s1", "k1")); + } + + @Test public void createIndexesOnMultipleMapDimensions() throws Throwable { Object[] row1 = row(0, 0, ImmutableMap.of("a", 10, "b", 20, "c", 30));
