Repository: cassandra Updated Branches: refs/heads/cassandra-2.2 728f94e79 -> a33790730
Fix conditions on static columns patch by Benjamin Lerer; reviewed by Sylvain Lebresne for CASSANDRA-10264 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/9b3b1cb0 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/9b3b1cb0 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/9b3b1cb0 Branch: refs/heads/cassandra-2.2 Commit: 9b3b1cb03c6536d40adfcfa8f93577079b9a9d1d Parents: b84ed11 Author: blerer <benjamin.le...@datastax.com> Authored: Tue Oct 20 13:54:46 2015 +0200 Committer: blerer <benjamin.le...@datastax.com> Committed: Tue Oct 20 13:54:46 2015 +0200 ---------------------------------------------------------------------- CHANGES.txt | 1 + pylib/cqlshlib/cql3handling.py | 2 +- .../cql3/statements/ModificationStatement.java | 24 ++++++++++++++++++-- .../operations/InsertUpdateIfConditionTest.java | 12 +++++++++- 4 files changed, 35 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b3b1cb0/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 7358689..b17929c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.1.12 + * Fix conditions on static columns (CASSANDRA-10264) * AssertionError: attempted to delete non-existing file CommitLog (CASSANDRA-10377) * Merge range tombstones during compaction (CASSANDRA-7953) * (cqlsh) Distinguish negative and positive infinity in output (CASSANDRA-10523) http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b3b1cb0/pylib/cqlshlib/cql3handling.py ---------------------------------------------------------------------- diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py index 5f93003..49970e4 100644 --- a/pylib/cqlshlib/cql3handling.py +++ b/pylib/cqlshlib/cql3handling.py @@ -143,7 +143,7 @@ JUNK ::= /([ \t\r\f\v]+|(--|[/][/])[^\n\r]*([\n\r]|$)|[/][*].*?[*][/])/ ; <star> ::= "*" ; <endtoken> ::= ";" ; <op> ::= /[-+=,().]/ ; -<cmp> ::= /[<>]=?/ ; +<cmp> ::= /[<>!]=?/ ; <brackets> ::= /[][{}]/ ; <integer> ::= "-"? <wholenumber> ; http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b3b1cb0/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 37b46ae..75a3b40 100644 --- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java @@ -29,7 +29,6 @@ import org.apache.cassandra.config.ColumnDefinition; import org.apache.cassandra.config.Schema; import org.apache.cassandra.cql3.*; import org.apache.cassandra.db.*; -import org.apache.cassandra.db.composites.AbstractCellNameType; import org.apache.cassandra.db.composites.CBuilder; import org.apache.cassandra.db.composites.Composite; import org.apache.cassandra.db.filter.ColumnSlice; @@ -339,7 +338,7 @@ public abstract class ModificationStatement implements CQLStatement // UPDATE t SET s = 3 WHERE k = 0 AND v = 1 // DELETE v FROM t WHERE k = 0 AND v = 1 // sounds like you don't really understand what your are doing. - if (setsStaticColumns && !setsRegularColumns) + if (appliesOnlyToStaticColumns()) { // If we set no non-static columns, then it's fine not to have clustering columns if (hasNoClusteringColumns) @@ -361,6 +360,27 @@ public abstract class ModificationStatement implements CQLStatement return createClusteringPrefixBuilderInternal(options); } + /** + * Checks that the modification only apply to static columns. + * @return <code>true</code> if the modification only apply to static columns, <code>false</code> otherwise. + */ + private boolean appliesOnlyToStaticColumns() + { + return setsStaticColumns && !appliesToRegularColumns(); + } + + /** + * Checks that the modification apply to regular columns. + * @return <code>true</code> if the modification apply to regular columns, <code>false</code> otherwise. + */ + private boolean appliesToRegularColumns() + { + // If we have regular operations, this applies to regular columns. + // Otherwise, if the statement is a DELETE and columnOperations is empty, this means we have no operations, + // which for a DELETE means a full row deletion. Which means the operation applies to all columns and regular ones in particular. + return setsRegularColumns || (type == StatementType.DELETE && columnOperations.isEmpty()); + } + private Composite createClusteringPrefixBuilderInternal(QueryOptions options) throws InvalidRequestException { http://git-wip-us.apache.org/repos/asf/cassandra/blob/9b3b1cb0/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java index 0438f13..e94011b 100644 --- a/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java +++ b/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java @@ -26,7 +26,6 @@ import org.apache.cassandra.exceptions.SyntaxException; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; public class InsertUpdateIfConditionTest extends CQLTester { @@ -181,6 +180,17 @@ public class InsertUpdateIfConditionTest extends CQLTester assertInvalid("DELETE FROM %s WHERE i = 0 IF EXISTS"); assertInvalid("DELETE FROM %s WHERE k = 0 AND i > 0 IF EXISTS"); assertInvalid("DELETE FROM %s WHERE k = 0 AND i > 0 IF v = 'foo'"); + + createTable("CREATE TABLE %s(k int, s int static, i int, v text, PRIMARY KEY(k, i))"); + execute("INSERT INTO %s (k, s, i, v) VALUES ( 1, 1, 2, '1')"); + assertRows(execute("DELETE v FROM %s WHERE k = 1 AND i = 2 IF s != 1"), row(false, 1)); + assertRows(execute("DELETE v FROM %s WHERE k = 1 AND i = 2 IF s = 1"), row(true)); + assertRows(execute("SELECT * FROM %s WHERE k = 1 AND i = 2"), row(1, 2, 1, null)); + + assertRows(execute("DELETE FROM %s WHERE k = 1 AND i = 2 IF s != 1"), row(false, 1)); + assertRows(execute("DELETE FROM %s WHERE k = 1 AND i = 2 IF s = 1"), row(true)); + assertEmpty(execute("SELECT * FROM %s WHERE k = 1 AND i = 2")); + assertRows(execute("SELECT * FROM %s WHERE k = 1"), row(1, null, 1, null)); } /**