You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by be...@apache.org on 2021/11/26 06:19:06 UTC

[cassandra] branch cassandra-4.0 updated: ViewTests flaky on timeouts

This is an automated email from the ASF dual-hosted git repository.

bereng pushed a commit to branch cassandra-4.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-4.0 by this push:
     new 0764273  ViewTests flaky on timeouts
0764273 is described below

commit 0764273608f501036f1f68e51185067856b934db
Author: Bereng <be...@gmail.com>
AuthorDate: Mon Nov 22 11:45:33 2021 +0100

    ViewTests flaky on timeouts
    
    patch by Berenguer Blasi; reviewed by Andres de la Peña for CASSANDRA-17167
---
 .../cql3/ViewComplexDeletionsPartialTest.java      | 227 +++++++++
 .../cassandra/cql3/ViewComplexDeletionsTest.java   | 191 +-------
 .../cql3/ViewComplexLivenessLimitTest.java         | 101 ++++
 .../cassandra/cql3/ViewComplexLivenessTest.java    |  67 +--
 .../apache/cassandra/cql3/ViewComplexTTLTest.java  |   4 +-
 .../org/apache/cassandra/cql3/ViewComplexTest.java |  80 +---
 .../apache/cassandra/cql3/ViewComplexTester.java   |   4 +-
 .../cassandra/cql3/ViewComplexTombstoneTest.java   | 116 +++++
 .../cassandra/cql3/ViewComplexUpdatesTest.java     |   4 +-
 .../apache/cassandra/cql3/ViewFiltering2Test.java  | 452 +++++++++++++++++
 .../cql3/ViewFilteringClustering1Test.java         |  58 +--
 .../cql3/ViewFilteringClustering2Test.java         |  58 +--
 ...g2Test.java => ViewFilteringComplexPKTest.java} | 240 +++++-----
 ...gPKTest.java => ViewFilteringSimplePKTest.java} | 328 +------------
 .../apache/cassandra/cql3/ViewFilteringTest.java   | 532 +--------------------
 ...ComplexTester.java => ViewFilteringTester.java} |  54 +--
 16 files changed, 1071 insertions(+), 1445 deletions(-)

diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsPartialTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsPartialTest.java
new file mode 100644
index 0000000..377621e
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsPartialTest.java
@@ -0,0 +1,227 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.cql3;
+
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.utils.FBUtilities;
+
+/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
+ * Any changes here check if they apply to the other classes:
+ * - ViewComplexUpdatesTest
+ * - ViewComplexDeletionsTest
+ * - ViewComplexTTLTest
+ * - ViewComplexTest
+ * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
+ */
+public class ViewComplexDeletionsPartialTest extends ViewComplexTester
+{
+    // for now, unselected column cannot be fully supported, SEE CASSANDRA-11500
+    @Ignore
+    @Test
+    public void testPartialDeleteUnselectedColumn() throws Throwable
+    {
+        boolean flush = true;
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+        createTable("CREATE TABLE %s (k int, c int, a int, b int, PRIMARY KEY (k, c))");
+        String mv = createView("CREATE MATERIALIZED VIEW %s " +
+                                 "AS SELECT k,c FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
+        Keyspace ks = Keyspace.open(keyspace());
+        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+
+        updateView("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1");
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, 1));
+        assertRows(execute("SELECT * from " + mv), row(1, 1));
+        updateView("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1");
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+        assertEmpty(execute("SELECT * from %s"));
+        assertEmpty(execute("SELECT * from " + mv));
+        updateView("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1");
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+        assertRows(execute("SELECT * from %s"), row(1, 1, 1, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1));
+
+        execute("truncate %s;");
+
+        // removal generated by unselected column should not shadow PK update with smaller timestamp
+        updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET a=1 WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, 1, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1));
+
+        updateViewWithFlush("UPDATE %s USING TIMESTAMP 20 SET a=null WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"));
+        assertRows(execute("SELECT * from " + mv));
+
+        updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1));
+    }
+
+    @Test
+    public void testPartialDeleteSelectedColumnWithFlush() throws Throwable
+    {
+        testPartialDeleteSelectedColumn(true);
+    }
+
+    @Test
+    public void testPartialDeleteSelectedColumnWithoutFlush() throws Throwable
+    {
+        testPartialDeleteSelectedColumn(false);
+    }
+
+    private void testPartialDeleteSelectedColumn(boolean flush) throws Throwable
+    {
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+        createTable("CREATE TABLE %s (k int, c int, a int, b int, e int, f int, PRIMARY KEY (k, c))");
+        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s " +
+                                 "WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
+        Keyspace ks = Keyspace.open(keyspace());
+        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+
+        updateViewWithFlush("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
+
+        updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1", flush);
+        assertEmpty(execute("SELECT * from %s"));
+        assertEmpty(execute("SELECT * from " + mv));
+
+        updateViewWithFlush("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, 1, null, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, 1, null));
+
+        updateViewWithFlush("DELETE a FROM %s USING TIMESTAMP 1 WHERE k=1 AND c=1", flush);
+        assertEmpty(execute("SELECT * from %s"));
+        assertEmpty(execute("SELECT * from " + mv));
+
+        // view livenessInfo should not be affected by selected column ts or tb
+        updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 0", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+
+        updateViewWithFlush("UPDATE %s USING TIMESTAMP 12 SET b=1 WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
+
+        updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 13 WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+
+        updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 14 WHERE k=1 AND c=1", flush);
+        assertEmpty(execute("SELECT * from %s"));
+        assertEmpty(execute("SELECT * from " + mv));
+
+        updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+
+        updateViewWithFlush("UPDATE %s USING TTL 3 SET b=1 WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
+
+        TimeUnit.SECONDS.sleep(4);
+
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+
+        updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 15 WHERE k=1 AND c=1", flush);
+        assertEmpty(execute("SELECT * from %s"));
+        assertEmpty(execute("SELECT * from " + mv));
+
+        execute("truncate %s;");
+
+        // removal generated by unselected column should not shadow selected column with smaller timestamp
+        updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=1 WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, 1, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+
+        updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=null WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"));
+        assertRows(execute("SELECT * from " + mv));
+
+        updateViewWithFlush("UPDATE %s USING TIMESTAMP 16 SET a=1 WHERE k=1 AND c=1", flush);
+        assertRows(execute("SELECT * from %s"), row(1, 1, 1, null, null, null));
+        assertRows(execute("SELECT * from " + mv), row(1, 1, 1, null));
+    }
+
+    @Test
+    public void testRangeDeletionWithFlush() throws Throwable
+    {
+        testRangeDeletion(true);
+    }
+
+    @Test
+    public void testRangeDeletionWithoutFlush() throws Throwable
+    {
+        testRangeDeletion(false);
+    }
+
+    private void testRangeDeletion(boolean flush) throws Throwable
+    {
+        // for partition range deletion, need to know that existing row is shadowed instead of not existed.
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a))");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+
+        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
+                                 "WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a, b)");
+
+        Keyspace ks = Keyspace.open(keyspace());
+        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) using timestamp 0", 1, 1, 1, 1);
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv), row(1, 1, 1, 1));
+
+        // remove view row
+        updateView("UPDATE %s using timestamp 1 set b = null WHERE a=1");
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv));
+        // remove base row, no view updated generated.
+        updateView("DELETE FROM %s using timestamp 2 where a=1");
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv));
+
+        // restor view row with b,c column. d is still tombstone
+        updateView("UPDATE %s using timestamp 3 set b = 1,c = 1 where a=1"); // upsert
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv), row(1, 1, 1, null));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java
index 33fa6d9..24d76d4 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java
@@ -21,10 +21,8 @@ package org.apache.cassandra.cql3;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
-import org.junit.Ignore;
 import org.junit.Test;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -44,196 +42,11 @@ import static org.junit.Assert.assertEquals;
  * - ViewComplexTTLTest
  * - ViewComplexTest
  * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
  */
 public class ViewComplexDeletionsTest extends ViewComplexTester
 {
-    // for now, unselected column cannot be fully supported, SEE CASSANDRA-11500
-    @Ignore
-    @Test
-    public void testPartialDeleteUnselectedColumn() throws Throwable
-    {
-        boolean flush = true;
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-        createTable("CREATE TABLE %s (k int, c int, a int, b int, PRIMARY KEY (k, c))");
-        String mv = createView("CREATE MATERIALIZED VIEW %s " +
-                                 "AS SELECT k,c FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
-        Keyspace ks = Keyspace.open(keyspace());
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
-
-        updateView("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1");
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, 1));
-        assertRows(execute("SELECT * from " + mv), row(1, 1));
-        updateView("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1");
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
-        updateView("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1");
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRows(execute("SELECT * from %s"), row(1, 1, 1, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1));
-
-        execute("truncate %s;");
-
-        // removal generated by unselected column should not shadow PK update with smaller timestamp
-        updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET a=1 WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, 1, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1));
-
-        updateViewWithFlush("UPDATE %s USING TIMESTAMP 20 SET a=null WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"));
-        assertRows(execute("SELECT * from " + mv));
-
-        updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1));
-    }
-
-    @Test
-    public void testPartialDeleteSelectedColumnWithFlush() throws Throwable
-    {
-        testPartialDeleteSelectedColumn(true);
-    }
-
-    @Test
-    public void testPartialDeleteSelectedColumnWithoutFlush() throws Throwable
-    {
-        testPartialDeleteSelectedColumn(false);
-    }
-
-    private void testPartialDeleteSelectedColumn(boolean flush) throws Throwable
-    {
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-        createTable("CREATE TABLE %s (k int, c int, a int, b int, e int, f int, PRIMARY KEY (k, c))");
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s " +
-                                 "WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
-        Keyspace ks = Keyspace.open(keyspace());
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
-
-        updateViewWithFlush("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
-
-        updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1", flush);
-        assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
-
-        updateViewWithFlush("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, 1, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, 1, null));
-
-        updateViewWithFlush("DELETE a FROM %s USING TIMESTAMP 1 WHERE k=1 AND c=1", flush);
-        assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
-
-        // view livenessInfo should not be affected by selected column ts or tb
-        updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 0", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
-
-        updateViewWithFlush("UPDATE %s USING TIMESTAMP 12 SET b=1 WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
-
-        updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 13 WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
-
-        updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 14 WHERE k=1 AND c=1", flush);
-        assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
-
-        updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
-
-        updateViewWithFlush("UPDATE %s USING TTL 3 SET b=1 WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
-
-        TimeUnit.SECONDS.sleep(4);
-
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
-
-        updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 15 WHERE k=1 AND c=1", flush);
-        assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
-
-        execute("truncate %s;");
-
-        // removal generated by unselected column should not shadow selected column with smaller timestamp
-        updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=1 WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, null, null, 1, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
-
-        updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=null WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"));
-        assertRows(execute("SELECT * from " + mv));
-
-        updateViewWithFlush("UPDATE %s USING TIMESTAMP 16 SET a=1 WHERE k=1 AND c=1", flush);
-        assertRows(execute("SELECT * from %s"), row(1, 1, 1, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, 1, null));
-    }
-
-    @Test
-    public void testRangeDeletionWithFlush() throws Throwable
-    {
-        testRangeDeletion(true);
-    }
-
-    @Test
-    public void testRangeDeletionWithoutFlush() throws Throwable
-    {
-        testRangeDeletion(false);
-    }
-
-    private void testRangeDeletion(boolean flush) throws Throwable
-    {
-        // for partition range deletion, need to know that existing row is shadowed instead of not existed.
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                                 "WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a, b)");
-
-        Keyspace ks = Keyspace.open(keyspace());
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) using timestamp 0", 1, 1, 1, 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv), row(1, 1, 1, 1));
-
-        // remove view row
-        updateView("UPDATE %s using timestamp 1 set b = null WHERE a=1");
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv));
-        // remove base row, no view updated generated.
-        updateView("DELETE FROM %s using timestamp 2 where a=1");
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv));
-
-        // restor view row with b,c column. d is still tombstone
-        updateView("UPDATE %s using timestamp 3 set b = 1,c = 1 where a=1"); // upsert
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv), row(1, 1, 1, null));
-    }
-
     @Test
     public void testCommutativeRowDeletionFlush() throws Throwable
     {
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessLimitTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessLimitTest.java
new file mode 100644
index 0000000..2be826f
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessLimitTest.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.cql3;
+
+import java.util.Arrays;
+
+import org.junit.Test;
+
+import org.apache.cassandra.db.Keyspace;
+
+import static org.junit.Assert.assertEquals;
+
+/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
+ * Any changes here check if they apply to the other classes:
+ * - ViewComplexUpdatesTest
+ * - ViewComplexDeletionsTest
+ * - ViewComplexTTLTest
+ * - ViewComplexTest
+ * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
+ */
+public class ViewComplexLivenessLimitTest extends ViewComplexTester
+{
+    @Test
+    public void testExpiredLivenessLimitWithFlush() throws Throwable
+    {
+        // CASSANDRA-13883
+        testExpiredLivenessLimit(true);
+    }
+
+    @Test
+    public void testExpiredLivenessLimitWithoutFlush() throws Throwable
+    {
+        // CASSANDRA-13883
+        testExpiredLivenessLimit(false);
+    }
+
+    private void testExpiredLivenessLimit(boolean flush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, a int, b int);");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+        Keyspace ks = Keyspace.open(keyspace());
+
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
+                                "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (k, a)");
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
+                                "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k)");
+        ks.getColumnFamilyStore(mv1).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv2).disableAutoCompaction();
+
+        for (int i = 1; i <= 100; i++)
+            updateView("INSERT INTO %s(k, a, b) VALUES (?, ?, ?);", i, i, i);
+        for (int i = 1; i <= 100; i++)
+        {
+            if (i % 50 == 0)
+                continue;
+            // create expired liveness
+            updateView("DELETE a FROM %s WHERE k = ?;", i);
+        }
+        if (flush)
+        {
+            ks.getColumnFamilyStore(mv1).forceBlockingFlush();
+            ks.getColumnFamilyStore(mv2).forceBlockingFlush();
+        }
+
+        for (String view : Arrays.asList(mv1, mv2))
+        {
+            // paging
+            assertEquals(1, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s limit 1", view), 1).all().size());
+            assertEquals(2, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s limit 2", view), 1).all().size());
+            assertEquals(2, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s", view), 1).all().size());
+            assertRowsNet(version, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s ", view), 1),
+                          row(50, 50, 50),
+                          row(100, 100, 100));
+            // limit
+            assertEquals(1, execute(String.format("SELECT k,a,b FROM %s limit 1", view)).size());
+            assertRowsIgnoringOrder(execute(String.format("SELECT k,a,b FROM %s limit 2", view)),
+                                    row(50, 50, 50),
+                                    row(100, 100, 100));
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java
index 7b4aa1a..1e327e2 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.cql3;
 
-import java.util.Arrays;
-
 import org.junit.Test;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -28,13 +26,15 @@ import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertEquals;
 
-/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes:
  * - ViewComplexUpdatesTest
  * - ViewComplexDeletionsTest
  * - ViewComplexTTLTest
  * - ViewComplexTest
  * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
  */
 public class ViewComplexLivenessTest extends ViewComplexTester
 {
@@ -91,67 +91,6 @@ public class ViewComplexLivenessTest extends ViewComplexTester
     }
 
     @Test
-    public void testExpiredLivenessLimitWithFlush() throws Throwable
-    {
-        // CASSANDRA-13883
-        testExpiredLivenessLimit(true);
-    }
-
-    @Test
-    public void testExpiredLivenessLimitWithoutFlush() throws Throwable
-    {
-        // CASSANDRA-13883
-        testExpiredLivenessLimit(false);
-    }
-
-    private void testExpiredLivenessLimit(boolean flush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (k int PRIMARY KEY, a int, b int);");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-        Keyspace ks = Keyspace.open(keyspace());
-
-        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                                "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (k, a)");
-        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                                "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k)");
-        ks.getColumnFamilyStore(mv1).disableAutoCompaction();
-        ks.getColumnFamilyStore(mv2).disableAutoCompaction();
-
-        for (int i = 1; i <= 100; i++)
-            updateView("INSERT INTO %s(k, a, b) VALUES (?, ?, ?);", i, i, i);
-        for (int i = 1; i <= 100; i++)
-        {
-            if (i % 50 == 0)
-                continue;
-            // create expired liveness
-            updateView("DELETE a FROM %s WHERE k = ?;", i);
-        }
-        if (flush)
-        {
-            ks.getColumnFamilyStore(mv1).forceBlockingFlush();
-            ks.getColumnFamilyStore(mv2).forceBlockingFlush();
-        }
-
-        for (String view : Arrays.asList(mv1, mv2))
-        {
-            // paging
-            assertEquals(1, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s limit 1", view), 1).all().size());
-            assertEquals(2, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s limit 2", view), 1).all().size());
-            assertEquals(2, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s", view), 1).all().size());
-            assertRowsNet(version, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s ", view), 1),
-                          row(50, 50, 50),
-                          row(100, 100, 100));
-            // limit
-            assertEquals(1, execute(String.format("SELECT k,a,b FROM %s limit 1", view)).size());
-            assertRowsIgnoringOrder(execute(String.format("SELECT k,a,b FROM %s limit 2", view)),
-                                    row(50, 50, 50),
-                                    row(100, 100, 100));
-        }
-    }
-
-    @Test
     public void testStrictLivenessTombstone() throws Throwable
     {
         createTable("create table %s (p int primary key, v1 int, v2 int)");
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java
index 7c49ffa..b44c8d0 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java
@@ -26,13 +26,15 @@ import org.apache.cassandra.utils.FBUtilities;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes:
  * - ViewComplexUpdatesTest
  * - ViewComplexDeletionsTest
  * - ViewComplexTTLTest
  * - ViewComplexTest
  * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
  */
 public class ViewComplexTTLTest extends ViewComplexTester
 {
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
index 27cbf07..8098dcf 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
@@ -21,31 +21,30 @@ package org.apache.cassandra.cql3;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 import com.google.common.base.Objects;
+
 import org.junit.Test;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.compaction.CompactionManager;
-import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.fail;
 
-/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes:
  * - ViewComplexUpdatesTest
  * - ViewComplexDeletionsTest
  * - ViewComplexTTLTest
  * - ViewComplexTest
  * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
  */
 public class ViewComplexTest extends ViewComplexTester
 {
@@ -113,77 +112,6 @@ public class ViewComplexTest extends ViewComplexTester
     }
 
     @Test
-    public void testCellTombstoneAndShadowableTombstonesWithFlush() throws Throwable
-    {
-        testCellTombstoneAndShadowableTombstones(true);
-    }
-
-    @Test
-    public void testCellTombstoneAndShadowableTombstonesWithoutFlush() throws Throwable
-    {
-        testCellTombstoneAndShadowableTombstones(false);
-    }
-
-    private void testCellTombstoneAndShadowableTombstones(boolean flush) throws Throwable
-    {
-        createTable("create table %s (p int primary key, v1 int, v2 int)");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-        Keyspace ks = Keyspace.open(keyspace());
-
-        String mv = createView("create materialized view %s as select * from %%s " +
-                               "where p is not null and v1 is not null primary key (v1, p)");
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
-
-        // sstable 1, Set initial values TS=1
-        updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 1;");
-
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L));
-        // sstable 2
-        updateView("UPdate %s using timestamp 2 set v2 = null where p = 3");
-
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3),
-                                row(null, null));
-        // sstable 3
-        updateView("UPdate %s using timestamp 3 set v1 = 2 where p = 3");
-
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(2, 3, null, null));
-        // sstable 4
-        updateView("UPdate %s using timestamp 4 set v1 = 1 where p = 3");
-
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
-
-        if (flush)
-        {
-            // compact sstable 2 and 3;
-            ColumnFamilyStore cfs = ks.getColumnFamilyStore(mv);
-            List<String> sstables = cfs.getLiveSSTables()
-                                       .stream()
-                                       .sorted(Comparator.comparingInt(s -> s.descriptor.generation))
-                                       .map(SSTableReader::getFilename)
-                                       .collect(Collectors.toList());
-            String dataFiles = String.join(",", Arrays.asList(sstables.get(1), sstables.get(2)));
-            CompactionManager.instance.forceUserDefinedCompaction(dataFiles);
-        }
-        // cell-tombstone in sstable 4 is not compacted away, because the shadowable tombstone is shadowed by new row.
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv + " limit 1"), row(1, 3, null, null));
-    }
-
-    @Test
     public void testMVWithDifferentColumnsWithFlush() throws Throwable
     {
         testMVWithDifferentColumns(true);
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java
index a934649..de30eec 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java
@@ -35,13 +35,15 @@ import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.transport.ProtocolVersion;
 
-/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes:
  * - ViewComplexUpdatesTest
  * - ViewComplexDeletionsTest
  * - ViewComplexTTLTest
  * - ViewComplexTest
  * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
  */
 @RunWith(Parameterized.class)
 public abstract class ViewComplexTester extends CQLTester
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTombstoneTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTombstoneTest.java
new file mode 100644
index 0000000..3c484ac
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTombstoneTest.java
@@ -0,0 +1,116 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.cql3;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.junit.Test;
+
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.utils.FBUtilities;
+
+/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
+ * Any changes here check if they apply to the other classes:
+ * - ViewComplexUpdatesTest
+ * - ViewComplexDeletionsTest
+ * - ViewComplexTTLTest
+ * - ViewComplexTest
+ * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
+ */
+public class ViewComplexTombstoneTest extends ViewComplexTester
+{
+    @Test
+    public void testCellTombstoneAndShadowableTombstonesWithFlush() throws Throwable
+    {
+        testCellTombstoneAndShadowableTombstones(true);
+    }
+
+    @Test
+    public void testCellTombstoneAndShadowableTombstonesWithoutFlush() throws Throwable
+    {
+        testCellTombstoneAndShadowableTombstones(false);
+    }
+
+    private void testCellTombstoneAndShadowableTombstones(boolean flush) throws Throwable
+    {
+        createTable("create table %s (p int primary key, v1 int, v2 int)");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+        Keyspace ks = Keyspace.open(keyspace());
+
+        String mv = createView("create materialized view %s as select * from %%s " +
+                               "where p is not null and v1 is not null primary key (v1, p)");
+        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+
+        // sstable 1, Set initial values TS=1
+        updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 1;");
+
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L));
+        // sstable 2
+        updateView("UPdate %s using timestamp 2 set v2 = null where p = 3");
+
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3),
+                                row(null, null));
+        // sstable 3
+        updateView("UPdate %s using timestamp 3 set v1 = 2 where p = 3");
+
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(2, 3, null, null));
+        // sstable 4
+        updateView("UPdate %s using timestamp 4 set v1 = 1 where p = 3");
+
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
+
+        if (flush)
+        {
+            // compact sstable 2 and 3;
+            ColumnFamilyStore cfs = ks.getColumnFamilyStore(mv);
+            List<String> sstables = cfs.getLiveSSTables()
+                                       .stream()
+                                       .sorted(Comparator.comparingInt(s -> s.descriptor.generation))
+                                       .map(SSTableReader::getFilename)
+                                       .collect(Collectors.toList());
+            String dataFiles = String.join(",", Arrays.asList(sstables.get(1), sstables.get(2)));
+            CompactionManager.instance.forceUserDefinedCompaction(dataFiles);
+        }
+        // cell-tombstone in sstable 4 is not compacted away, because the shadowable tombstone is shadowed by new row.
+        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
+        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv + " limit 1"), row(1, 3, null, null));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java
index 76ae361..c930fa0 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java
@@ -25,13 +25,15 @@ import org.junit.Test;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.utils.FBUtilities;
 
