Repository: cassandra Updated Branches: refs/heads/cassandra-2.1 289314a60 -> 25a4c9e1f
http://git-wip-us.apache.org/repos/asf/cassandra/blob/084d93da/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java ---------------------------------------------------------------------- diff --git a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java index 498d332..ea4f1a6 100644 --- a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java @@ -57,11 +57,25 @@ public class MultiColumnRelationTest { SchemaLoader.loadSchema(); executeSchemaChange("CREATE KEYSPACE IF NOT EXISTS %s WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}"); - executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.single_partition (a int PRIMARY KEY, b int)"); - executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.compound_partition (a int, b int, c int, PRIMARY KEY ((a, b)))"); - executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.single_clustering (a int, b int, c int, PRIMARY KEY (a, b))"); - executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.multiple_clustering (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))"); - executeSchemaChange("CREATE TABLE IF NOT EXISTS %s.multiple_clustering_reversed (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d)) WITH CLUSTERING ORDER BY (b DESC, c ASC, d DESC)"); + for (boolean isCompact : new boolean[]{false, true}) + { + String tableSuffix = isCompact ? "_compact" : ""; + String compactOption = isCompact ? " WITH COMPACT STORAGE" : ""; + + executeSchemaChange( + "CREATE TABLE IF NOT EXISTS %s.single_partition" + tableSuffix + "(a int PRIMARY KEY, b int)" + compactOption); + executeSchemaChange( + "CREATE TABLE IF NOT EXISTS %s.compound_partition" +tableSuffix + "(a int, b int, c int, PRIMARY KEY ((a, b)))" + compactOption); + executeSchemaChange( + "CREATE TABLE IF NOT EXISTS %s.single_clustering" + tableSuffix + "(a int, b int, c int, PRIMARY KEY (a, b))" + compactOption); + executeSchemaChange( + "CREATE TABLE IF NOT EXISTS %s.multiple_clustering" + tableSuffix + "(a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))" + compactOption); + + compactOption = isCompact ? " COMPACT STORAGE AND " : ""; + executeSchemaChange( + "CREATE TABLE IF NOT EXISTS %s.multiple_clustering_reversed" + tableSuffix + + "(a int, b int, c int, d int, PRIMARY KEY (a, b, c, d)) WITH " + compactOption + " CLUSTERING ORDER BY (b DESC, c ASC, d DESC)"); + } clientState = ClientState.forInternalCalls(); } @@ -207,40 +221,46 @@ public class MultiColumnRelationTest @Test public void testSingleClusteringColumnEquality() throws Throwable { - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 0, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 1, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 2, 0)"); - UntypedResultSet results = execute("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) = (1)"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0); - - results = execute("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) = (3)"); - assertEquals(0, results.size()); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.single_clustering" + tableSuffix + "(a, b, c) VALUES (0, 0, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 1, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 2, 0)"); + UntypedResultSet results = execute("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) = (1)"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0); + + results = execute("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) = (3)"); + assertEquals(0, results.size()); + } } @Test public void testMultipleClusteringColumnEquality() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 1)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 2, 0, 0)"); - UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) = (1)"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(2, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) = (1, 1)"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 1, 0); - checkRow(1, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) = (1, 1, 1)"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 1, 1); - execute("DELETE FROM %s.multiple_clustering WHERE a=0 AND b=2 and c=0 and d=0"); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 1)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 2, 0, 0)"); + UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) = (1)"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(2, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) = (1, 1)"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 1, 0); + checkRow(1, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) = (1, 1, 1)"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 1, 1); + execute("DELETE FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND b=2 and c=0 and d=0"); + } } @Test(expected=InvalidRequestException.class) @@ -270,372 +290,392 @@ public class MultiColumnRelationTest @Test public void testMixSingleAndTupleInequalities() throws Throwable { - String[] queries = new String[]{ - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (0, 1, 0) AND b < 1", - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (0, 1, 0) AND c < 1", - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND b > 1 AND (b, c, d) < (1, 1, 0)", - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND c > 1 AND (b, c, d) < (1, 1, 0)", - }; - - for (String query : queries) + for (String tableSuffix : new String[]{"", "_compact"}) { - try + String[] queries = new String[]{ + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (0, 1, 0) AND b < 1", + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (0, 1, 0) AND c < 1", + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND b > 1 AND (b, c, d) < (1, 1, 0)", + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND c > 1 AND (b, c, d) < (1, 1, 0)", + }; + + for (String query : queries) { - execute(query); - fail(String.format("Expected query \"%s\" to throw an InvalidRequestException", query)); + try + { + execute(query); + fail(String.format("Expected query \"%s\" to throw an InvalidRequestException", query)); + } + catch (InvalidRequestException e) + { + } } - catch (InvalidRequestException e) {} } } @Test public void testSingleClusteringColumnInequality() throws Throwable { - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 0, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 1, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 2, 0)"); - - UntypedResultSet results = execute("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) > (0)"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 0); - checkRow(1, results, 0, 2, 0); - - results = execute("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) >= (1)"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 0); - checkRow(1, results, 0, 2, 0); - - results = execute("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) < (2)"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 0); - checkRow(1, results, 0, 1, 0); - - results = execute("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) <= (1)"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 0); - checkRow(1, results, 0, 1, 0); - - results = execute("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) > (0) AND (b) < (2)"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 0, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 1, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 2, 0)"); + + UntypedResultSet results = execute("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) > (0)"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 0); + checkRow(1, results, 0, 2, 0); + + results = execute("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) >= (1)"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 0); + checkRow(1, results, 0, 2, 0); + + results = execute("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) < (2)"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 0); + checkRow(1, results, 0, 1, 0); + + results = execute("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) <= (1)"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 0); + checkRow(1, results, 0, 1, 0); + + results = execute("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) > (0) AND (b) < (2)"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0); + } } @Test public void testMultipleClusteringColumnInequality() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); - - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 1)"); - - UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) > (0)"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(2, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) >= (0)"); - assertEquals(6, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); - checkRow(3, results, 0, 1, 0, 0); - checkRow(4, results, 0, 1, 1, 0); - checkRow(5, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) > (1, 0)"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 1, 0); - checkRow(1, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) >= (1, 0)"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(2, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (1, 1, 0)"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) >= (1, 1, 0)"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 1, 0); - checkRow(1, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) < (1)"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) <= (1)"); - assertEquals(6, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); - checkRow(3, results, 0, 1, 0, 0); - checkRow(4, results, 0, 1, 1, 0); - checkRow(5, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) < (0, 1)"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 0, 0); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) <= (0, 1)"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) < (0, 1, 1)"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) <= (0, 1, 1)"); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (0, 1, 0) AND (b) < (1)"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (0, 1, 1) AND (b, c) < (1, 1)"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (0, 1, 1) AND (b, c, d) < (1, 1, 0)"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); - - // reversed - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) > (0) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(3, results.size()); - checkRow(2, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(0, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) >= (0) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(6, results.size()); - checkRow(5, results, 0, 0, 0, 0); - checkRow(4, results, 0, 0, 1, 0); - checkRow(3, results, 0, 0, 1, 1); - checkRow(2, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(0, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) > (1, 0) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(2, results.size()); - checkRow(1, results, 0, 1, 1, 0); - checkRow(0, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) >= (1, 0) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(3, results.size()); - checkRow(2, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(0, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (1, 1, 0) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) >= (1, 1, 0) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(2, results.size()); - checkRow(1, results, 0, 1, 1, 0); - checkRow(0, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) < (1) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(3, results.size()); - checkRow(2, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(0, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) <= (1) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(6, results.size()); - checkRow(5, results, 0, 0, 0, 0); - checkRow(4, results, 0, 0, 1, 0); - checkRow(3, results, 0, 0, 1, 1); - checkRow(2, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(0, results, 0, 1, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) < (0, 1) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 0, 0); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) <= (0, 1) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(3, results.size()); - checkRow(2, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(0, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) < (0, 1, 1) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(2, results.size()); - checkRow(1, results, 0, 0, 0, 0); - checkRow(0, results, 0, 0, 1, 0); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) <= (0, 1, 1) ORDER BY b DESC, c DESC, d DESC"); - checkRow(2, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(0, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (0, 1, 0) AND (b) < (1) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (0, 1, 1) AND (b, c) < (1, 1) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (0, 1, 1) AND (b, c, d) < (1, 1, 0) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 1)"); + + UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) > (0)"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(2, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) >= (0)"); + assertEquals(6, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + checkRow(3, results, 0, 1, 0, 0); + checkRow(4, results, 0, 1, 1, 0); + checkRow(5, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) > (1, 0)"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 1, 0); + checkRow(1, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) >= (1, 0)"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(2, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (1, 1, 0)"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) >= (1, 1, 0)"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 1, 0); + checkRow(1, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) < (1)"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) <= (1)"); + assertEquals(6, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + checkRow(3, results, 0, 1, 0, 0); + checkRow(4, results, 0, 1, 1, 0); + checkRow(5, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) < (0, 1)"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 0, 0); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) <= (0, 1)"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) < (0, 1, 1)"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) <= (0, 1, 1)"); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (0, 1, 0) AND (b) < (1)"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (0, 1, 1) AND (b, c) < (1, 1)"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (0, 1, 1) AND (b, c, d) < (1, 1, 0)"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + + // reversed + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) > (0) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(3, results.size()); + checkRow(2, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(0, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) >= (0) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(6, results.size()); + checkRow(5, results, 0, 0, 0, 0); + checkRow(4, results, 0, 0, 1, 0); + checkRow(3, results, 0, 0, 1, 1); + checkRow(2, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(0, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) > (1, 0) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(2, results.size()); + checkRow(1, results, 0, 1, 1, 0); + checkRow(0, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) >= (1, 0) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(3, results.size()); + checkRow(2, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(0, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (1, 1, 0) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) >= (1, 1, 0) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(2, results.size()); + checkRow(1, results, 0, 1, 1, 0); + checkRow(0, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) < (1) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(3, results.size()); + checkRow(2, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(0, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) <= (1) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(6, results.size()); + checkRow(5, results, 0, 0, 0, 0); + checkRow(4, results, 0, 0, 1, 0); + checkRow(3, results, 0, 0, 1, 1); + checkRow(2, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(0, results, 0, 1, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) < (0, 1) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 0, 0); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) <= (0, 1) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(3, results.size()); + checkRow(2, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(0, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) < (0, 1, 1) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(2, results.size()); + checkRow(1, results, 0, 0, 0, 0); + checkRow(0, results, 0, 0, 1, 0); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) <= (0, 1, 1) ORDER BY b DESC, c DESC, d DESC"); + checkRow(2, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(0, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (0, 1, 0) AND (b) < (1) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (0, 1, 1) AND (b, c) < (1, 1) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (0, 1, 1) AND (b, c, d) < (1, 1, 0) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + } } @Test public void testMultipleClusteringColumnInequalityReversedComponents() throws Throwable { - // b and d are reversed in the clustering order - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 1, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 1, 1, 1)"); - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 1, 1, 0)"); - - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 0, 1, 1)"); - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 0, 1, 0)"); - - - UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b) > (0)"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 1); - checkRow(2, results, 0, 1, 1, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b) >= (0)"); - assertEquals(6, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 1); - checkRow(2, results, 0, 1, 1, 0); - checkRow(3, results, 0, 0, 0, 0); - checkRow(4, results, 0, 0, 1, 1); - checkRow(5, results, 0, 0, 1, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b) < (1)"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 1); - checkRow(2, results, 0, 0, 1, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b) <= (1)"); - assertEquals(6, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 1); - checkRow(2, results, 0, 1, 1, 0); - checkRow(3, results, 0, 0, 0, 0); - checkRow(4, results, 0, 0, 1, 1); - checkRow(5, results, 0, 0, 1, 0); - - // preserve pre-6875 behavior (even though the query result is technically incorrect) - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b, c) > (1, 0)"); - assertEquals(0, results.size()); + for (String tableSuffix : new String[]{"", "_compact"}) + { + // b and d are reversed in the clustering order + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 1)"); + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 0)"); + + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + + + UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b) > (0)"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 1); + checkRow(2, results, 0, 1, 1, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b) >= (0)"); + assertEquals(6, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 1); + checkRow(2, results, 0, 1, 1, 0); + checkRow(3, results, 0, 0, 0, 0); + checkRow(4, results, 0, 0, 1, 1); + checkRow(5, results, 0, 0, 1, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b) < (1)"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 1); + checkRow(2, results, 0, 0, 1, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b) <= (1)"); + assertEquals(6, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 1); + checkRow(2, results, 0, 1, 1, 0); + checkRow(3, results, 0, 0, 0, 0); + checkRow(4, results, 0, 0, 1, 1); + checkRow(5, results, 0, 0, 1, 0); + + // preserve pre-6875 behavior (even though the query result is technically incorrect) + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b, c) > (1, 0)"); + assertEquals(0, results.size()); + } } @Test public void testLiteralIn() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); - - UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN ((0, 1, 0), (0, 1, 1))"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - // same query, but reversed order for the IN values - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN ((0, 1, 1), (0, 1, 0))"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b, c) IN ((0, 1))"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b) IN ((0))"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) IN ((0, 1)) ORDER BY b DESC, c DESC, d DESC"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 1); - checkRow(1, results, 0, 0, 1, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + + UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((0, 1, 0), (0, 1, 1))"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + // same query, but reversed order for the IN values + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((0, 1, 1), (0, 1, 0))"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b, c) IN ((0, 1))"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b) IN ((0))"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) IN ((0, 1)) ORDER BY b DESC, c DESC, d DESC"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 1); + checkRow(1, results, 0, 0, 1, 0); + } } @Test public void testLiteralInReversed() throws Throwable { - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 1, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 0, 1, 1)"); - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering_reversed (a, b, c, d) VALUES (0, -1, 0, 0)"); - - UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b, c, d) IN ((0, 1, 0), (0, 1, 1))"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 1); - checkRow(1, results, 0, 0, 1, 0); - - // same query, but reversed order for the IN values - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b, c, d) IN ((0, 1, 1), (0, 1, 0))"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 1); - checkRow(1, results, 0, 0, 1, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b, c, d) IN ((1, 0, 0), (0, 0, 0), (0, 1, 1), (0, 1, 0), (-1, 0, 0))"); - assertEquals(5, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 0, 0, 0); - checkRow(2, results, 0, 0, 1, 1); - checkRow(3, results, 0, 0, 1, 0); - checkRow(4, results, 0, -1, 0, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b, c, d) IN ((0, 0, 0))"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 0, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b, c, d) IN ((0, 1, 1))"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 AND (b, c, d) IN ((0, 1, 0))"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 1, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 and (b, c) IN ((0, 1))"); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 1); - checkRow(1, results, 0, 0, 1, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 and (b, c) IN ((0, 0))"); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 0, 0); - - results = execute("SELECT * FROM %s.multiple_clustering_reversed WHERE a=0 and (b) IN ((0))"); - assertEquals(3, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 1); - checkRow(2, results, 0, 0, 1, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering_reversed" + tableSuffix + " (a, b, c, d) VALUES (0, -1, 0, 0)"); + + UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((0, 1, 0), (0, 1, 1))"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 1); + checkRow(1, results, 0, 0, 1, 0); + + // same query, but reversed order for the IN values + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((0, 1, 1), (0, 1, 0))"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 1); + checkRow(1, results, 0, 0, 1, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((1, 0, 0), (0, 0, 0), (0, 1, 1), (0, 1, 0), (-1, 0, 0))"); + assertEquals(5, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 0, 0, 0); + checkRow(2, results, 0, 0, 1, 1); + checkRow(3, results, 0, 0, 1, 0); + checkRow(4, results, 0, -1, 0, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((0, 0, 0))"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 0, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((0, 1, 1))"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((0, 1, 0))"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 1, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 and (b, c) IN ((0, 1))"); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 1); + checkRow(1, results, 0, 0, 1, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 and (b, c) IN ((0, 0))"); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 0, 0); + + results = execute("SELECT * FROM %s.multiple_clustering_reversed" + tableSuffix + " WHERE a=0 and (b) IN ((0))"); + assertEquals(3, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 1); + checkRow(2, results, 0, 0, 1, 0); + } } @Test(expected=InvalidRequestException.class) @@ -664,44 +704,47 @@ public class MultiColumnRelationTest @Test public void testPartitionAndClusteringInClauses() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); - - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (1, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (1, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (1, 0, 1, 1)"); - - UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering WHERE a IN (0, 1) AND (b, c, d) IN ((0, 1, 0), (0, 1, 1))"); - assertEquals(4, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - checkRow(2, results, 1, 0, 1, 0); - checkRow(3, results, 1, 0, 1, 1); - - // same query, but reversed order for the IN values - results = execute("SELECT * FROM %s.multiple_clustering WHERE a IN (1, 0) AND (b, c, d) IN ((0, 1, 1), (0, 1, 0))"); - assertEquals(4, results.size()); - checkRow(0, results, 1, 0, 1, 0); - checkRow(1, results, 1, 0, 1, 1); - checkRow(2, results, 0, 0, 1, 0); - checkRow(3, results, 0, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a IN (0, 1) and (b, c) IN ((0, 1))"); - assertEquals(4, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - checkRow(2, results, 1, 0, 1, 0); - checkRow(3, results, 1, 0, 1, 1); - - results = execute("SELECT * FROM %s.multiple_clustering WHERE a IN (0, 1) and (b) IN ((0))"); - assertEquals(6, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); - checkRow(3, results, 1, 0, 0, 0); - checkRow(4, results, 1, 0, 1, 0); - checkRow(5, results, 1, 0, 1, 1); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (1, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (1, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (1, 0, 1, 1)"); + + UntypedResultSet results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a IN (0, 1) AND (b, c, d) IN ((0, 1, 0), (0, 1, 1))"); + assertEquals(4, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + checkRow(2, results, 1, 0, 1, 0); + checkRow(3, results, 1, 0, 1, 1); + + // same query, but reversed order for the IN values + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a IN (1, 0) AND (b, c, d) IN ((0, 1, 1), (0, 1, 0))"); + assertEquals(4, results.size()); + checkRow(0, results, 1, 0, 1, 0); + checkRow(1, results, 1, 0, 1, 1); + checkRow(2, results, 0, 0, 1, 0); + checkRow(3, results, 0, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a IN (0, 1) and (b, c) IN ((0, 1))"); + assertEquals(4, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + checkRow(2, results, 1, 0, 1, 0); + checkRow(3, results, 1, 0, 1, 1); + + results = execute("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a IN (0, 1) and (b) IN ((0))"); + assertEquals(6, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + checkRow(3, results, 1, 0, 0, 0); + checkRow(4, results, 1, 0, 1, 0); + checkRow(5, results, 1, 0, 1, 1); + } } // prepare statement tests @@ -777,335 +820,362 @@ public class MultiColumnRelationTest @Test public void testPreparedClusteringColumnEquality() throws Throwable { - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 0, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 1, 0)"); - MD5Digest id = prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) = (?)"); - UntypedResultSet results = executePrepared(id, makeIntOptions(0)); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 0, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 1, 0)"); + MD5Digest id = prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) = (?)"); + UntypedResultSet results = executePrepared(id, makeIntOptions(0)); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 0); + } } @Test public void testPreparedClusteringColumnEqualitySingleMarker() throws Throwable { - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 0, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 1, 0)"); - MD5Digest id = prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) = ?"); - UntypedResultSet results = executePrepared(id, options(tuple(0))); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 0, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 1, 0)"); + MD5Digest id = prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) = ?"); + UntypedResultSet results = executePrepared(id, options(tuple(0))); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 0); + } } @Test public void testPreparedSingleClusteringColumnInequality() throws Throwable { - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 0, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 1, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 2, 0)"); - - MD5Digest id = prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) > (?)"); - UntypedResultSet results = executePrepared(id, makeIntOptions(0)); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 0); - checkRow(1, results, 0, 2, 0); - - results = executePrepared(prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) >= (?)"), makeIntOptions(1)); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 0); - checkRow(1, results, 0, 2, 0); - - results = executePrepared(prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) < (?)"), makeIntOptions(2)); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 0); - checkRow(1, results, 0, 1, 0); - - results = executePrepared(prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) <= (?)"), makeIntOptions(1)); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 0); - checkRow(1, results, 0, 1, 0); - - results = executePrepared(prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) > (?) AND (b) < (?)"), makeIntOptions(0, 2)); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 0, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 1, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 2, 0)"); + + MD5Digest id = prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) > (?)"); + UntypedResultSet results = executePrepared(id, makeIntOptions(0)); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 0); + checkRow(1, results, 0, 2, 0); + + results = executePrepared(prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) >= (?)"), makeIntOptions(1)); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 0); + checkRow(1, results, 0, 2, 0); + + results = executePrepared(prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) < (?)"), makeIntOptions(2)); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 0); + checkRow(1, results, 0, 1, 0); + + results = executePrepared(prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) <= (?)"), makeIntOptions(1)); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 0); + checkRow(1, results, 0, 1, 0); + + results = executePrepared(prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) > (?) AND (b) < (?)"), makeIntOptions(0, 2)); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0); + } } @Test public void testPreparedSingleClusteringColumnInequalitySingleMarker() throws Throwable { - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 0, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 1, 0)"); - execute("INSERT INTO %s.single_clustering (a, b, c) VALUES (0, 2, 0)"); - - MD5Digest id = prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) > ?"); - UntypedResultSet results = executePrepared(id, options(tuple(0))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 0); - checkRow(1, results, 0, 2, 0); - - results = executePrepared(prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) >= ?"), options(tuple(1))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 0); - checkRow(1, results, 0, 2, 0); - - results = executePrepared(prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) < ?"), options(tuple(2))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 0); - checkRow(1, results, 0, 1, 0); - - results = executePrepared(prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) <= ?"), options(tuple(1))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 0); - checkRow(1, results, 0, 1, 0); - - - results = executePrepared(prepare("SELECT * FROM %s.single_clustering WHERE a=0 AND (b) > ? AND (b) < ?"), - options(tuple(0), tuple(2))); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 0, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 1, 0)"); + execute("INSERT INTO %s.single_clustering" + tableSuffix + " (a, b, c) VALUES (0, 2, 0)"); + + MD5Digest id = prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) > ?"); + UntypedResultSet results = executePrepared(id, options(tuple(0))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 0); + checkRow(1, results, 0, 2, 0); + + results = executePrepared(prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) >= ?"), options(tuple(1))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 0); + checkRow(1, results, 0, 2, 0); + + results = executePrepared(prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) < ?"), options(tuple(2))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 0); + checkRow(1, results, 0, 1, 0); + + results = executePrepared(prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) <= ?"), options(tuple(1))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 0); + checkRow(1, results, 0, 1, 0); + + + results = executePrepared(prepare("SELECT * FROM %s.single_clustering" + tableSuffix + " WHERE a=0 AND (b) > ? AND (b) < ?"), + options(tuple(0), tuple(2))); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0); + } } @Test public void testPrepareMultipleClusteringColumnInequality() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); - - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 1)"); - - UntypedResultSet results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) > (?)"), makeIntOptions(0)); - assertEquals(3, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(2, results, 0, 1, 1, 1); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) > (?, ?)"), makeIntOptions(1, 0)); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 1, 0); - checkRow(1, results, 0, 1, 1, 1); - - results = executePrepared(prepare - ("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (?, ?, ?)"), makeIntOptions(1, 1, 0)); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 1, 1); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (?, ?, ?) AND (b) < (?)"), - makeIntOptions(0, 1, 0, 1)); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 1, 1); - - results = executePrepared(prepare - ("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (?, ?, ?) AND (b, c) < (?, ?)"), - makeIntOptions(0, 1, 1, 1, 1)); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (?, ?, ?) AND (b, c, d) < (?, ?, ?)"), - makeIntOptions(0, 1, 1, 1, 1, 0)); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); - - // reversed - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) > (?) ORDER BY b DESC, c DESC, d DESC"), - makeIntOptions(0)); - assertEquals(3, results.size()); - checkRow(2, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(0, results, 0, 1, 1, 1); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > (?, ?, ?) AND (b, c) < (?, ?) ORDER BY b DESC, c DESC, d DESC"), - makeIntOptions(0, 1, 1, 1, 1)); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 1)"); + + UntypedResultSet results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) > (?)"), makeIntOptions(0)); + assertEquals(3, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(2, results, 0, 1, 1, 1); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) > (?, ?)"), makeIntOptions(1, 0)); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 1, 0); + checkRow(1, results, 0, 1, 1, 1); + + results = executePrepared(prepare + ("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (?, ?, ?)"), makeIntOptions(1, 1, 0)); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 1, 1); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (?, ?, ?) AND (b) < (?)"), + makeIntOptions(0, 1, 0, 1)); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 1, 1); + + results = executePrepared(prepare + ("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (?, ?, ?) AND (b, c) < (?, ?)"), + makeIntOptions(0, 1, 1, 1, 1)); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (?, ?, ?) AND (b, c, d) < (?, ?, ?)"), + makeIntOptions(0, 1, 1, 1, 1, 0)); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + + // reversed + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) > (?) ORDER BY b DESC, c DESC, d DESC"), + makeIntOptions(0)); + assertEquals(3, results.size()); + checkRow(2, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(0, results, 0, 1, 1, 1); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > (?, ?, ?) AND (b, c) < (?, ?) ORDER BY b DESC, c DESC, d DESC"), + makeIntOptions(0, 1, 1, 1, 1)); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + } } @Test public void testPrepareMultipleClusteringColumnInequalitySingleMarker() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); - - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 1, 1, 1)"); - - UntypedResultSet results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) > ?"), options(tuple(0))); - assertEquals(3, results.size()); - checkRow(0, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(2, results, 0, 1, 1, 1); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c) > ?"), options(tuple(1, 0))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 1, 1, 0); - checkRow(1, results, 0, 1, 1, 1); - - results = executePrepared(prepare - ("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > ?"), options(tuple(1, 1, 0))); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 1, 1); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > ? AND (b) < ?"), - options(tuple(0, 1, 0), tuple(1))); - assertEquals(1, results.size()); - checkRow(0, results, 0, 0, 1, 1); - - results = executePrepared(prepare - ("SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > ? AND (b, c) < ?"), - options(tuple(0, 1, 1), tuple(1, 1))); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > ? AND (b, c, d) < ?"), - options(tuple(0, 1, 1), tuple(1, 1, 0))); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); - - // reversed - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b) > ? ORDER BY b DESC, c DESC, d DESC"), - options(tuple(0))); - assertEquals(3, results.size()); - checkRow(2, results, 0, 1, 0, 0); - checkRow(1, results, 0, 1, 1, 0); - checkRow(0, results, 0, 1, 1, 1); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) > ? AND (b, c) < ? ORDER BY b DESC, c DESC, d DESC"), - options(tuple(0, 1, 1), tuple(1, 1))); - assertEquals(1, results.size()); - checkRow(0, results, 0, 1, 0, 0); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 1, 1, 1)"); + + UntypedResultSet results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) > ?"), options(tuple(0))); + assertEquals(3, results.size()); + checkRow(0, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(2, results, 0, 1, 1, 1); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c) > ?"), options(tuple(1, 0))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 1, 1, 0); + checkRow(1, results, 0, 1, 1, 1); + + results = executePrepared(prepare + ("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > ?"), options(tuple(1, 1, 0))); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 1, 1); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > ? AND (b) < ?"), + options(tuple(0, 1, 0), tuple(1))); + assertEquals(1, results.size()); + checkRow(0, results, 0, 0, 1, 1); + + results = executePrepared(prepare + ("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > ? AND (b, c) < ?"), + options(tuple(0, 1, 1), tuple(1, 1))); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > ? AND (b, c, d) < ?"), + options(tuple(0, 1, 1), tuple(1, 1, 0))); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + + // reversed + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b) > ? ORDER BY b DESC, c DESC, d DESC"), + options(tuple(0))); + assertEquals(3, results.size()); + checkRow(2, results, 0, 1, 0, 0); + checkRow(1, results, 0, 1, 1, 0); + checkRow(0, results, 0, 1, 1, 1); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) > ? AND (b, c) < ? ORDER BY b DESC, c DESC, d DESC"), + options(tuple(0, 1, 1), tuple(1, 1))); + assertEquals(1, results.size()); + checkRow(0, results, 0, 1, 0, 0); + } } @Test public void testPrepareLiteralIn() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); - - UntypedResultSet results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))"), - makeIntOptions(0, 1, 0, 0, 1, 1)); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - // same query, but reversed order for the IN values - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))"), - makeIntOptions(0, 1, 1, 0, 1, 0)); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b, c) IN ((?, ?))"), - makeIntOptions(0, 1)); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b) IN ((?))"), - makeIntOptions(0)); - assertEquals(3, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + + UntypedResultSet results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))"), + makeIntOptions(0, 1, 0, 0, 1, 1)); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + // same query, but reversed order for the IN values + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))"), + makeIntOptions(0, 1, 1, 0, 1, 0)); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b, c) IN ((?, ?))"), + makeIntOptions(0, 1)); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b) IN ((?))"), + makeIntOptions(0)); + assertEquals(3, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + } } @Test public void testPrepareInOneMarkerPerTuple() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); - - UntypedResultSet results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN (?, ?)"), - options(tuple(0, 1, 0), tuple(0, 1, 1))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - // same query, but reversed order for the IN values - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN (?, ?)"), - options(tuple(0, 1, 1), tuple(0, 1, 0))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - - results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b, c) IN (?)"), - options(tuple(0, 1))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b) IN (?)"), - options(tuple(0))); - assertEquals(3, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + + UntypedResultSet results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN (?, ?)"), + options(tuple(0, 1, 0), tuple(0, 1, 1))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + // same query, but reversed order for the IN values + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN (?, ?)"), + options(tuple(0, 1, 1), tuple(0, 1, 0))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + + results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b, c) IN (?)"), + options(tuple(0, 1))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b) IN (?)"), + options(tuple(0))); + assertEquals(3, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + } } @Test public void testPrepareInOneMarker() throws Throwable { - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 0, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 0)"); - execute("INSERT INTO %s.multiple_clustering (a, b, c, d) VALUES (0, 0, 1, 1)"); - - UntypedResultSet results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN ?"), - options(list(tuple(0, 1, 0), tuple(0, 1, 1)))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - // same query, but reversed order for the IN values - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN ?"), - options(list(tuple(0, 1, 1), tuple(0, 1, 0)))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - results = executePrepared(prepare( - "SELECT * FROM %s.multiple_clustering WHERE a=0 AND (b, c, d) IN ?"), - options(list())); - assertTrue(results.isEmpty()); - - results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b, c) IN ?"), - options(list(tuple(0, 1)))); - assertEquals(2, results.size()); - checkRow(0, results, 0, 0, 1, 0); - checkRow(1, results, 0, 0, 1, 1); - - results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b) IN ?"), - options(list(tuple(0)))); - assertEquals(3, results.size()); - checkRow(0, results, 0, 0, 0, 0); - checkRow(1, results, 0, 0, 1, 0); - checkRow(2, results, 0, 0, 1, 1); - - results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering WHERE a=0 and (b) IN ?"), - options(list())); - assertTrue(results.isEmpty()); + for (String tableSuffix : new String[]{"", "_compact"}) + { + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 0, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 0)"); + execute("INSERT INTO %s.multiple_clustering" + tableSuffix + " (a, b, c, d) VALUES (0, 0, 1, 1)"); + + UntypedResultSet results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ?"), + options(list(tuple(0, 1, 0), tuple(0, 1, 1)))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + // same query, but reversed order for the IN values + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ?"), + options(list(tuple(0, 1, 1), tuple(0, 1, 0)))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + results = executePrepared(prepare( + "SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 AND (b, c, d) IN ?"), + options(list())); + assertTrue(results.isEmpty()); + + results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b, c) IN ?"), + options(list(tuple(0, 1)))); + assertEquals(2, results.size()); + checkRow(0, results, 0, 0, 1, 0); + checkRow(1, results, 0, 0, 1, 1); + + results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b) IN ?"), + options(list(tuple(0)))); + assertEquals(3, results.size()); + checkRow(0, results, 0, 0, 0, 0); + checkRow(1, results, 0, 0, 1, 0); + checkRow(2, results, 0, 0, 1, 1); + + results = executePrepared(prepare("SELECT * FROM %s.multiple_clustering" + tableSuffix + " WHERE a=0 and (b) IN ?"), + options(list())); + assertTrue(results.isEmpty()); + } } @Test(expected=InvalidRequestException.class)