Repository: cassandra Updated Branches: refs/heads/cassandra-3.X 6f97804ce -> 5d48b0d38
Allow IN restrictions on column families with collections patch by Alex Petrov; reviewed by Benjamin Lerer for CASSANDRA-12654 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/5d48b0d3 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/5d48b0d3 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/5d48b0d3 Branch: refs/heads/cassandra-3.X Commit: 5d48b0d38d996cde1954c3c0df0f0f0a5eecfb81 Parents: 6f97804 Author: Alex Petrov <[email protected]> Authored: Mon Dec 19 15:53:29 2016 +0100 Committer: Benjamin Lerer <[email protected]> Committed: Mon Dec 19 15:58:48 2016 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../restrictions/StatementRestrictions.java | 7 --- .../cassandra/cql3/selection/Selection.java | 14 ------ .../cql3/statements/ModificationStatement.java | 2 +- .../cql3/statements/SelectStatement.java | 1 - .../cql3/statements/UpdateStatement.java | 2 - .../validation/entities/CollectionsTest.java | 51 +++++++++++++++++--- 7 files changed, 46 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 1563d6b..d4da5c4 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 3.12 + * Allow IN restrictions on column families with collections (CASSANDRA-12654) * Move to FastThreadLocalThread and FastThreadLocal (CASSANDRA-13034) * nodetool stopdaemon errors out (CASSANDRA-13030) * Log message size in trace message in OutboundTcpConnection (CASSANDRA-13028) http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java index 6b89579..0d5d403 100644 --- a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java +++ b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java @@ -36,7 +36,6 @@ import org.apache.cassandra.exceptions.InvalidRequestException; import org.apache.cassandra.index.Index; import org.apache.cassandra.index.SecondaryIndexManager; import org.apache.cassandra.net.MessagingService; -import org.apache.cassandra.utils.ByteBufferUtil; import org.apache.cassandra.utils.btree.BTreeSet; import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse; @@ -122,7 +121,6 @@ public final class StatementRestrictions WhereClause whereClause, VariableSpecifications boundNames, boolean selectsOnlyStaticColumns, - boolean selectsComplexColumn, boolean allowFiltering, boolean forView) { @@ -218,7 +216,6 @@ public final class StatementRestrictions processClusteringColumnsRestrictions(hasQueriableIndex, selectsOnlyStaticColumns, - selectsComplexColumn, forView, allowFiltering); @@ -487,11 +484,9 @@ public final class StatementRestrictions * @param hasQueriableIndex <code>true</code> if some of the queried data are indexed, <code>false</code> otherwise * @param selectsOnlyStaticColumns <code>true</code> if the selected or modified columns are all statics, * <code>false</code> otherwise. - * @param selectsComplexColumn <code>true</code> if the query should return a collection column */ private void processClusteringColumnsRestrictions(boolean hasQueriableIndex, boolean selectsOnlyStaticColumns, - boolean selectsComplexColumn, boolean forView, boolean allowFiltering) { @@ -507,8 +502,6 @@ public final class StatementRestrictions } else { - checkFalse(clusteringColumnsRestrictions.hasIN() && selectsComplexColumn, - "Cannot restrict clustering columns by IN relations when a collection is selected by the query"); checkFalse(clusteringColumnsRestrictions.hasContains() && !hasQueriableIndex && !allowFiltering, "Clustering columns can only be restricted with CONTAINS with a secondary index or filtering"); http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/selection/Selection.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java index 0d76b4e..401442f 100644 --- a/src/java/org/apache/cassandra/cql3/selection/Selection.java +++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java @@ -116,20 +116,6 @@ public abstract class Selection return true; } - /** - * Checks if this selection contains a complex column. - * - * @return <code>true</code> if this selection contains a multicell collection or UDT, <code>false</code> otherwise. - */ - public boolean containsAComplexColumn() - { - for (ColumnDefinition def : getColumns()) - if (def.isComplex()) - return true; - - return false; - } - public ResultSet.ResultMetadata getResultMetadata(boolean isJson) { if (!isJson) http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java index 5f3a2b3..99395ed 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -887,7 +887,7 @@ public abstract class ModificationStatement implements CQLStatement throw new InvalidRequestException(CUSTOM_EXPRESSIONS_NOT_ALLOWED); boolean applyOnlyToStaticColumns = appliesOnlyToStaticColumns(operations, conditions); - return new StatementRestrictions(type, cfm, where, boundNames, applyOnlyToStaticColumns, false, false, false); + return new StatementRestrictions(type, cfm, where, boundNames, applyOnlyToStaticColumns, false, false); } /** http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 1744e70..8e28ceb 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -995,7 +995,6 @@ public class SelectStatement implements CQLStatement whereClause, boundNames, selection.containsOnlyStaticColumns(), - selection.containsAComplexColumn(), parameters.allowFiltering, forView); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java b/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java index 6bcfd9c..b097ded 100644 --- a/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java @@ -184,7 +184,6 @@ public class UpdateStatement extends ModificationStatement boundNames, applyOnlyToStaticColumns, false, - false, false); return new UpdateStatement(type, @@ -253,7 +252,6 @@ public class UpdateStatement extends ModificationStatement boundNames, applyOnlyToStaticColumns, false, - false, false); return new UpdateStatement(type, http://git-wip-us.apache.org/repos/asf/cassandra/blob/5d48b0d3/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java index 0c59d6f..20cbe29 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java @@ -564,17 +564,54 @@ public class CollectionsTest extends CQLTester assertInvalid("SELECT writetime(l) FROM %s WHERE k = 0"); } - /** - * Migrated from cql_tests.py:TestCQL.bug_5376() - */ @Test - public void testInClauseWithCollections() throws Throwable + public void testInRestrictionWithCollection() throws Throwable { - createTable("CREATE TABLE %s (key text, c bigint, v text, x set < text >, PRIMARY KEY(key, c) )"); - - assertInvalid("select * from %s where key = 'foo' and c in (1,3,4)"); + for (boolean frozen : new boolean[]{true, false}) + { + createTable(frozen ? "CREATE TABLE %s (a int, b int, c int, d frozen<list<int>>, e frozen<map<int, int>>, f frozen<set<int>>, PRIMARY KEY (a, b, c))" + : "CREATE TABLE %s (a int, b int, c int, d list<int>, e map<int, int>, f set<int>, PRIMARY KEY (a, b, c))"); + + execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 1, 1, [1, 2], {1: 2}, {1, 2})"); + execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 1, 2, [1, 3], {1: 3}, {1, 3})"); + execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 1, 3, [1, 4], {1: 4}, {1, 4})"); + execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 2, 3, [1, 3], {1: 3}, {1, 3})"); + execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (1, 2, 4, [1, 3], {1: 3}, {1, 3})"); + execute("INSERT INTO %s (a, b, c, d, e, f) VALUES (2, 1, 1, [1, 2], {2: 2}, {1, 2})"); + + beforeAndAfterFlush(() -> { + assertRows(execute("SELECT * FROM %s WHERE a in (1,2)"), + row(1, 1, 1, list(1, 2), map(1, 2), set(1, 2)), + row(1, 1, 2, list(1, 3), map(1, 3), set(1, 3)), + row(1, 1, 3, list(1, 4), map(1, 4), set(1, 4)), + row(1, 2, 3, list(1, 3), map(1, 3), set(1, 3)), + row(1, 2, 4, list(1, 3), map(1, 3), set(1, 3)), + row(2, 1, 1, list(1, 2), map(2, 2), set(1, 2))); + + assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b IN (1,2)"), + row(1, 1, 1, list(1, 2), map(1, 2), set(1, 2)), + row(1, 1, 2, list(1, 3), map(1, 3), set(1, 3)), + row(1, 1, 3, list(1, 4), map(1, 4), set(1, 4)), + row(1, 2, 3, list(1, 3), map(1, 3), set(1, 3)), + row(1, 2, 4, list(1, 3), map(1, 3), set(1, 3))); + + assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 1 AND c in (1,2)"), + row(1, 1, 1, list(1, 2), map(1, 2), set(1, 2)), + row(1, 1, 2, list(1, 3), map(1, 3), set(1, 3))); + + assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b IN (1, 2) AND c in (1,2,3)"), + row(1, 1, 1, list(1, 2), map(1, 2), set(1, 2)), + row(1, 1, 2, list(1, 3), map(1, 3), set(1, 3)), + row(1, 1, 3, list(1, 4), map(1, 4), set(1, 4)), + row(1, 2, 3, list(1, 3), map(1, 3), set(1, 3))); + + assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b IN (1, 2) AND c in (1,2,3) AND d CONTAINS 4 ALLOW FILTERING"), + row(1, 1, 3, list(1, 4), map(1, 4), set(1, 4))); + }); + } } + /** * Test for bug #5795, * migrated from cql_tests.py:TestCQL.nonpure_function_collection_test()