-/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes:
  * - ViewComplexUpdatesTest
  * - ViewComplexDeletionsTest
  * - ViewComplexTTLTest
  * - ViewComplexTest
  * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
  */
 public class ViewComplexUpdatesTest extends ViewComplexTester
 {
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFiltering2Test.java b/test/unit/org/apache/cassandra/cql3/ViewFiltering2Test.java
new file mode 100644
index 0000000..2eb0eca
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/ViewFiltering2Test.java
@@ -0,0 +1,452 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.cql3;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.utils.FBUtilities;
+
+/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
+ * Any changes here check if they apply to the other classes
+ * - ViewFilteringPKTest
+ * - ViewFilteringClustering1Test
+ * - ViewFilteringClustering2Test
+ * - ViewFilteringTest
+ * - ...
+ * - ViewFiltering*Test
+ */
+@RunWith(Parameterized.class)
+public class ViewFiltering2Test extends ViewFilteringTester
+{
+    @Test
+    public void testAllTypes() throws Throwable
+    {
+        String myType = createType("CREATE TYPE %s (a int, b uuid, c set<text>)");
+        String columnNames = "asciival, " +
+                             "bigintval, " +
+                             "blobval, " +
+                             "booleanval, " +
+                             "dateval, " +
+                             "decimalval, " +
+                             "doubleval, " +
+                             "floatval, " +
+                             "inetval, " +
+                             "intval, " +
+                             "textval, " +
+                             "timeval, " +
+                             "timestampval, " +
+                             "timeuuidval, " +
+                             "uuidval," +
+                             "varcharval, " +
+                             "varintval, " +
+                             "frozenlistval, " +
+                             "frozensetval, " +
+                             "frozenmapval, " +
+                             "tupleval, " +
+                             "udtval";
+
+        createTable(
+        "CREATE TABLE %s (" +
+        "asciival ascii, " +
+        "bigintval bigint, " +
+        "blobval blob, " +
+        "booleanval boolean, " +
+        "dateval date, " +
+        "decimalval decimal, " +
+        "doubleval double, " +
+        "floatval float, " +
+        "inetval inet, " +
+        "intval int, " +
+        "textval text, " +
+        "timeval time, " +
+        "timestampval timestamp, " +
+        "timeuuidval timeuuid, " +
+        "uuidval uuid," +
+        "varcharval varchar, " +
+        "varintval varint, " +
+        "frozenlistval frozen<list<int>>, " +
+        "frozensetval frozen<set<uuid>>, " +
+        "frozenmapval frozen<map<ascii, int>>," +
+        "tupleval frozen<tuple<int, ascii, uuid>>," +
+        "udtval frozen<" + myType + ">, " +
+        "PRIMARY KEY (" + columnNames + "))");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+
+        createView(
+        "mv_test",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " +
+        "asciival = 'abc' AND " +
+        "bigintval = 123 AND " +
+        "blobval = 0xfeed AND " +
+        "booleanval = true AND " +
+        "dateval = '1987-03-23' AND " +
+        "decimalval = 123.123 AND " +
+        "doubleval = 123.123 AND " +
+        "floatval = 123.123 AND " +
+        "inetval = '127.0.0.1' AND " +
+        "intval = 123 AND " +
+        "textval = 'abc' AND " +
+        "timeval = '07:35:07.000111222' AND " +
+        "timestampval = 123123123 AND " +
+        "timeuuidval = 6BDDC89A-5644-11E4-97FC-56847AFE9799 AND " +
+        "uuidval = 6BDDC89A-5644-11E4-97FC-56847AFE9799 AND " +
+        "varcharval = 'abc' AND " +
+        "varintval = 123123123 AND " +
+        "frozenlistval = [1, 2, 3] AND " +
+        "frozensetval = {6BDDC89A-5644-11E4-97FC-56847AFE9799} AND " +
+        "frozenmapval = {'a': 1, 'b': 2} AND " +
+        "tupleval = (1, 'foobar', 6BDDC89A-5644-11E4-97FC-56847AFE9799) AND " +
+        "udtval = {a: 1, b: 6BDDC89A-5644-11E4-97FC-56847AFE9799, c: {'foo', 'bar'}} " +
+        "PRIMARY KEY (" + columnNames + ")");
+
+        execute("INSERT INTO %s (" + columnNames + ") VALUES (" +
+                "'abc'," +
+                "123," +
+                "0xfeed," +
+                "true," +
+                "'1987-03-23'," +
+                "123.123," +
+                "123.123," +
+                "123.123," +
+                "'127.0.0.1'," +
+                "123," +
+                "'abc'," +
+                "'07:35:07.000111222'," +
+                "123123123," +
+                "6BDDC89A-5644-11E4-97FC-56847AFE9799," +
+                "6BDDC89A-5644-11E4-97FC-56847AFE9799," +
+                "'abc'," +
+                "123123123," +
+                "[1, 2, 3]," +
+                "{6BDDC89A-5644-11E4-97FC-56847AFE9799}," +
+                "{'a': 1, 'b': 2}," +
+                "(1, 'foobar', 6BDDC89A-5644-11E4-97FC-56847AFE9799)," +
+                "{a: 1, b: 6BDDC89A-5644-11E4-97FC-56847AFE9799, c: {'foo', 'bar'}})");
+
+        assert !execute("SELECT * FROM mv_test").isEmpty();
+
+        executeNet(version, "ALTER TABLE %s RENAME inetval TO foo");
+        assert !execute("SELECT * FROM mv_test").isEmpty();
+    }
+
+    @Test
+    public void testMVCreationWithNonPrimaryRestrictions() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b))");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+
+        try {
+            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d = 1 PRIMARY KEY (a, b, c)");
+            dropView("mv_test");
+        } catch(Exception e) {
+            throw new RuntimeException("MV creation with non primary column restrictions failed.", e);
+        }
+
+        dropTable("DROP TABLE %s");
+    }
+
+    @Test
+    public void testNonPrimaryRestrictions() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b))");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 1, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
+
+        // only accept rows where c = 1
+        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (a, b, c)");
+
+        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
+            Thread.sleep(10);
+
+        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+                                row(0, 0, 1, 0),
+                                row(0, 1, 1, 0),
+                                row(1, 0, 1, 0),
+                                row(1, 1, 1, 0)
+        );
+
+        // insert new rows that do not match the filter
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 2, 0);
+        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+                                row(0, 0, 1, 0),
+                                row(0, 1, 1, 0),
+                                row(1, 0, 1, 0),
+                                row(1, 1, 1, 0)
+        );
+
+        // insert new row that does match the filter
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 1, 0);
+        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+                                row(0, 0, 1, 0),
+                                row(0, 1, 1, 0),
+                                row(1, 0, 1, 0),
+                                row(1, 1, 1, 0),
+                                row(1, 2, 1, 0)
+        );
+
+        // update rows that don't match the filter
+        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 2, 2, 0);
+        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 1, 2, 1);
+        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+                                row(0, 0, 1, 0),
+                                row(0, 1, 1, 0),
+                                row(1, 0, 1, 0),
+                                row(1, 1, 1, 0),
+                                row(1, 2, 1, 0)
+        );
+
+        // update a row that does match the filter
+        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 1, 1, 0);
+        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+                                row(0, 0, 1, 0),
+                                row(0, 1, 1, 0),
+                                row(1, 0, 1, 1),
+                                row(1, 1, 1, 0),
+                                row(1, 2, 1, 0)
+        );
+
+        // delete rows that don't match the filter
+        execute("DELETE FROM %s WHERE a = ? AND b = ?", 2, 0);
+        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+                                row(0, 0, 1, 0),
+                                row(0, 1, 1, 0),
+                                row(1, 0, 1, 1),
+                                row(1, 1, 1, 0),
+                                row(1, 2, 1, 0)
+        );
+
+        // delete a row that does match the filter
+        execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 2);
+        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+                                row(0, 0, 1, 0),
+                                row(0, 1, 1, 0),
+                                row(1, 0, 1, 1),
+                                row(1, 1, 1, 0)
+        );
+
+        // delete a partition that matches the filter
+        execute("DELETE FROM %s WHERE a = ?", 1);
+        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+                                row(0, 0, 1, 0),
+                                row(0, 1, 1, 0)
+        );
+
+        dropView("mv_test");
+        dropTable("DROP TABLE %s");
+    }
+
+    @Test
+    public void complexRestrictedTimestampUpdateTestWithFlush() throws Throwable
+    {
+        complexRestrictedTimestampUpdateTest(true);
+    }
+
+    @Test
+    public void complexRestrictedTimestampUpdateTestWithoutFlush() throws Throwable
+    {
+        complexRestrictedTimestampUpdateTest(false);
+    }
+
+    public void complexRestrictedTimestampUpdateTest(boolean flush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY (a, b))");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+        Keyspace ks = Keyspace.open(keyspace());
+
+        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (c, a, b)");
+        ks.getColumnFamilyStore("mv").disableAutoCompaction();
+
+        //Set initial values TS=0, matching the restriction and verify view
+        executeNet(version, "INSERT INTO %s (a, b, c, d) VALUES (0, 0, 1, 0) USING TIMESTAMP 0");
+        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
+
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        //update c's timestamp TS=2
+        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
+        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
+
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        //change c's value and TS=3, tombstones c=1 and adds c=0 record
+        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? and b = ? ", 0, 0, 0);
+        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 0, 0, 0));
+
+        if(flush)
+        {
+            ks.getColumnFamilyStore("mv").forceMajorCompaction();
+            FBUtilities.waitOnFutures(ks.flush());
+        }
+
+        //change c's value back to 1 with TS=4, check we can see d
+        executeNet(version, "UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
+        if (flush)
+        {
+            ks.getColumnFamilyStore("mv").forceMajorCompaction();
+            FBUtilities.waitOnFutures(ks.flush());
+        }
+
+        assertRows(execute("SELECT d, e from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, null));
+
+        //Add e value @ TS=1
+        executeNet(version, "UPDATE %s USING TIMESTAMP 1 SET e = ? WHERE a = ? and b = ? ", 1, 0, 0);
+        assertRows(execute("SELECT d, e from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, 1));
+
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        //Change d value @ TS=2
+        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET d = ? WHERE a = ? and b = ? ", 2, 0, 0);
+        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(2));
+
+        if (flush)
+            FBUtilities.waitOnFutures(ks.flush());
+
+        //Change d value @ TS=3
+        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? and b = ? ", 1, 0, 0);
+        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(1));
+
+        //Tombstone c
+        executeNet(version, "DELETE FROM %s WHERE a = ? and b = ?", 0, 0);
+        assertRowsIgnoringOrder(execute("SELECT d from mv"));
+        assertRows(execute("SELECT d from mv"));
+
+        //Add back without D
+        executeNet(version, "INSERT INTO %s (a, b, c) VALUES (0, 0, 1)");
+
+        //Make sure D doesn't pop back in.
+        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row((Object) null));
+
+        //New partition
+        // insert a row with timestamp 0
+        executeNet(version, "INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?) USING TIMESTAMP 0", 1, 0, 1, 0, 0);
+
+        // overwrite pk and e with timestamp 1, but don't overwrite d
+        executeNet(version, "INSERT INTO %s (a, b, c, e) VALUES (?, ?, ?, ?) USING TIMESTAMP 1", 1, 0, 1, 0);
+
+        // delete with timestamp 0 (which should only delete d)
+        executeNet(version, "DELETE FROM %s USING TIMESTAMP 0 WHERE a = ? AND b = ?", 1, 0);
+        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
+                   row(1, 0, 1, null, 0)
+        );
+
+        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? AND b = ?", 1, 1, 1);
+        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? AND b = ?", 1, 1, 0);
+        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
+                   row(1, 0, 1, null, 0)
+        );
+
+        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? AND b = ?", 0, 1, 0);
+        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
+                   row(1, 0, 1, 0, 0)
+        );
+    }
+
+    @Test
+    public void testRestrictedRegularColumnTimestampUpdates() throws Throwable
+    {
+        // Regression test for CASSANDRA-10910
+
+        createTable("CREATE TABLE %s (" +
+                    "k int PRIMARY KEY, " +
+                    "c int, " +
+                    "val int)");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+
+        createView("mv_rctstest", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (k,c)");
+
+        updateView("UPDATE %s SET c = ?, val = ? WHERE k = ?", 0, 0, 0);
+        updateView("UPDATE %s SET val = ? WHERE k = ?", 1, 0);
+        updateView("UPDATE %s SET c = ? WHERE k = ?", 1, 0);
+        assertRows(execute("SELECT c, k, val FROM mv_rctstest"), row(1, 0, 1));
+
+        updateView("TRUNCATE %s");
+
+        updateView("UPDATE %s USING TIMESTAMP 1 SET c = ?, val = ? WHERE k = ?", 0, 0, 0);
+        updateView("UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE k = ?", 1, 0);
+        updateView("UPDATE %s USING TIMESTAMP 2 SET val = ? WHERE k = ?", 1, 0);
+        updateView("UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE k = ?", 1, 0);
+        updateView("UPDATE %s USING TIMESTAMP 3 SET val = ? WHERE k = ?", 2, 0);
+        assertRows(execute("SELECT c, k, val FROM mv_rctstest"), row(1, 0, 2));
+    }
+
+    @Test
+    public void testOldTimestampsWithRestrictions() throws Throwable
+    {
+        createTable("CREATE TABLE %s (" +
+                    "k int, " +
+                    "c int, " +
+                    "val text, " + "" +
+                    "PRIMARY KEY(k, c))");
+
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+
+        createView("mv_tstest", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL AND val = 'baz' PRIMARY KEY (val,k,c)");
+
+        for (int i = 0; i < 100; i++)
+            updateView("INSERT into %s (k,c,val)VALUES(?,?,?)", 0, i % 2, "baz");
+
+        Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush();
+
+        Assert.assertEquals(2, execute("select * from %s").size());
+        Assert.assertEquals(2, execute("select * from mv_tstest").size());
+
+        assertRows(execute("SELECT val from %s where k = 0 and c = 0"), row("baz"));
+        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0), row(1));
+
+        //Make sure an old TS does nothing
+        updateView("UPDATE %s USING TIMESTAMP 100 SET val = ? where k = ? AND c = ?", "bar", 0, 1);
+        assertRows(execute("SELECT val from %s where k = 0 and c = 1"), row("baz"));
+        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0), row(1));
+        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "bar"));
+
+        //Latest TS
+        updateView("UPDATE %s SET val = ? where k = ? AND c = ?", "bar", 0, 1);
+        assertRows(execute("SELECT val from %s where k = 0 and c = 1"), row("bar"));
+        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "bar"));
+        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering1Test.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering1Test.java
index 6d4e487..841eb91 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering1Test.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering1Test.java
@@ -18,77 +18,27 @@
 
 package org.apache.cassandra.cql3;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.transport.ProtocolVersion;
 
