diff --git a/CHANGES.txt b/CHANGES.txt index 80c68726a4..8dbcbc8d39 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -7,6 +7,8 @@ * Have paxos reuse the timestamp generation of normal queries (CASSANDRA-7801) * Fix incremental repair not remove parent session on remote (CASSANDRA-8291) Merged from 2.0: + * Fix some failing queries that use multi-column relations + on COMPACT STORAGE tables (CASSANDRA-8264) * Fix InvalidRequestException with ORDER BY (CASSANDRA-8286) * Disable SSLv3 for POODLE (CASSANDRA-8265) * Fix millisecond timestamps in Tracing (CASSANDRA-8297) diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java index 09d1e52b7f..688d1d5509 100644 --- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java +++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java @@ -1129,13 +1129,24 @@ public class SelectStatement implements CQLStatement, MeasurableForPreparedCache return value; } + private CellName makeExclusiveSliceBound(Bound bound, CellNameType type, QueryOptions options) throws InvalidRequestException + { + if (sliceRestriction.isInclusive(bound)) + return null; + + if (sliceRestriction.isMultiColumn()) + return type.makeCellName(((MultiColumnRestriction.Slice) sliceRestriction).componentBounds(bound, options).toArray()); + else + return type.makeCellName(sliceRestriction.bound(bound, options)); + } + private Iterator applySliceRestriction(final Iterator cells, final QueryOptions options) throws InvalidRequestException { assert sliceRestriction != null; final CellNameType type = cfm.comparator; - final CellName excludedStart = sliceRestriction.isInclusive(Bound.START) ? null : type.makeCellName(sliceRestriction.bound(Bound.START, options)); - final CellName excludedEnd = sliceRestriction.isInclusive(Bound.END) ? null : type.makeCellName(sliceRestriction.bound(Bound.END, options)); + final CellName excludedStart = makeExclusiveSliceBound(Bound.START, type, options); + final CellName excludedEnd = makeExclusiveSliceBound(Bound.END, type, options); return new AbstractIterator() { diff --git a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java index bcf4f27328..4c3ba2a03e 100644 --- a/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java +++ b/test/unit/org/apache/cassandra/cql3/MultiColumnRelationTest.java @@ -24,515 +24,535 @@ public class MultiColumnRelationTest extends CQLTester @Test public void testSingleClusteringInvalidQueries() throws Throwable { - createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))"); + for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) + { + createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))" + compactOption); - assertInvalidSyntax("SELECT * FROM %s WHERE () = (?, ?)", 1, 2); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) = (?) AND (b) > (?)", 0, 0); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) > (?) AND (b) > (?)", 0, 1); - assertInvalid("SELECT * FROM %s WHERE (a, b) = (?, ?)", 0, 0); + assertInvalidSyntax("SELECT * FROM %s WHERE () = (?, ?)", 1, 2); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) = (?) AND (b) > (?)", 0, 0); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) > (?) AND (b) > (?)", 0, 1); + assertInvalid("SELECT * FROM %s WHERE (a, b) = (?, ?)", 0, 0); + } } @Test public void testMultiClusteringInvalidQueries() throws Throwable { - createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))"); + for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) + { + createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))" + compactOption); - assertInvalidSyntax("SELECT * FROM %s WHERE a = 0 AND (b, c) > ()"); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?, ?)", 1, 2, 3); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?)", 1, null); + assertInvalidSyntax("SELECT * FROM %s WHERE a = 0 AND (b, c) > ()"); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?, ?)", 1, 2, 3); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c) > (?, ?)", 1, null); - // Wrong order of columns - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (d, c, b) = (?, ?, ?)", 0, 0, 0); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (d, c, b) > (?, ?, ?)", 0, 0, 0); + // Wrong order of columns + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (d, c, b) = (?, ?, ?)", 0, 0, 0); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (d, c, b) > (?, ?, ?)", 0, 0, 0); - // Wrong number of values - assertInvalid("SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?))", 0, 1); - assertInvalid("SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?, ?, ?, ?))", 0, 1, 2, 3, 4); + // Wrong number of values + assertInvalid("SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?))", 0, 1); + assertInvalid("SELECT * FROM %s WHERE a=0 AND (b, c, d) IN ((?, ?, ?, ?, ?))", 0, 1, 2, 3, 4); - // Missing first clustering column - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (c, d) = (?, ?)", 0, 0); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (c, d) > (?, ?)", 0, 0); + // Missing first clustering column + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (c, d) = (?, ?)", 0, 0); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (c, d) > (?, ?)", 0, 0); - // Nulls - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) IN ((?, ?, ?))", 1, 2, null); + // Nulls + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) IN ((?, ?, ?))", 1, 2, null); - // Wrong type for 'd' - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) = (?, ?, ?)", 1, 2, "foobar"); + // Wrong type for 'd' + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) = (?, ?, ?)", 1, 2, "foobar"); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND b = (?, ?, ?)", 1, 2, 3); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND b = (?, ?, ?)", 1, 2, 3); - // Mix single and tuple inequalities - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) > (?, ?, ?) AND b < ?", 0, 1, 0, 1); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) > (?, ?, ?) AND c < ?", 0, 1, 0, 1); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND b > ? AND (b, c, d) < (?, ?, ?)", 1, 1, 1, 0); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND c > ? AND (b, c, d) < (?, ?, ?)", 1, 1, 1, 0); + // Mix single and tuple inequalities + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) > (?, ?, ?) AND b < ?", 0, 1, 0, 1); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b, c, d) > (?, ?, ?) AND c < ?", 0, 1, 0, 1); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND b > ? AND (b, c, d) < (?, ?, ?)", 1, 1, 1, 0); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND c > ? AND (b, c, d) < (?, ?, ?)", 1, 1, 1, 0); - assertInvalid("SELECT * FROM %s WHERE (a, b, c, d) IN ((?, ?, ?, ?))", 0, 1, 2, 3); - assertInvalid("SELECT * FROM %s WHERE (c, d) IN ((?, ?))", 0, 1); - - assertInvalid("SELECT * FROM %s WHERE a = ? AND (b, c) in ((?, ?), (?, ?)) AND d > ?", 0, 0, 0, 0, 0, 0); + assertInvalid("SELECT * FROM %s WHERE (a, b, c, d) IN ((?, ?, ?, ?))", 0, 1, 2, 3); + assertInvalid("SELECT * FROM %s WHERE (c, d) IN ((?, ?))", 0, 1); + assertInvalid("SELECT * FROM %s WHERE a = ? AND (b, c) in ((?, ?), (?, ?)) AND d > ?", 0, 0, 0, 0, 0, 0); + } } @Test public void testSinglePartitionInvalidQueries() throws Throwable { - createTable("CREATE TABLE %s (a int PRIMARY KEY, b int)"); + for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) + { + createTable("CREATE TABLE %s (a int PRIMARY KEY, b int)" + compactOption); - assertInvalid("SELECT * FROM %s WHERE (a) > (?)", 0); - assertInvalid("SELECT * FROM %s WHERE (a) = (?)", 0); - assertInvalid("SELECT * FROM %s WHERE (b) = (?)", 0); + assertInvalid("SELECT * FROM %s WHERE (a) > (?)", 0); + assertInvalid("SELECT * FROM %s WHERE (a) = (?)", 0); + assertInvalid("SELECT * FROM %s WHERE (b) = (?)", 0); + } } @Test public void testSingleClustering() throws Throwable { - createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))"); + for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) + { + createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))" + compactOption); - execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0); - execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 0); - execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 2, 0); + execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0); + execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 0); + execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 2, 0); - // Equalities + // Equalities - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) = (?)", 0, 1), - row(0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) = (?)", 0, 1), + row(0, 1, 0) + ); - // Same but check the whole tuple can be prepared - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) = ?", 0, tuple(1)), - row(0, 1, 0) - ); + // Same but check the whole tuple can be prepared + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) = ?", 0, tuple(1)), + row(0, 1, 0) + ); - assertEmpty(execute("SELECT * FROM %s WHERE a = ? AND (b) = (?)", 0, 3)); + assertEmpty(execute("SELECT * FROM %s WHERE a = ? AND (b) = (?)", 0, 3)); - // Inequalities + // Inequalities - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?)", 0, 0), - row(0, 1, 0), - row(0, 2, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?)", 0, 0), + row(0, 1, 0), + row(0, 2, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) >= (?)", 0, 1), - row(0, 1, 0), - row(0, 2, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) >= (?)", 0, 1), + row(0, 1, 0), + row(0, 2, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) < (?)", 0, 2), - row(0, 0, 0), - row(0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) < (?)", 0, 2), + row(0, 0, 0), + row(0, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) <= (?)", 0, 1), - row(0, 0, 0), - row(0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) <= (?)", 0, 1), + row(0, 0, 0), + row(0, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?) AND (b) < (?)", 0, 0, 2), - row(0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?) AND (b) < (?)", 0, 0, 2), + row(0, 1, 0) + ); + } } @Test public void testNonEqualsRelation() throws Throwable { - createTable("CREATE TABLE %s (a int PRIMARY KEY, b int)"); - assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) != (0)"); + for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) + { + createTable("CREATE TABLE %s (a int PRIMARY KEY, b int)" + compactOption); + assertInvalid("SELECT * FROM %s WHERE a = 0 AND (b) != (0)"); + } } @Test public void testMultipleClustering() throws Throwable { - createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))"); + for (String compactOption : new String[]{"", " WITH COMPACT STORAGE"}) + { + createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c, d))" + compactOption); - 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, 0, 1, 1); + 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, 0, 1, 1); - 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 (?, ?, ?, ?)", 0, 1, 1, 1); + 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 (?, ?, ?, ?)", 0, 1, 1, 1); - // Empty query - assertEmpty(execute("SELECT * FROM %s WHERE a = 0 AND (b, c, d) IN ()")); + // Empty query + assertEmpty(execute("SELECT * FROM %s WHERE a = 0 AND (b, c, d) IN ()")); - // Equalities + // Equalities - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) = (?)", 0, 1), - row(0, 1, 0, 0), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) = (?)", 0, 1), + row(0, 1, 0, 0), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - // Same with whole tuple prepared - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) = ?", 0, tuple(1)), - row(0, 1, 0, 0), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + // Same with whole tuple prepared + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) = ?", 0, tuple(1)), + row(0, 1, 0, 0), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) = (?, ?)", 0, 1, 1), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) = (?, ?)", 0, 1, 1), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - // Same with whole tuple prepared - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) = ?", 0, tuple(1, 1)), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + // Same with whole tuple prepared + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) = ?", 0, tuple(1, 1)), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) = (?, ?, ?)", 0, 1, 1, 1), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) = (?, ?, ?)", 0, 1, 1, 1), + row(0, 1, 1, 1) + ); - // Same with whole tuple prepared - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) = ?", 0, tuple(1, 1, 1)), - row(0, 1, 1, 1) - ); + // Same with whole tuple prepared + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) = ?", 0, tuple(1, 1, 1)), + row(0, 1, 1, 1) + ); - // Inequalities + // Inequalities - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?)", 0, 0), - row(0, 1, 0, 0), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?)", 0, 0), + row(0, 1, 0, 0), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) >= (?)", 0, 0), - row(0, 0, 0, 0), - row(0, 0, 1, 0), - row(0, 0, 1, 1), - row(0, 1, 0, 0), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) >= (?)", 0, 0), + row(0, 0, 0, 0), + row(0, 0, 1, 0), + row(0, 0, 1, 1), + row(0, 1, 0, 0), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) > (?, ?)", 0, 1, 0), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) > (?, ?)", 0, 1, 0), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) >= (?, ?)", 0, 1, 0), - row(0, 1, 0, 0), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) >= (?, ?)", 0, 1, 0), + row(0, 1, 0, 0), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?)", 0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?)", 0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) >= (?, ?, ?)", 0, 1, 1, 0), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) >= (?, ?, ?)", 0, 1, 1, 0), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) < (?)", 0, 1), - row(0, 0, 0, 0), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) < (?)", 0, 1), + row(0, 0, 0, 0), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) <= (?)", 0, 1), - row(0, 0, 0, 0), - row(0, 0, 1, 0), - row(0, 0, 1, 1), - row(0, 1, 0, 0), - row(0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) <= (?)", 0, 1), + row(0, 0, 0, 0), + row(0, 0, 1, 0), + row(0, 0, 1, 1), + row(0, 1, 0, 0), + row(0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) < (?, ?)", 0, 0, 1), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) < (?, ?)", 0, 0, 1), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) <= (?, ?)", 0, 0, 1), - row(0, 0, 0, 0), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) <= (?, ?)", 0, 0, 1), + row(0, 0, 0, 0), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) < (?, ?, ?)", 0, 0, 1, 1), - row(0, 0, 0, 0), - row(0, 0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) < (?, ?, ?)", 0, 0, 1, 1), + row(0, 0, 0, 0), + row(0, 0, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) <= (?, ?, ?)", 0, 0, 1, 1), - row(0, 0, 0, 0), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) <= (?, ?, ?)", 0, 0, 1, 1), + row(0, 0, 0, 0), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b) < (?)", 0, 0, 1, 0, 1), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b) < (?)", 0, 0, 1, 0, 1), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b, c) < (?, ?)", 0, 0, 1, 1, 1, 1), - row(0, 1, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b, c) < (?, ?)", 0, 0, 1, 1, 1, 1), + row(0, 1, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b, c, d) < (?, ?, ?)", 0, 0, 1, 1, 1, 1, 0), - row(0, 1, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b, c, d) < (?, ?, ?)", 0, 0, 1, 1, 1, 1, 0), + row(0, 1, 0, 0) + ); - // Same with whole tuple prepared - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > ? AND (b, c, d) < ?", 0, tuple(0, 1, 1), tuple(1, 1, 0)), - row(0, 1, 0, 0) - ); + // Same with whole tuple prepared + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > ? AND (b, c, d) < ?", 0, tuple(0, 1, 1), tuple(1, 1, 0)), + row(0, 1, 0, 0) + ); - // reversed - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?) ORDER BY b DESC, c DESC, d DESC", 0, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0), - row(0, 1, 0, 0) - ); + // reversed + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?) ORDER BY b DESC, c DESC, d DESC", 0, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0), + row(0, 1, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) >= (?) ORDER BY b DESC, c DESC, d DESC", 0, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0), - row(0, 1, 0, 0), - row(0, 0, 1, 1), - row(0, 0, 1, 0), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) >= (?) ORDER BY b DESC, c DESC, d DESC", 0, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0), + row(0, 1, 0, 0), + row(0, 0, 1, 1), + row(0, 0, 1, 0), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) > (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 1, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) > (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 1, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) >= (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 1, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0), - row(0, 1, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) >= (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 1, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0), + row(0, 1, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 1, 1, 0), - row(0, 1, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 1, 1, 0), + row(0, 1, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) >= (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 1, 1, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) >= (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 1, 1, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) < (?) ORDER BY b DESC, c DESC, d DESC", 0, 1), - row(0, 0, 1, 1), - row(0, 0, 1, 0), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) < (?) ORDER BY b DESC, c DESC, d DESC", 0, 1), + row(0, 0, 1, 1), + row(0, 0, 1, 0), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) <= (?) ORDER BY b DESC, c DESC, d DESC", 0, 1), - row(0, 1, 1, 1), - row(0, 1, 1, 0), - row(0, 1, 0, 0), - row(0, 0, 1, 1), - row(0, 0, 1, 0), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) <= (?) ORDER BY b DESC, c DESC, d DESC", 0, 1), + row(0, 1, 1, 1), + row(0, 1, 1, 0), + row(0, 1, 0, 0), + row(0, 0, 1, 1), + row(0, 0, 1, 0), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) < (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) < (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) <= (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1), - row(0, 0, 1, 1), - row(0, 0, 1, 0), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) <= (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1), + row(0, 0, 1, 1), + row(0, 0, 1, 0), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) < (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 1), - row(0, 0, 1, 0), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) < (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 1), + row(0, 0, 1, 0), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) <= (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 1), - row(0, 0, 1, 1), - row(0, 0, 1, 0), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) <= (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 1), + row(0, 0, 1, 1), + row(0, 0, 1, 0), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b) < (?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 0, 1), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b) < (?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 0, 1), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b, c) < (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 1, 1, 1), - row(0, 1, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b, c) < (?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 1, 1, 1), + row(0, 1, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b, c, d) < (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 1, 1, 1, 0), - row(0, 1, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) > (?, ?, ?) AND (b, c, d) < (?, ?, ?) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1, 1, 1, 1, 0), + row(0, 1, 0, 0) + ); - // IN + // IN - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))", 0, 0, 1, 0, 0, 1, 1), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))", 0, 0, 1, 0, 0, 1, 1), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - // same query but with whole tuple prepared - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN (?, ?)", 0, tuple(0, 1, 0), tuple(0, 1, 1)), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + // same query but with whole tuple prepared + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN (?, ?)", 0, tuple(0, 1, 0), tuple(0, 1, 1)), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - // same query but with whole IN list prepared - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN ?", 0, list(tuple(0, 1, 0), tuple(0, 1, 1))), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + // same query but with whole IN list prepared + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN ?", 0, list(tuple(0, 1, 0), tuple(0, 1, 1))), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - // same query, but reversed order for the IN values - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN (?, ?)", 0, tuple(0, 1, 1), tuple(0, 1, 0)), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + // same query, but reversed order for the IN values + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN (?, ?)", 0, tuple(0, 1, 1), tuple(0, 1, 0)), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? and (b, c) IN ((?, ?))", 0, 0, 1), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? and (b, c) IN ((?, ?))", 0, 0, 1), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? and (b) IN ((?))", 0, 0), - row(0, 0, 0, 0), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? and (b) IN ((?))", 0, 0), + row(0, 0, 0, 0), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) IN ((?, ?)) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1), - row(0, 0, 1, 1), - row(0, 0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) IN ((?, ?)) ORDER BY b DESC, c DESC, d DESC", 0, 0, 1), + row(0, 0, 1, 1), + row(0, 0, 1, 0) + ); - // IN on both partition key and clustering key - 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, 0, 1, 1); + // IN on both partition key and clustering key + 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, 0, 1, 1); - assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) AND (b, c, d) IN (?, ?)", 0, 1, tuple(0, 1, 0), tuple(0, 1, 1)), - row(0, 0, 1, 0), - row(0, 0, 1, 1), - row(1, 0, 1, 0), - row(1, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) AND (b, c, d) IN (?, ?)", 0, 1, tuple(0, 1, 0), tuple(0, 1, 1)), + row(0, 0, 1, 0), + row(0, 0, 1, 1), + row(1, 0, 1, 0), + row(1, 0, 1, 1) + ); - // same but with whole IN lists prepared - assertRows(execute("SELECT * FROM %s WHERE a IN ? AND (b, c, d) IN ?", list(0, 1), list(tuple(0, 1, 0), tuple(0, 1, 1))), - row(0, 0, 1, 0), - row(0, 0, 1, 1), - row(1, 0, 1, 0), - row(1, 0, 1, 1) - ); + // same but with whole IN lists prepared + assertRows(execute("SELECT * FROM %s WHERE a IN ? AND (b, c, d) IN ?", list(0, 1), list(tuple(0, 1, 0), tuple(0, 1, 1))), + row(0, 0, 1, 0), + row(0, 0, 1, 1), + row(1, 0, 1, 0), + row(1, 0, 1, 1) + ); - // same query, but reversed order for the IN values - assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) AND (b, c, d) IN (?, ?)", 1, 0, tuple(0, 1, 1), tuple(0, 1, 0)), - row(1, 0, 1, 0), - row(1, 0, 1, 1), - row(0, 0, 1, 0), - row(0, 0, 1, 1) - ); + // same query, but reversed order for the IN values + assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) AND (b, c, d) IN (?, ?)", 1, 0, tuple(0, 1, 1), tuple(0, 1, 0)), + row(1, 0, 1, 0), + row(1, 0, 1, 1), + row(0, 0, 1, 0), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) and (b, c) IN ((?, ?))", 0, 1, 0, 1), - row(0, 0, 1, 0), - row(0, 0, 1, 1), - row(1, 0, 1, 0), - row(1, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) and (b, c) IN ((?, ?))", 0, 1, 0, 1), + row(0, 0, 1, 0), + row(0, 0, 1, 1), + row(1, 0, 1, 0), + row(1, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) and (b) IN ((?))", 0, 1, 0), - row(0, 0, 0, 0), - row(0, 0, 1, 0), - row(0, 0, 1, 1), - row(1, 0, 0, 0), - row(1, 0, 1, 0), - row(1, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) and (b) IN ((?))", 0, 1, 0), + row(0, 0, 0, 0), + row(0, 0, 1, 0), + row(0, 0, 1, 1), + row(1, 0, 0, 0), + row(1, 0, 1, 0), + row(1, 0, 1, 1) + ); + } } @Test public void testMultipleClusteringReversedComponents() throws Throwable { - createTable("CREATE TABLE %s (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 (String compactOption : new String[]{"", " COMPACT STORAGE AND"}) + { + createTable("CREATE TABLE %s (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)"); - // b and d are reversed in the clustering order - 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, 1); - execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0); + // b and d are reversed in the clustering order + 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, 1); + execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 1, 0); - 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, 1); - execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0); + 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, 1); + execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?)", 0, 0), - row(0, 1, 0, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) > (?)", 0, 0), + row(0, 1, 0, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) >= (?)", 0, 0), - row(0, 1, 0, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0), - row(0, 0, 0, 0), - row(0, 0, 1, 1), - row(0, 0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) >= (?)", 0, 0), + row(0, 1, 0, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0), + row(0, 0, 0, 0), + row(0, 0, 1, 1), + row(0, 0, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) < (?)", 0, 1), - row(0, 0, 0, 0), - row(0, 0, 1, 1), - row(0, 0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) < (?)", 0, 1), + row(0, 0, 0, 0), + row(0, 0, 1, 1), + row(0, 0, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) <= (?)", 0, 1), - row(0, 1, 0, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0), - row(0, 0, 0, 0), - row(0, 0, 1, 1), - row(0, 0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) <= (?)", 0, 1), + row(0, 1, 0, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0), + row(0, 0, 0, 0), + row(0, 0, 1, 1), + row(0, 0, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))", 0, 1, 1, 1, 0, 1, 1), - row(0, 1, 1, 1), - row(0, 0, 1, 1) - ); + assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))", 0, 1, 1, 1, 0, 1, 1), + row(0, 1, 1, 1), + row(0, 0, 1, 1) + ); - // same query, but reversed order for the IN values - assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))", 0, 0, 1, 1, 1, 1, 1), - row(0, 1, 1, 1), - row(0, 0, 1, 1) - ); + // same query, but reversed order for the IN values + assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c, d) IN ((?, ?, ?), (?, ?, ?))", 0, 0, 1, 1, 1, 1, 1), + row(0, 1, 1, 1), + row(0, 0, 1, 1) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN (?, ?, ?, ?, ?, ?)", - 0, tuple(1, 0, 0), tuple(1, 1, 1), tuple(1, 1, 0), tuple(0, 0, 0), tuple(0, 1, 1), tuple(0, 1, 0)), - row(0, 1, 0, 0), - row(0, 1, 1, 1), - row(0, 1, 1, 0), - row(0, 0, 0, 0), - row(0, 0, 1, 1), - row(0, 0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c, d) IN (?, ?, ?, ?, ?, ?)", + 0, tuple(1, 0, 0), tuple(1, 1, 1), tuple(1, 1, 0), tuple(0, 0, 0), tuple(0, 1, 1), tuple(0, 1, 0)), + row(0, 1, 0, 0), + row(0, 1, 1, 1), + row(0, 1, 1, 0), + row(0, 0, 0, 0), + row(0, 0, 1, 1), + row(0, 0, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) IN (?)", 0, tuple(0, 1)), - row(0, 0, 1, 1), - row(0, 0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) IN (?)", 0, tuple(0, 1)), + row(0, 0, 1, 1), + row(0, 0, 1, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) IN (?)", 0, tuple(0, 0)), - row(0, 0, 0, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b, c) IN (?)", 0, tuple(0, 0)), + row(0, 0, 0, 0) + ); - assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) IN ((?))", 0, 0), - row(0, 0, 0, 0), - row(0, 0, 1, 1), - row(0, 0, 1, 0) - ); + assertRows(execute("SELECT * FROM %s WHERE a = ? AND (b) IN ((?))", 0, 0), + row(0, 0, 0, 0), + row(0, 0, 1, 1), + row(0, 0, 1, 0) + ); - // preserve pre-6875 behavior (even though the query result is technically incorrect) - assertEmpty(execute("SELECT * FROM %s WHERE a = ? AND (b, c) > (?, ?)", 0, 1, 0)); + // preserve pre-6875 behavior (even though the query result is technically incorrect) + assertEmpty(execute("SELECT * FROM %s WHERE a = ? AND (b, c) > (?, ?)", 0, 1, 0)); + } } }