Repository: cassandra Updated Branches: refs/heads/cassandra-3.0 851763566 -> c7cbde218 refs/heads/cassandra-3.3 289ad7713 -> 456581e54 refs/heads/trunk 0e9819733 -> e13ea8db6
Don't try to index clustering values of static rows Patch Stefan Podkowinski; reviewed by Sam Tunnicliffe for CASSANDRA-11021 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c7cbde21 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c7cbde21 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c7cbde21 Branch: refs/heads/cassandra-3.0 Commit: c7cbde218de62aa47d9e942957ee4444bd9c7568 Parents: 8517635 Author: Stefan Podkowinski <stefan.podkowin...@1und1.de> Authored: Mon Jan 18 18:04:00 2016 +0000 Committer: Sam Tunnicliffe <s...@beobal.com> Committed: Tue Jan 19 08:53:19 2016 +0000 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../index/internal/CassandraIndex.java | 7 ++++++ .../validation/entities/SecondaryIndexTest.java | 24 ++++++++++++++++++++ 3 files changed, 32 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/c7cbde21/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 165e5d1..9c0ab85 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.0.3 + * Don't attempt to index clustering values of static rows (CASSANDRA-11021) * Remove checksum files after replaying hints (CASSANDRA-10947) * Support passing base table metadata to custom 2i validation (CASSANDRA-10924) * Ensure stale index entries are purged during reads (CASSANDRA-11013) http://git-wip-us.apache.org/repos/asf/cassandra/blob/c7cbde21/src/java/org/apache/cassandra/index/internal/CassandraIndex.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/index/internal/CassandraIndex.java b/src/java/org/apache/cassandra/index/internal/CassandraIndex.java index 6223d8a..158b127 100644 --- a/src/java/org/apache/cassandra/index/internal/CassandraIndex.java +++ b/src/java/org/apache/cassandra/index/internal/CassandraIndex.java @@ -342,6 +342,9 @@ public abstract class CassandraIndex implements Index public void insertRow(Row row) { + if (row.isStatic() != indexedColumn.isStatic()) + return; + if (isPrimaryKeyIndex()) { indexPrimaryKey(row.clustering(), @@ -370,6 +373,10 @@ public abstract class CassandraIndex implements Index public void updateRow(Row oldRow, Row newRow) { + assert oldRow.isStatic() == newRow.isStatic(); + if (newRow.isStatic() != indexedColumn.isStatic()) + return; + if (isPrimaryKeyIndex()) indexPrimaryKey(newRow.clustering(), newRow.primaryKeyLivenessInfo(), http://git-wip-us.apache.org/repos/asf/cassandra/blob/c7cbde21/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java index 38402d9..06f1987 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java @@ -960,6 +960,30 @@ public class SecondaryIndexTest extends CQLTester assertNull(QueryProcessor.instance.getPreparedForThrift(thriftId)); } + // See CASSANDRA-11021 + @Test + public void testIndexesOnNonStaticColumnsWhereSchemaIncludesStaticColumns() throws Throwable + { + createTable("CREATE TABLE %s (a int, b int, c int static, d int, PRIMARY KEY (a, b))"); + createIndex("CREATE INDEX b_idx on %s(b)"); + createIndex("CREATE INDEX d_idx on %s(d)"); + + execute("INSERT INTO %s (a, b, c ,d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s (a, b, c, d) VALUES (1, 1, 1, 1)"); + assertRows(execute("SELECT * FROM %s WHERE b = 0"), row(0, 0, 0, 0)); + assertRows(execute("SELECT * FROM %s WHERE d = 1"), row(1, 1, 1, 1)); + + execute("UPDATE %s SET c = 2 WHERE a = 0"); + execute("UPDATE %s SET c = 3, d = 4 WHERE a = 1 AND b = 1"); + assertRows(execute("SELECT * FROM %s WHERE b = 0"), row(0, 0, 2, 0)); + assertRows(execute("SELECT * FROM %s WHERE d = 4"), row(1, 1, 3, 4)); + + execute("DELETE FROM %s WHERE a = 0"); + execute("DELETE FROM %s WHERE a = 1 AND b = 1"); + assertEmpty(execute("SELECT * FROM %s WHERE b = 0")); + assertEmpty(execute("SELECT * FROM %s WHERE d = 3")); + } + private ResultMessage.Prepared prepareStatement(String cql, boolean forThrift) { return QueryProcessor.prepare(String.format(cql, KEYSPACE, currentTable()),