-/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes
  * - ViewFilteringPKTest
  * - ViewFilteringClustering1Test
  * - ViewFilteringClustering2Test
  * - ViewFilteringTest
+ * - ...
+ * - ViewFiltering*Test
  */
 @RunWith(Parameterized.class)
-public class ViewFilteringClustering1Test extends CQLTester
+public class ViewFilteringClustering1Test extends ViewFilteringTester
 {
-    @Parameterized.Parameter
-    public ProtocolVersion version;
-
-    @Parameterized.Parameters()
-    public static Collection<Object[]> versions()
-    {
-        return ViewFilteringTest.versions();
-    }
-
-    private final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    public static void startup()
-    {
-        ViewFilteringTest.startup();
-    }
-
-    @AfterClass
-    public static void tearDown()
-    {
-        ViewFilteringTest.tearDown();
-    }
-
-    @Before
-    public void begin()
-    {
-        ViewFilteringTest.beginSetup(views);
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        ViewFilteringTest.endSetup(views, version, this);
-    }
-
-    private void createView(String name, String query) throws Throwable
-    {
-        ViewFilteringTest.createView(name, query, views, version, this);
-    }
-
-    private void dropView(String name) throws Throwable
-    {
-        ViewFilteringTest.dropView(name, views, version, this);
-    }
-
     @Test
     public void testClusteringKeyEQRestrictions() throws Throwable
     {
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java
index d1ba842..219a807 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java
@@ -18,77 +18,27 @@
 
 package org.apache.cassandra.cql3;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.transport.ProtocolVersion;
 
-/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes
  * - ViewFilteringPKTest
  * - ViewFilteringClustering1Test
  * - ViewFilteringClustering2Test
  * - ViewFilteringTest
+ * - ...
+ * - ViewFiltering*Test
  */
 @RunWith(Parameterized.class)
-public class ViewFilteringClustering2Test extends CQLTester
+public class ViewFilteringClustering2Test extends ViewFilteringTester
 {
-    @Parameterized.Parameter
-    public ProtocolVersion version;
-
-    @Parameterized.Parameters()
-    public static Collection<Object[]> versions()
-    {
-        return ViewFilteringTest.versions();
-    }
-
-    private final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    public static void startup()
-    {
-        ViewFilteringTest.startup();
-    }
-
-    @AfterClass
-    public static void tearDown()
-    {
-        ViewFilteringTest.tearDown();
-    }
-
-    @Before
-    public void begin()
-    {
-        ViewFilteringTest.beginSetup(views);
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        ViewFilteringTest.endSetup(views, version, this);
-    }
-
-    private void createView(String name, String query) throws Throwable
-    {
-        ViewFilteringTest.createView(name, query, views, version, this);
-    }
-
-    private void dropView(String name) throws Throwable
-    {
-        ViewFilteringTest.dropView(name, views, version, this);
-    }
-
     @Test
     public void testClusteringKeyMultiColumnRestrictions() throws Throwable
     {
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringComplexPKTest.java
similarity index 66%
copy from test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java
copy to test/unit/org/apache/cassandra/cql3/ViewFilteringComplexPKTest.java
index d1ba842..da089ca 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringComplexPKTest.java
@@ -18,84 +18,34 @@
 
 package org.apache.cassandra.cql3;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.transport.ProtocolVersion;
 
-/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes
  * - ViewFilteringPKTest
  * - ViewFilteringClustering1Test
  * - ViewFilteringClustering2Test
  * - ViewFilteringTest
+ * - ...
+ * - ViewFiltering*Test
  */
 @RunWith(Parameterized.class)
-public class ViewFilteringClustering2Test extends CQLTester
+public class ViewFilteringComplexPKTest extends ViewFilteringTester
 {
-    @Parameterized.Parameter
-    public ProtocolVersion version;
-
-    @Parameterized.Parameters()
-    public static Collection<Object[]> versions()
-    {
-        return ViewFilteringTest.versions();
-    }
-
-    private final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    public static void startup()
-    {
-        ViewFilteringTest.startup();
-    }
-
-    @AfterClass
-    public static void tearDown()
-    {
-        ViewFilteringTest.tearDown();
-    }
-
-    @Before
-    public void begin()
-    {
-        ViewFilteringTest.beginSetup(views);
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        ViewFilteringTest.endSetup(views, version, this);
-    }
-
-    private void createView(String name, String query) throws Throwable
-    {
-        ViewFilteringTest.createView(name, query, views, version, this);
-    }
-
-    private void dropView(String name) throws Throwable
-    {
-        ViewFilteringTest.dropView(name, views, version, this);
-    }
-
     @Test
-    public void testClusteringKeyMultiColumnRestrictions() throws Throwable
+    public void testCompoundPartitionKeyRestrictions() throws Throwable
     {
         List<String> mvPrimaryKeys = Arrays.asList("((a, b), c)", "((b, a), c)", "(a, b, c)", "(c, b, a)", "((c, a), b)");
         for (int i = 0; i < mvPrimaryKeys.size(); i++)
         {
-            createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
+            createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))");
 
             execute("USE " + keyspace());
             executeNet(version, "USE " + keyspace());
@@ -106,32 +56,27 @@ public class ViewFilteringClustering2Test extends CQLTester
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, -1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
 
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
-            // only accept rows where b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND (b, c) >= (1, 0) PRIMARY KEY " + mvPrimaryKeys.get(i));
+            // only accept rows where a = 1 and b = 1
+            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
 
             while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
                 Thread.sleep(10);
 
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0)
             );
 
             // insert new rows that do not match the filter
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, -1, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, -1, 0);
+            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
+            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 0, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0)
             );
