Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.0 fa909cc42 -> a88073918


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-3.0
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));
     }
 
     /**

Reply via email to