Repository: cassandra Updated Branches: refs/heads/trunk 936dea895 -> 83bf0d5d5
Don't allow mixed multi/single column relations Patch by Benjamin Lerer; reviewed by Tyler Hobbs for CASSANDRA-7711 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/aae9b910 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/aae9b910 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/aae9b910 Branch: refs/heads/trunk Commit: aae9b9101c61d914e0ceb7e39f88d688c986af18 Parents: b22089d Author: blerer <b_le...@hotmail.com> Authored: Wed Sep 3 10:38:58 2014 -0500 Committer: Tyler Hobbs <ty...@datastax.com> Committed: Wed Sep 3 10:38:58 2014 -0500 ---------------------------------------------------------------------- CHANGES.txt | 2 ++ .../cassandra/cql3/statements/SelectStatement.java | 14 ++++++++++++-- .../cassandra/cql3/MultiColumnRelationTest.java | 6 ++++++ 3 files changed, 20 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/aae9b910/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 4954b7f..7be8979 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,6 @@ 2.0.11: + * Explicitly disallowing mixing multi-column and single-column + relations on clustering columns (CASSANDRA-7711) * Better error message when condition is set on PK column (CASSANDRA-7804) * Forbid re-adding dropped counter columns (CASSANDRA-7831) * Fix CFMetaData#isThriftCompatible() for PK-only tables (CASSANDRA-7832) http://git-wip-us.apache.org/repos/asf/cassandra/blob/aae9b910/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 a360d49..ea1d8e9 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -28,6 +28,8 @@ import org.github.jamm.MemoryMeter; import org.apache.cassandra.auth.Permission; import org.apache.cassandra.cql3.*; +import org.apache.cassandra.cql3.CFDefinition.Name; +import org.apache.cassandra.cql3.CFDefinition.Name.Kind; import org.apache.cassandra.transport.messages.ResultMessage; import org.apache.cassandra.config.CFMetaData; import org.apache.cassandra.db.*; @@ -1400,6 +1402,8 @@ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache */ boolean hasQueriableIndex = false; boolean hasQueriableClusteringColumnIndex = false; + boolean hasSingleColumnRelations = false; + boolean hasMultiColumnRelations = false; for (Relation relation : whereClause) { if (relation.isMultiColumn()) @@ -1411,7 +1415,9 @@ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache boolean[] queriable = processRelationEntity(stmt, relation, entity, cfDef); hasQueriableIndex |= queriable[0]; hasQueriableClusteringColumnIndex |= queriable[1]; - names.add(cfDef.get(entity)); + Name name = cfDef.get(entity); + names.add(name); + hasMultiColumnRelations |= Kind.COLUMN_ALIAS.equals(name.kind); } updateRestrictionsForRelation(stmt, names, rel, boundNames); } @@ -1421,9 +1427,13 @@ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache boolean[] queriable = processRelationEntity(stmt, relation, rel.getEntity(), cfDef); hasQueriableIndex |= queriable[0]; hasQueriableClusteringColumnIndex |= queriable[1]; - updateRestrictionsForRelation(stmt, cfDef.get(rel.getEntity()), rel, boundNames); + Name name = cfDef.get(rel.getEntity()); + hasSingleColumnRelations |= Kind.COLUMN_ALIAS.equals(name.kind); + updateRestrictionsForRelation(stmt, name, rel, boundNames); } } + if (hasSingleColumnRelations && hasMultiColumnRelations) + throw new InvalidRequestException("Mixing single column relations and multi column relations on clustering columns is not allowed"); // At this point, the select statement if fully constructed, but we still have a few things to validate processPartitionKeyRestrictions(stmt, cfDef, hasQueriableIndex); http://git-wip-us.apache.org/repos/asf/cassandra/blob/aae9b910/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java index 121a8d3..498d332 100644 --- a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java @@ -112,6 +112,12 @@ public class MultiColumnRelationTest return null; } + @Test(expected=InvalidRequestException.class) + public void testMixMultiColumnRelationsAndSingleColumn() throws Throwable + { + execute("SELECT * FROM %s.multiple_clustering WHERE a = 1 AND (b) in ((2),(3)) AND c > 4"); + } + @Test(expected=SyntaxException.class) public void testEmptyIdentifierTuple() throws Throwable {