@@ -139,20 +84,16 @@ public class ViewFilteringClustering2Test extends CQLTester
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0)
             );
 
             // update rows that don't match the filter
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, -1, 0);
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, -1, 0);
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, 0, 0);
+            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
+            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 0, 0);
+            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0)
@@ -161,21 +102,17 @@ public class ViewFilteringClustering2Test extends CQLTester
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0)
             );
 
             // delete rows that don't match the filter
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, -1);
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, -1, 0);
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 0);
+            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
+            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 0, 0);
+            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0)
@@ -184,26 +121,103 @@ public class ViewFilteringClustering2Test extends CQLTester
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0)
             );
 
             // delete a partition that matches the filter
-            execute("DELETE FROM %s WHERE a = ?", 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0)
-            );
-
-            dropView("mv_test" + i);
-            dropTable("DROP TABLE %s");
+            execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 1);
+            assertEmpty(execute("SELECT * FROM mv_test" + i));
         }
     }
 
     @Test
-    public void testClusteringKeyFilteringRestrictions() throws Throwable
+    public void testCompoundPartitionKeyRestrictionsNotIncludeAll() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))");
+        execute("USE " + keyspace());
+        executeNet(version, "USE " + keyspace());
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 1, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
+
+        // only accept rows where a = 1 and b = 1, don't include column d in the selection
+        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c FROM %%s WHERE a = 1 AND b = 1 AND c IS NOT NULL PRIMARY KEY ((a, b), c)");
+
+        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
+            Thread.sleep(10);
+
+        assertRows(execute("SELECT * FROM mv_test"),
+                   row(1, 1, 0),
+                   row(1, 1, 1)
+        );
+
+        // insert new rows that do not match the filter
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 0, 0);
+        assertRows(execute("SELECT * FROM mv_test"),
+                   row(1, 1, 0),
+                   row(1, 1, 1)
+        );
+
+        // insert new row that does match the filter
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
+        assertRows(execute("SELECT * FROM mv_test"),
+                   row(1, 1, 0),
+                   row(1, 1, 1),
+                   row(1, 1, 2)
+        );
+
+        // update rows that don't match the filter
+        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
+        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 0, 0);
+        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
+        assertRows(execute("SELECT * FROM mv_test"),
+                   row(1, 1, 0),
+                   row(1, 1, 1),
+                   row(1, 1, 2)
+        );
+
+        // update a row that does match the filter
+        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
+        assertRows(execute("SELECT * FROM mv_test"),
+                   row(1, 1, 0),
+                   row(1, 1, 1),
+                   row(1, 1, 2)
+        );
+
+        // delete rows that don't match the filter
+        execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
+        execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 0, 0);
+        execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
+        execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
+        assertRows(execute("SELECT * FROM mv_test"),
+                   row(1, 1, 0),
+                   row(1, 1, 1),
+                   row(1, 1, 2)
+        );
+
+        // delete a row that does match the filter
+        execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
+        assertRows(execute("SELECT * FROM mv_test"),
+                   row(1, 1, 1),
+                   row(1, 1, 2)
+        );
+
+        // delete a partition that matches the filter
+        execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 1);
+        assertEmpty(execute("SELECT * FROM mv_test"));
+    }
+
+    @Test
+    public void testPartitionKeyAndClusteringKeyFilteringRestrictions() throws Throwable
     {
         List<String> mvPrimaryKeys = Arrays.asList("((a, b), c)", "((b, a), c)", "(a, b, c)", "(c, b, a)", "((c, a), b)");
         for (int i = 0; i < mvPrimaryKeys.size(); i++)
@@ -226,24 +240,20 @@ public class ViewFilteringClustering2Test extends CQLTester
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c = 1 PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b IS NOT NULL AND c = 1 PRIMARY KEY " + mvPrimaryKeys.get(i));
 
             while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
                 Thread.sleep(10);
 
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0)
             );
 
             // insert new rows that do not match the filter
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, -1, 0);
+            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
+            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0)
             );
