You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by pa...@apache.org on 2017/08/31 10:37:35 UTC

[2/3] cassandra git commit: Revert CASSANDRA-10368 of support non-pk base column filtering on MV due to correctness

Revert CASSANDRA-10368 of support non-pk base column filtering on MV due to correctness

Patch by Zhao Yang; Reviewed by Paulo Motta for CASSANDRA-13798


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/425880ff
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/425880ff
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/425880ff

Branch: refs/heads/trunk
Commit: 425880ffb2e6bd5aeaa509fdbfa553db58b74c43
Parents: 4f12c40
Author: Zhao Yang <zh...@gmail.com>
Authored: Fri Aug 25 17:55:22 2017 +0800
Committer: Paulo Motta <pa...@apache.org>
Committed: Thu Aug 31 05:14:05 2017 -0500

----------------------------------------------------------------------
 CHANGES.txt                                          |  1 +
 NEWS.txt                                             |  6 ++++++
 .../cql3/statements/CreateViewStatement.java         | 15 +++++++++++++++
 .../org/apache/cassandra/cql3/ViewFilteringTest.java |  9 +++++++++
 .../org/apache/cassandra/cql3/ViewSchemaTest.java    | 15 +++++++++++++++
 5 files changed, 46 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/425880ff/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index af185cf..e5ccf45 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 3.11.1
+ * Revert CASSANDRA-10368 of supporting non-pk column filtering due to correctness (CASSANDRA-13798)
  * Fix cassandra-stress hang issues when an error during cluster connection happens (CASSANDRA-12938)
  * Better bootstrap failure message when blocked by (potential) range movement (CASSANDRA-13744)
  * "ignore" option is ignored in sstableloader (CASSANDRA-13721)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/425880ff/NEWS.txt
----------------------------------------------------------------------
diff --git a/NEWS.txt b/NEWS.txt
index 10f631f..8e39667 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -26,6 +26,12 @@ Upgrading
 
 Upgrading
 ---------
+   - Creating Materialized View with filtering on non-primary-key base column
+     (added in CASSANDRA-10368) is disabled, because the liveness of view row
+     is depending on multiple filtered base non-key columns and base non-key
+     column used in view primary-key. This semantic cannot be supported without
+     storage format change, see CASSANDRA-13826. For append-only use case, you
+     may still use this feature with a startup flag: "-Dcassandra.mv.allow_filtering_nonkey_columns_unsafe=true"
    - ALTER TABLE (ADD/DROP COLUMN) operations concurrent with a read might
      result into data corruption (see CASSANDRA-13004 for more details).
      Fixing this bug required a messaging protocol version bump. By default,

http://git-wip-us.apache.org/repos/asf/cassandra/blob/425880ff/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
index 668f791..8a8fc17 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateViewStatement.java
@@ -19,6 +19,7 @@
 package org.apache.cassandra.cql3.statements;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
@@ -210,6 +211,20 @@ public class CreateViewStatement extends SchemaAlteringStatement
         if (!prepared.boundNames.isEmpty())
             throw new InvalidRequestException("Cannot use query parameters in CREATE MATERIALIZED VIEW statements");
 
+        // SEE CASSANDRA-13798, use it if the use case is append-only.
+        final boolean allowFilteringNonKeyColumns = Boolean.parseBoolean(System.getProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe",
+                                                                                            "false"));
+        if (!restrictions.nonPKRestrictedColumns(false).isEmpty() && !allowFilteringNonKeyColumns)
+        {
+            throw new InvalidRequestException(
+                                              String.format("Non-primary key columns cannot be restricted in the SELECT statement used"
+                                                      + " for materialized view creation (got restrictions on: %s)",
+                                                            restrictions.nonPKRestrictedColumns(false)
+                                                                        .stream()
+                                                                        .map(def -> def.name.toString())
+                                                                        .collect(Collectors.joining(", "))));
+        }
+
         String whereClauseText = View.relationsToWhereClause(whereClause.relations);
 
         Set<ColumnIdentifier> basePrimaryKeyCols = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/cassandra/blob/425880ff/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
index cc8bfe9..87b19ad 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
@@ -21,6 +21,7 @@ package org.apache.cassandra.cql3;
 import java.util.*;
 
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -48,7 +49,15 @@ public class ViewFilteringTest extends CQLTester
     public static void startup()
     {
         requireNetwork();
+        System.setProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe", "true");
     }
+
+    @AfterClass
+    public static void TearDown()
+    {
+        System.setProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe", "false");
+    }
+
     @Before
     public void begin()
     {

http://git-wip-us.apache.org/repos/asf/cassandra/blob/425880ff/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
----------------------------------------------------------------------
diff --git a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
index 86e00dc..c83d96d 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
@@ -684,4 +684,19 @@ public class ViewSchemaTest extends CQLTester
             Assert.assertEquals("Cannot use DROP TABLE on Materialized View", e.getMessage());
         }
     }
+
+    @Test
+    public void testCreateMVWithFilteringOnNonPkColumn() throws Throwable
+    {
+        // SEE CASSANDRA-13798, we cannot properly support non-pk base column filtering for mv without huge storage
+        // format changes.
+        createTable("CREATE TABLE %s ( a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
+
+        executeNet(protocolVersion, "USE " + keyspace());
+
+        assertInvalidMessage("Non-primary key columns cannot be restricted in the SELECT statement used for materialized view creation",
+                             "CREATE MATERIALIZED VIEW " + keyspace() + ".mv AS SELECT * FROM %s "
+                                     + "WHERE b IS NOT NULL AND c IS NOT NULL AND a IS NOT NULL "
+                                     + "AND d = 1 PRIMARY KEY (c, b, a)");
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org