diff --git a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java index 2a0366bb22..a1cc34a553 100644 --- a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java +++ b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java @@ -34,6 +34,9 @@ import org.junit.Assert; import com.datastax.driver.core.exceptions.OperationTimedOutException; import org.apache.cassandra.concurrent.SEPExecutor; import org.apache.cassandra.concurrent.Stage; +import org.apache.cassandra.db.ColumnFamilyStore; +import org.apache.cassandra.db.Keyspace; +import org.apache.cassandra.db.SchemaCQLHelper; import org.apache.cassandra.schema.ColumnMetadata; import org.apache.cassandra.schema.TableMetadata; import org.apache.cassandra.schema.Schema; @@ -50,6 +53,8 @@ import org.junit.Test; import com.datastax.driver.core.exceptions.InvalidQueryException; +import static org.junit.Assert.assertTrue; + public class ViewSchemaTest extends CQLTester { @@ -718,7 +723,7 @@ public class ViewSchemaTest extends CQLTester execute("USE " + keyspace()); executeNet(protocolVersion, "USE " + keyspace()); - execute("INSERT into %s (a,b,c,d) VALUES (?,?,?,?)", 1,2,3,4); + execute("INSERT into %s (a,b,c,d) VALUES (?,?,?,?)", 1, 2, 3, 4); assertInvalidThrowMessage("Cannot use token relation when defining a materialized view", InvalidRequestException.class, "CREATE MATERIALIZED VIEW mv_test AS SELECT a,b,c FROM %s WHERE a IS NOT NULL and b IS NOT NULL and token(a) = token(1) PRIMARY KEY(b,a)"); @@ -857,4 +862,85 @@ public class ViewSchemaTest extends CQLTester row(0, 1, 0, 0, 3), row(0, 2, 1, 1, 7)); } + + @Test + public void testViewMetadataCQLNotIncludeAllColumn() throws Throwable + { + String createBase = "CREATE TABLE IF NOT EXISTS %s (" + + "pk1 int," + + "pk2 int," + + "ck1 int," + + "ck2 int," + + "reg1 int," + + "reg2 list," + + "reg3 int," + + "PRIMARY KEY ((pk1, pk2), ck1, ck2)) WITH " + + "CLUSTERING ORDER BY (ck1 ASC, ck2 ASC);"; + + String createView = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s AS SELECT pk1, pk2, ck1, ck2, reg1, reg2 FROM %%s " + + "WHERE pk2 IS NOT NULL AND pk1 IS NOT NULL AND ck2 IS NOT NULL AND ck1 IS NOT NULL PRIMARY KEY((pk2, pk1), ck2, ck1)"; + + String expectedViewSnapshot = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s.%s AS\n" + + " SELECT pk2, pk1, ck2, ck1, reg1, reg2\n" + + " FROM %s.%s\n" + + " WHERE pk2 IS NOT NULL AND pk1 IS NOT NULL AND ck2 IS NOT NULL AND ck1 IS NOT NULL\n" + + " PRIMARY KEY ((pk2, pk1), ck2, ck1)\n" + + " WITH ID = %s\n" + + " AND CLUSTERING ORDER BY (ck2 ASC, ck1 ASC)"; + + testViewMetadataCQL(createBase, + createView, + expectedViewSnapshot); + } + + @Test + public void testViewMetadataCQLIncludeAllColumn() throws Throwable + { + String createBase = "CREATE TABLE IF NOT EXISTS %s (" + + "pk1 int," + + "pk2 int," + + "ck1 int," + + "ck2 int," + + "reg1 int," + + "reg2 list," + + "reg3 int," + + "PRIMARY KEY ((pk1, pk2), ck1, ck2)) WITH " + + "CLUSTERING ORDER BY (ck1 ASC, ck2 DESC);"; + + String createView = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s AS SELECT * FROM %%s " + + "WHERE pk2 IS NOT NULL AND pk1 IS NOT NULL AND ck2 IS NOT NULL AND ck1 IS NOT NULL PRIMARY KEY((pk2, pk1), ck2, ck1)"; + + String expectedViewSnapshot = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s.%s AS\n" + + " SELECT *\n" + + " FROM %s.%s\n" + + " WHERE pk2 IS NOT NULL AND pk1 IS NOT NULL AND ck2 IS NOT NULL AND ck1 IS NOT NULL\n" + + " PRIMARY KEY ((pk2, pk1), ck2, ck1)\n" + + " WITH ID = %s\n" + + " AND CLUSTERING ORDER BY (ck2 DESC, ck1 ASC)"; + + testViewMetadataCQL(createBase, + createView, + expectedViewSnapshot); + } + + private void testViewMetadataCQL(String createBase, String createView, String viewSnapshotSchema) throws Throwable + { + execute("USE " + keyspace()); + executeNet(protocolVersion, "USE " + keyspace()); + + String base = createTable(createBase); + + String view = "mv"; + createView(view, createView); + + ColumnFamilyStore mv = Keyspace.open(keyspace()).getColumnFamilyStore(view); + + assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(mv.metadata(), true, true, true) + .startsWith(String.format(viewSnapshotSchema, + keyspace(), + view, + keyspace(), + base, + mv.metadata().id))); + } }