@@ -251,8 +261,6 @@ public class ViewFilteringClustering2Test extends CQLTester
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 1, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0),
                                     row(1, 2, 1, 0)
@@ -260,10 +268,8 @@ public class ViewFilteringClustering2Test extends CQLTester
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, -1, 0);
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, 0, 0);
+            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 0, 1, 1, 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0),
                                     row(1, 2, 1, 0)
@@ -272,8 +278,6 @@ public class ViewFilteringClustering2Test extends CQLTester
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 2, 1, 1, 1);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 2),
                                     row(1, 2, 1, 0)
@@ -281,12 +285,9 @@ public class ViewFilteringClustering2Test extends CQLTester
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, -1);
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, -1, 0);
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 0);
-            execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, -1);
+            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 1);
+            execute("DELETE FROM %s WHERE a = ?", 0);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 2),
                                     row(1, 2, 1, 0)
@@ -295,32 +296,13 @@ public class ViewFilteringClustering2Test extends CQLTester
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 1);
             assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 2, 1, 0)
             );
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ?", 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0)
-            );
-
-            // insert a partition with one matching and one non-matching row using a batch (CASSANDRA-10614)
-            String tableName = KEYSPACE + "." + currentTable();
-            execute("BEGIN BATCH " +
-                    "INSERT INTO " + tableName + " (a, b, c, d) VALUES (?, ?, ?, ?); " +
-                    "INSERT INTO " + tableName + " (a, b, c, d) VALUES (?, ?, ?, ?); " +
-                    "APPLY BATCH",
-                    4, 4, 0, 0,
-                    4, 4, 1, 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0),
-                                    row(4, 4, 1, 1)
-            );
+            assertEmpty(execute("SELECT a, b, c, d FROM mv_test" + i));
 
             dropView("mv_test" + i);
             dropTable("DROP TABLE %s");
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringPKTest.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringSimplePKTest.java
similarity index 52%
rename from test/unit/org/apache/cassandra/cql3/ViewFilteringPKTest.java
rename to test/unit/org/apache/cassandra/cql3/ViewFilteringSimplePKTest.java
index 09d220d..d3b3e4a 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringPKTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringSimplePKTest.java
@@ -18,77 +18,27 @@
 
 package org.apache.cassandra.cql3;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.transport.ProtocolVersion;
 
-/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes
  * - ViewFilteringPKTest
  * - ViewFilteringClustering1Test
  * - ViewFilteringClustering2Test
  * - ViewFilteringTest
+ * - ...
+ * - ViewFiltering*Test
  */
 @RunWith(Parameterized.class)
-public class ViewFilteringPKTest extends CQLTester
+public class ViewFilteringSimplePKTest extends ViewFilteringTester
 {
-    @Parameterized.Parameter
-    public ProtocolVersion version;
-
-    @Parameterized.Parameters()
-    public static Collection<Object[]> versions()
-    {
-        return ViewFilteringTest.versions();
-    }
-
-    private final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    public static void startup()
-    {
-        ViewFilteringTest.startup();
-    }
-
-    @AfterClass
-    public static void tearDown()
-    {
-        ViewFilteringTest.tearDown();
-    }
-
-    @Before
-    public void begin()
-    {
-        ViewFilteringTest.beginSetup(views);
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        ViewFilteringTest.endSetup(views, version, this);
-    }
-
-    private void createView(String name, String query) throws Throwable
-    {
-        ViewFilteringTest.createView(name, query, views, version, this);
-    }
-
-    private void dropView(String name) throws Throwable
-    {
-        ViewFilteringTest.dropView(name, views, version, this);
-    }
-
     @Test
     public void testPartitionKeyFilteringUnrestrictedPart() throws Throwable
     {
@@ -384,274 +334,4 @@ public class ViewFilteringPKTest extends CQLTester
             assertEmpty(execute("SELECT * FROM mv_test" + i));
         }
     }
-
-    @Test
-    public void testCompoundPartitionKeyRestrictions() throws Throwable
-    {
-        List<String> mvPrimaryKeys = Arrays.asList("((a, b), c)", "((b, a), c)", "(a, b, c)", "(c, b, a)", "((c, a), b)");
-        for (int i = 0; i < mvPrimaryKeys.size(); i++)
-        {
-            createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))");
-
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
-
-            logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
-
-            // only accept rows where a = 1 and b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
-
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
-
-            // insert new rows that do not match the filter
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
-
-            // insert new row that does match the filter
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
-
-            // update rows that don't match the filter
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 0, 0);
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
-
-            // update a row that does match the filter
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 1, 0, 1),
-                                    row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
-
-            // delete rows that don't match the filter
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 0, 0);
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
-            execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 1, 0, 1),
-                                    row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
-
-            // delete a row that does match the filter
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
-
-            // delete a partition that matches the filter
-            execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 1);
-            assertEmpty(execute("SELECT * FROM mv_test" + i));
-        }
-    }
-
-    @Test
-    public void testCompoundPartitionKeyRestrictionsNotIncludeAll() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))");
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 1, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
-
-        // only accept rows where a = 1 and b = 1, don't include column d in the selection
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c FROM %%s WHERE a = 1 AND b = 1 AND c IS NOT NULL PRIMARY KEY ((a, b), c)");
-
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
-            Thread.sleep(10);
-
-        assertRows(execute("SELECT * FROM mv_test"),
-                   row(1, 1, 0),
-                   row(1, 1, 1)
-        );
-
-        // insert new rows that do not match the filter
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 0, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
-                   row(1, 1, 0),
-                   row(1, 1, 1)
-        );
-
-        // insert new row that does match the filter
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
-                   row(1, 1, 0),
-                   row(1, 1, 1),
-                   row(1, 1, 2)
-        );
-
-        // update rows that don't match the filter
-        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
-        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 0, 0);
-        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
-                   row(1, 1, 0),
-                   row(1, 1, 1),
-                   row(1, 1, 2)
-        );
-
-        // update a row that does match the filter
-        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
-                   row(1, 1, 0),
-                   row(1, 1, 1),
-                   row(1, 1, 2)
-        );
-
-        // delete rows that don't match the filter
-        execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
-        execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 0, 0);
-        execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
-        execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
-                   row(1, 1, 0),
-                   row(1, 1, 1),
-                   row(1, 1, 2)
-        );
-
-        // delete a row that does match the filter
-        execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
-                   row(1, 1, 1),
-                   row(1, 1, 2)
-        );
-
-        // delete a partition that matches the filter
-        execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 1);
-        assertEmpty(execute("SELECT * FROM mv_test"));
-    }
-
-    @Test
-    public void testPartitionKeyAndClusteringKeyFilteringRestrictions() throws Throwable
-    {
-        List<String> mvPrimaryKeys = Arrays.asList("((a, b), c)", "((b, a), c)", "(a, b, c)", "(c, b, a)", "((c, a), b)");
-        for (int i = 0; i < mvPrimaryKeys.size(); i++)
-        {
-            createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
-
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, -1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
-
-            logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
-
-            // only accept rows where b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b IS NOT NULL AND c = 1 PRIMARY KEY " + mvPrimaryKeys.get(i));
-
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 0, 1, 0),
-                                    row(1, 1, 1, 0)
-            );
-
-            // insert new rows that do not match the filter
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 0, 1, 0),
-                                    row(1, 1, 1, 0)
-            );
-
-            // insert new row that does match the filter
-            execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 0, 1, 0),
-                                    row(1, 1, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
-
-            // update rows that don't match the filter
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, -1, 0);
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 0, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 0, 1, 0),
-                                    row(1, 1, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
-
-            // update a row that does match the filter
-            execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 2, 1, 1, 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 0, 1, 0),
-                                    row(1, 1, 1, 2),
-                                    row(1, 2, 1, 0)
-            );
-
-            // delete rows that don't match the filter
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, -1);
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 1);
-            execute("DELETE FROM %s WHERE a = ?", 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 0, 1, 0),
-                                    row(1, 1, 1, 2),
-                                    row(1, 2, 1, 0)
-            );
-
-            // delete a row that does match the filter
-            execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
-                                    row(1, 0, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
-
-            // delete a partition that matches the filter
-            execute("DELETE FROM %s WHERE a = ?", 1);
-            assertEmpty(execute("SELECT a, b, c, d FROM mv_test" + i));
-
-            dropView("mv_test" + i);
-            dropTable("DROP TABLE %s");
-        }
-    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
index 374f79f..ed2d140 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
@@ -18,137 +18,32 @@
 
 package org.apache.cassandra.cql3;
 
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.Arrays;
+import java.util.List;
 
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
+import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
-
-import com.datastax.driver.core.exceptions.InvalidQueryException;
-import org.junit.Assert;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
-import com.datastax.driver.core.exceptions.OperationTimedOutException;
-import org.apache.cassandra.concurrent.SEPExecutor;
-import org.apache.cassandra.concurrent.Stage;
+import com.datastax.driver.core.exceptions.InvalidQueryException;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.FBUtilities;
 
-/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewFilteringTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670, CASSANDRA-17167)
  * Any changes here check if they apply to the other classes
  * - ViewFilteringPKTest
  * - ViewFilteringClustering1Test
  * - ViewFilteringClustering2Test
  * - ViewFilteringTest
+ * - ...
+ * - ViewFiltering*Test
  */
 @RunWith(Parameterized.class)
-public class ViewFilteringTest extends CQLTester
+public class ViewFilteringTest extends ViewFilteringTester
 {
-    @Parameterized.Parameter
-    public ProtocolVersion version;
-
-    @Parameterized.Parameters()
-    public static Collection<Object[]> versions()
-    {
-        return ProtocolVersion.SUPPORTED.stream()
-                                        .map(v -> new Object[]{v})
-                                        .collect(Collectors.toList());
-    }
-
-    private final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    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()
-    {
-        beginSetup(views);
-    }
-
-    public static void beginSetup(List<String> views)
-    {
-        views.clear();
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        endSetup(views, version, this);
-    }
-
-    public static void endSetup(List<String> views, ProtocolVersion version, CQLTester tester) throws Throwable
-    {
-        for (String viewName : views)
-            tester.executeNet(version, "DROP MATERIALIZED VIEW " + viewName);
-    }
-
-    private void createView(String name, String query) throws Throwable
-    {
-        createView(name, query, views, version, this);
-    }
-
-    public static void createView(String name, String query, List<String> views, ProtocolVersion version, CQLTester tester) throws Throwable
-    {
-        try
-        {
-            tester.executeNet(version, String.format(query, name));
-            // If exception is thrown, the view will not be added to the list; since it shouldn't have been created, this is
-            // the desired behavior
-            views.add(name);
-        }
-        catch (OperationTimedOutException ex)
-        {
-            // ... except for timeout, when we actually do not know whether the view was created or not
-            views.add(name);
-            throw ex;
-        }
-    }
-
-    private void updateView(String query, Object... params) throws Throwable
-    {
-        executeNet(version, query, params);
-        while (!(((SEPExecutor) Stage.VIEW_MUTATION.executor()).getPendingTaskCount() == 0
-                 && ((SEPExecutor) Stage.VIEW_MUTATION.executor()).getActiveTaskCount() == 0))
-        {
-            Thread.sleep(1);
-        }
-    }
-
-    private void dropView(String name) throws Throwable
-    {
-        dropView(name, views, version, this);
-    }
-
-    public static void dropView(String name, List<String> views, ProtocolVersion version, CQLTester tester) throws Throwable
-    {
-        tester.executeNet(version, "DROP MATERIALIZED VIEW " + name);
-        views.remove(name);
-    }
-
-    public static void waitForView(String keyspace, String view) throws InterruptedException
-    {
-        while (!SystemKeyspace.isViewBuilt(keyspace, view))
-            Thread.sleep(10);
-    }
-
     // TODO will revise the non-pk filter condition in MV, see CASSANDRA-11500
     @Ignore
     @Test
@@ -631,415 +526,4 @@ public class ViewFilteringTest extends CQLTester
                    row(1, 1, 3)
         );
     } 
-
-    @Test
-    public void testAllTypes() throws Throwable
-    {
-        String myType = createType("CREATE TYPE %s (a int, b uuid, c set<text>)");
-        String columnNames = "asciival, " +
-                             "bigintval, " +
-                             "blobval, " +
-                             "booleanval, " +
-                             "dateval, " +
-                             "decimalval, " +
-                             "doubleval, " +
-                             "floatval, " +
-                             "inetval, " +
-                             "intval, " +
-                             "textval, " +
-                             "timeval, " +
-                             "timestampval, " +
-                             "timeuuidval, " +
-                             "uuidval," +
-                             "varcharval, " +
-                             "varintval, " +
-                             "frozenlistval, " +
-                             "frozensetval, " +
-                             "frozenmapval, " +
-                             "tupleval, " +
-                             "udtval";
-
-        createTable(
-        "CREATE TABLE %s (" +
-        "asciival ascii, " +
-        "bigintval bigint, " +
-        "blobval blob, " +
-        "booleanval boolean, " +
-        "dateval date, " +
-        "decimalval decimal, " +
-        "doubleval double, " +
-        "floatval float, " +
-        "inetval inet, " +
-        "intval int, " +
-        "textval text, " +
-        "timeval time, " +
-        "timestampval timestamp, " +
-        "timeuuidval timeuuid, " +
-        "uuidval uuid," +
-        "varcharval varchar, " +
-        "varintval varint, " +
-        "frozenlistval frozen<list<int>>, " +
-        "frozensetval frozen<set<uuid>>, " +
-        "frozenmapval frozen<map<ascii, int>>," +
-        "tupleval frozen<tuple<int, ascii, uuid>>," +
-        "udtval frozen<" + myType + ">, " +
-        "PRIMARY KEY (" + columnNames + "))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView(
-        "mv_test",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " +
-        "asciival = 'abc' AND " +
-        "bigintval = 123 AND " +
-        "blobval = 0xfeed AND " +
-        "booleanval = true AND " +
-        "dateval = '1987-03-23' AND " +
-        "decimalval = 123.123 AND " +
-        "doubleval = 123.123 AND " +
-        "floatval = 123.123 AND " +
-        "inetval = '127.0.0.1' AND " +
-        "intval = 123 AND " +
-        "textval = 'abc' AND " +
-        "timeval = '07:35:07.000111222' AND " +
-        "timestampval = 123123123 AND " +
-        "timeuuidval = 6BDDC89A-5644-11E4-97FC-56847AFE9799 AND " +
-        "uuidval = 6BDDC89A-5644-11E4-97FC-56847AFE9799 AND " +
-        "varcharval = 'abc' AND " +
-        "varintval = 123123123 AND " +
-        "frozenlistval = [1, 2, 3] AND " +
-        "frozensetval = {6BDDC89A-5644-11E4-97FC-56847AFE9799} AND " +
-        "frozenmapval = {'a': 1, 'b': 2} AND " +
-        "tupleval = (1, 'foobar', 6BDDC89A-5644-11E4-97FC-56847AFE9799) AND " +
-        "udtval = {a: 1, b: 6BDDC89A-5644-11E4-97FC-56847AFE9799, c: {'foo', 'bar'}} " +
-        "PRIMARY KEY (" + columnNames + ")");
-
-        execute("INSERT INTO %s (" + columnNames + ") VALUES (" +
-                "'abc'," +
-                "123," +
-                "0xfeed," +
-                "true," +
-                "'1987-03-23'," +
-                "123.123," +
-                "123.123," +
-                "123.123," +
-                "'127.0.0.1'," +
-                "123," +
-                "'abc'," +
-                "'07:35:07.000111222'," +
-                "123123123," +
-                "6BDDC89A-5644-11E4-97FC-56847AFE9799," +
-                "6BDDC89A-5644-11E4-97FC-56847AFE9799," +
-                "'abc'," +
-                "123123123," +
-                "[1, 2, 3]," +
-                "{6BDDC89A-5644-11E4-97FC-56847AFE9799}," +
-                "{'a': 1, 'b': 2}," +
-                "(1, 'foobar', 6BDDC89A-5644-11E4-97FC-56847AFE9799)," +
-                "{a: 1, b: 6BDDC89A-5644-11E4-97FC-56847AFE9799, c: {'foo', 'bar'}})");
-
-        assert !execute("SELECT * FROM mv_test").isEmpty();
-
-        executeNet(version, "ALTER TABLE %s RENAME inetval TO foo");
-        assert !execute("SELECT * FROM mv_test").isEmpty();
-    }
-
-    @Test
-    public void testMVCreationWithNonPrimaryRestrictions() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        try {
-            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d = 1 PRIMARY KEY (a, b, c)");
-            dropView("mv_test");
-        } catch(Exception e) {
-            throw new RuntimeException("MV creation with non primary column restrictions failed.", e);
-        }
-
-        dropTable("DROP TABLE %s");
-    }
-
-    @Test
-    public void testNonPrimaryRestrictions() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 1, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
-
-        // only accept rows where c = 1
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (a, b, c)");
-
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
-            Thread.sleep(10);
-
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
-                                row(0, 0, 1, 0),
-                                row(0, 1, 1, 0),
-                                row(1, 0, 1, 0),
-                                row(1, 1, 1, 0)
-        );
-
-        // insert new rows that do not match the filter
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 2, 0);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
-                                row(0, 0, 1, 0),
-                                row(0, 1, 1, 0),
-                                row(1, 0, 1, 0),
-                                row(1, 1, 1, 0)
-        );
-
-        // insert new row that does match the filter
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 1, 0);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
-                                row(0, 0, 1, 0),
-                                row(0, 1, 1, 0),
-                                row(1, 0, 1, 0),
-                                row(1, 1, 1, 0),
-                                row(1, 2, 1, 0)
-        );
-
-        // update rows that don't match the filter
-        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 2, 2, 0);
-        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 1, 2, 1);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
-                                row(0, 0, 1, 0),
-                                row(0, 1, 1, 0),
-                                row(1, 0, 1, 0),
-                                row(1, 1, 1, 0),
-                                row(1, 2, 1, 0)
-        );
-
-        // update a row that does match the filter
-        execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 1, 1, 0);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
-                                row(0, 0, 1, 0),
-                                row(0, 1, 1, 0),
-                                row(1, 0, 1, 1),
-                                row(1, 1, 1, 0),
-                                row(1, 2, 1, 0)
-        );
-
-        // delete rows that don't match the filter
-        execute("DELETE FROM %s WHERE a = ? AND b = ?", 2, 0);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
-                                row(0, 0, 1, 0),
-                                row(0, 1, 1, 0),
-                                row(1, 0, 1, 1),
-                                row(1, 1, 1, 0),
-                                row(1, 2, 1, 0)
-        );
-
-        // delete a row that does match the filter
-        execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 2);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
-                                row(0, 0, 1, 0),
-                                row(0, 1, 1, 0),
-                                row(1, 0, 1, 1),
-                                row(1, 1, 1, 0)
-        );
-
-        // delete a partition that matches the filter
-        execute("DELETE FROM %s WHERE a = ?", 1);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
-                                row(0, 0, 1, 0),
-                                row(0, 1, 1, 0)
-        );
-
-        dropView("mv_test");
-        dropTable("DROP TABLE %s");
-    }
-
-    @Test
-    public void complexRestrictedTimestampUpdateTestWithFlush() throws Throwable
-    {
-        complexRestrictedTimestampUpdateTest(true);
-    }
-
-    @Test
-    public void complexRestrictedTimestampUpdateTestWithoutFlush() throws Throwable
-    {
-        complexRestrictedTimestampUpdateTest(false);
-    }
-
-    public void complexRestrictedTimestampUpdateTest(boolean flush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY (a, b))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-        Keyspace ks = Keyspace.open(keyspace());
-
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (c, a, b)");
-        ks.getColumnFamilyStore("mv").disableAutoCompaction();
-
-        //Set initial values TS=0, matching the restriction and verify view
-        executeNet(version, "INSERT INTO %s (a, b, c, d) VALUES (0, 0, 1, 0) USING TIMESTAMP 0");
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
-
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        //update c's timestamp TS=2
-        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
-
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        //change c's value and TS=3, tombstones c=1 and adds c=0 record
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? and b = ? ", 0, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 0, 0, 0));
-
-        if(flush)
-        {
-            ks.getColumnFamilyStore("mv").forceMajorCompaction();
-            FBUtilities.waitOnFutures(ks.flush());
-        }
-
-        //change c's value back to 1 with TS=4, check we can see d
-        executeNet(version, "UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        if (flush)
-        {
-            ks.getColumnFamilyStore("mv").forceMajorCompaction();
-            FBUtilities.waitOnFutures(ks.flush());
-        }
-
-        assertRows(execute("SELECT d, e from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, null));
-
-        //Add e value @ TS=1
-        executeNet(version, "UPDATE %s USING TIMESTAMP 1 SET e = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d, e from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, 1));
-
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        //Change d value @ TS=2
-        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET d = ? WHERE a = ? and b = ? ", 2, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(2));
-
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        //Change d value @ TS=3
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(1));
-
-        //Tombstone c
-        executeNet(version, "DELETE FROM %s WHERE a = ? and b = ?", 0, 0);
-        assertRowsIgnoringOrder(execute("SELECT d from mv"));
-        assertRows(execute("SELECT d from mv"));
-
-        //Add back without D
-        executeNet(version, "INSERT INTO %s (a, b, c) VALUES (0, 0, 1)");
-
-        //Make sure D doesn't pop back in.
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row((Object) null));
-
-        //New partition
-        // insert a row with timestamp 0
-        executeNet(version, "INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?) USING TIMESTAMP 0", 1, 0, 1, 0, 0);
-
-        // overwrite pk and e with timestamp 1, but don't overwrite d
-        executeNet(version, "INSERT INTO %s (a, b, c, e) VALUES (?, ?, ?, ?) USING TIMESTAMP 1", 1, 0, 1, 0);
-
-        // delete with timestamp 0 (which should only delete d)
-        executeNet(version, "DELETE FROM %s USING TIMESTAMP 0 WHERE a = ? AND b = ?", 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
-                   row(1, 0, 1, null, 0)
-        );
-
-        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? AND b = ?", 1, 1, 1);
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? AND b = ?", 1, 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
-                   row(1, 0, 1, null, 0)
-        );
-
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? AND b = ?", 0, 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
-                   row(1, 0, 1, 0, 0)
-        );
-    }
-
-    @Test
-    public void testRestrictedRegularColumnTimestampUpdates() throws Throwable
-    {
-        // Regression test for CASSANDRA-10910
-
-        createTable("CREATE TABLE %s (" +
-                    "k int PRIMARY KEY, " +
-                    "c int, " +
-                    "val int)");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv_rctstest", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (k,c)");
-
-        updateView("UPDATE %s SET c = ?, val = ? WHERE k = ?", 0, 0, 0);
-        updateView("UPDATE %s SET val = ? WHERE k = ?", 1, 0);
-        updateView("UPDATE %s SET c = ? WHERE k = ?", 1, 0);
-        assertRows(execute("SELECT c, k, val FROM mv_rctstest"), row(1, 0, 1));
-
-        updateView("TRUNCATE %s");
-
-        updateView("UPDATE %s USING TIMESTAMP 1 SET c = ?, val = ? WHERE k = ?", 0, 0, 0);
-        updateView("UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE k = ?", 1, 0);
-        updateView("UPDATE %s USING TIMESTAMP 2 SET val = ? WHERE k = ?", 1, 0);
-        updateView("UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE k = ?", 1, 0);
-        updateView("UPDATE %s USING TIMESTAMP 3 SET val = ? WHERE k = ?", 2, 0);
-        assertRows(execute("SELECT c, k, val FROM mv_rctstest"), row(1, 0, 2));
-    }
-
-    @Test
-    public void testOldTimestampsWithRestrictions() throws Throwable
-    {
-        createTable("CREATE TABLE %s (" +
-                    "k int, " +
-                    "c int, " +
-                    "val text, " + "" +
-                    "PRIMARY KEY(k, c))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv_tstest", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL AND val = 'baz' PRIMARY KEY (val,k,c)");
-
-        for (int i = 0; i < 100; i++)
-            updateView("INSERT into %s (k,c,val)VALUES(?,?,?)", 0, i % 2, "baz");
-
-        Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush();
-
-        Assert.assertEquals(2, execute("select * from %s").size());
-        Assert.assertEquals(2, execute("select * from mv_tstest").size());
-
-        assertRows(execute("SELECT val from %s where k = 0 and c = 0"), row("baz"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0), row(1));
-
-        //Make sure an old TS does nothing
-        updateView("UPDATE %s USING TIMESTAMP 100 SET val = ? where k = ? AND c = ?", "bar", 0, 1);
-        assertRows(execute("SELECT val from %s where k = 0 and c = 1"), row("baz"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0), row(1));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "bar"));
-
-        //Latest TS
-        updateView("UPDATE %s SET val = ? where k = ? AND c = ?", "bar", 0, 1);
-        assertRows(execute("SELECT val from %s where k = 0 and c = 1"), row("bar"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "bar"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0));
-    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringTester.java
similarity index 79%
copy from test/unit/org/apache/cassandra/cql3/ViewComplexTester.java
copy to test/unit/org/apache/cassandra/cql3/ViewFilteringTester.java
index a934649..782a241 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringTester.java
@@ -21,10 +21,10 @@ package org.apache.cassandra.cql3;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
 
 import org.junit.After;
+import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.runner.RunWith;
@@ -32,7 +32,7 @@ import org.junit.runners.Parameterized;
 
 import com.datastax.driver.core.exceptions.OperationTimedOutException;
 import org.apache.cassandra.concurrent.Stage;
-import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.transport.ProtocolVersion;
 
 /* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
@@ -42,12 +42,12 @@ import org.apache.cassandra.transport.ProtocolVersion;
  * - ViewComplexTTLTest
  * - ViewComplexTest
  * - ViewComplexLivenessTest
+ * - ...
+ * - ViewComplex*Test
  */
 @RunWith(Parameterized.class)
-public abstract class ViewComplexTester extends CQLTester
+public abstract class ViewFilteringTester extends CQLTester
 {
-    private static final AtomicInteger seqNumber = new AtomicInteger();
-
     @Parameterized.Parameter
     public ProtocolVersion version;
 
@@ -65,10 +65,17 @@ public abstract class ViewComplexTester 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() throws Throwable
+    public void begin()
     {
         views.clear();
     }
@@ -76,19 +83,12 @@ public abstract class ViewComplexTester extends CQLTester
     @After
     public void end() throws Throwable
     {
-        dropMViews();
-    }
-
-    protected void dropMViews() throws Throwable
-    {
         for (String viewName : views)
             executeNet(version, "DROP MATERIALIZED VIEW " + viewName);
     }
 
-    protected String createView(String query) throws Throwable
+    protected void createView(String name, String query) throws Throwable
     {
-        String name = createViewName();
-
         try
         {
             executeNet(version, String.format(query, name));
@@ -102,29 +102,27 @@ public abstract class ViewComplexTester extends CQLTester
             views.add(name);
             throw ex;
         }
-
-        return name;
-    }
-
-    protected static String createViewName()
-    {
-        return "mv" + seqNumber.getAndIncrement();
     }
 
     protected void updateView(String query, Object... params) throws Throwable
     {
-        updateViewWithFlush(query, false, params);
-    }
-
-    protected void updateViewWithFlush(String query, boolean flush, Object... params) throws Throwable
-    {
         executeNet(version, query, params);
         while (!(Stage.VIEW_MUTATION.executor().getPendingTaskCount() == 0
                  && Stage.VIEW_MUTATION.executor().getActiveTaskCount() == 0))
         {
             Thread.sleep(1);
         }
-        if (flush)
-            Keyspace.open(keyspace()).flush();
+    }
+
+    protected void dropView(String name) throws Throwable
+    {
+        executeNet(version, "DROP MATERIALIZED VIEW " + name);
+        views.remove(name);
+    }
+
+    protected static void waitForView(String keyspace, String view) throws InterruptedException
+    {
+        while (!SystemKeyspace.isViewBuilt(keyspace, view))
+            Thread.sleep(10);
     }
 }

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