| /* |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| */ |
| package org.apache.cassandra.cql3.validation.operations; |
| |
| import java.util.Arrays; |
| |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| import static junit.framework.Assert.assertNull; |
| import static org.junit.Assert.assertEquals; |
| |
| import org.apache.cassandra.config.DatabaseDescriptor; |
| import org.apache.cassandra.cql3.CQLTester; |
| import org.apache.cassandra.cql3.UntypedResultSet; |
| import org.apache.cassandra.cql3.restrictions.StatementRestrictions; |
| import org.apache.cassandra.dht.ByteOrderedPartitioner; |
| |
| /** |
| * SELECT statement tests that require a ByteOrderedPartitioner |
| */ |
| public class SelectOrderedPartitionerTest extends CQLTester |
| { |
| @BeforeClass |
| public static void setUp() |
| { |
| DatabaseDescriptor.setPartitionerUnsafe(ByteOrderedPartitioner.instance); |
| } |
| |
| @Test |
| public void testTokenAndIndex() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))"); |
| createIndex("CREATE INDEX ON %s(c)"); |
| |
| for (int i = 0; i < 10; i++) |
| { |
| execute("INSERT INTO %s (a,b,c,d) VALUES (?, ?, ?, ?)", i, i, i, i); |
| execute("INSERT INTO %s (a,b,c,d) VALUES (?, ?, ?, ?)", i, i + 10, i + 10, i + 10); |
| } |
| |
| beforeAndAfterFlush(() -> { |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token(8) AND a = 9 AND c = 9 ALLOW FILTERING"), |
| row(9, 9, 9, 9)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token(8) AND a > 8 AND c = 9 ALLOW FILTERING"), |
| row(9, 9, 9, 9)); |
| }); |
| } |
| |
| @Test |
| public void testFilteringOnAllPartitionKeysWithTokenRestriction() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))"); |
| |
| for (int i = 0; i < 10; i++) |
| { |
| execute("INSERT INTO %s (a,b,c,d) VALUES (?, ?, ?, ?)", i, i, i, i); |
| execute("INSERT INTO %s (a,b,c,d) VALUES (?, ?, ?, ?)", i, i + 10, i + 10, i + 10); |
| } |
| |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a, b) > token(10, 10)")); |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a, b) > token(10, 10) AND a < 8 AND b < 8 ALLOW FILTERING")); |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(5, 5) AND a < 8 AND b < 8 ALLOW FILTERING"), |
| row(6, 6, 6, 6), |
| row(7, 7, 7, 7)); |
| } |
| |
| @Test |
| public void testFilteringOnPartitionKeyWithToken() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))"); |
| createIndex("CREATE INDEX ON %s(d)"); |
| |
| for (int i = 0; i < 10; i++) |
| { |
| execute("INSERT INTO %s (a,b,c,d) VALUES (?, ?, ?, ?)", i, i, i, i); |
| execute("INSERT INTO %s (a,b,c,d) VALUES (?, ?, ?, ?)", i, i + 10, i + 10, i + 10); |
| } |
| |
| beforeAndAfterFlush(() -> { |
| assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE token(a, b) > token(5, 10) AND b < 8 ALLOW FILTERING"), |
| row(6, 6, 6, 6), |
| row(7, 7, 7, 7)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(8, 10) AND a = 9 ALLOW FILTERING"), |
| row(9, 9, 9, 9), |
| row(9, 19, 19, 19)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(8, 10) AND a = 9 AND d = 9 ALLOW FILTERING"), |
| row(9, 9, 9, 9)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(8, 10) AND a > 8 AND b > 8 AND d = 9 ALLOW FILTERING"), |
| row(9, 9, 9, 9)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE a = 9 AND b = 9 AND token(a, b) > token(8, 10) AND d = 9 ALLOW FILTERING"), |
| row(9, 9, 9, 9)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(8, 10) AND a = 9 AND c = 19 ALLOW FILTERING"), |
| row(9, 19, 19, 19)); |
| |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a, b) = token(8, 8) AND b = 9 ALLOW FILTERING")); |
| }); |
| } |
| |
| @Test |
| public void testTokenAndCollections() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a frozen<map<int, int>>, b int, c int, PRIMARY KEY (a, b))"); |
| |
| for (int i = 0; i < 10; i++) |
| { |
| execute("INSERT INTO %s (a,b,c) VALUES (?, ?, ?)", map(i, i), i, i); |
| execute("INSERT INTO %s (a,b,c) VALUES (?, ?, ?)", map(i, i, 100, 200), i + 10, i + 10); |
| } |
| |
| beforeAndAfterFlush(() -> { |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token({0: 0}) AND a CONTAINS KEY 9 ALLOW FILTERING"), |
| row(map(9, 9), 9, 9), |
| row(map(9, 9, 100, 200), 19, 19)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token({0: 0}) AND a CONTAINS KEY 9 AND a CONTAINS 200 ALLOW FILTERING"), |
| row(map(9, 9, 100, 200), 19, 19)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token({0: 0}) AND a CONTAINS KEY 9 AND b = 19 ALLOW FILTERING"), |
| row(map(9, 9, 100, 200), 19, 19)); |
| }); |
| } |
| |
| |
| @Test |
| public void testTokenFunctionWithSingleColumnPartitionKey() throws Throwable |
| { |
| createTable("CREATE TABLE IF NOT EXISTS %s (a int PRIMARY KEY, b text)"); |
| execute("INSERT INTO %s (a, b) VALUES (0, 'a')"); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(?)", 0), row(0, "a")); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(?) and token(a) < token(?)", 0, 1), row(0, "a")); |
| assertInvalid("SELECT * FROM %s WHERE token(a) > token(?)", "a"); |
| assertInvalidMessage("The token() function must contains only partition key components", |
| "SELECT * FROM %s WHERE token(a, b) >= token(?, ?)", "b", 0); |
| assertInvalidMessage("More than one restriction was found for the start bound on a", |
| "SELECT * FROM %s WHERE token(a) >= token(?) and token(a) >= token(?)", 0, 1); |
| assertInvalidMessage("Columns \"a\" cannot be restricted by both an equality and an inequality relation", |
| "SELECT * FROM %s WHERE token(a) >= token(?) and token(a) = token(?)", 0, 1); |
| assertInvalidSyntax("SELECT * FROM %s WHERE token(a) = token(?) and token(a) IN (token(?))", 0, 1); |
| |
| assertInvalidMessage("More than one restriction was found for the start bound on a", |
| "SELECT * FROM %s WHERE token(a) > token(?) AND token(a) > token(?)", 1, 2); |
| assertInvalidMessage("More than one restriction was found for the end bound on a", |
| "SELECT * FROM %s WHERE token(a) <= token(?) AND token(a) < token(?)", 1, 2); |
| assertInvalidMessage("Columns \"a\" cannot be restricted by both an equality and an inequality relation", |
| "SELECT * FROM %s WHERE token(a) > token(?) AND token(a) = token(?)", 1, 2); |
| assertInvalidMessage("a cannot be restricted by more than one relation if it includes an Equal", |
| "SELECT * FROM %s WHERE token(a) = token(?) AND token(a) > token(?)", 1, 2); |
| } |
| |
| @Test |
| public void testTokenFunctionWithPartitionKeyAndClusteringKeyArguments() throws Throwable |
| { |
| createTable("CREATE TABLE IF NOT EXISTS %s (a int, b text, PRIMARY KEY (a, b))"); |
| assertInvalidMessage("The token() function must contains only partition key components", |
| "SELECT * FROM %s WHERE token(a, b) > token(0, 'c')"); |
| } |
| |
| @Test |
| public void testTokenFunctionWithMultiColumnPartitionKey() throws Throwable |
| { |
| createTable("CREATE TABLE IF NOT EXISTS %s (a int, b text, PRIMARY KEY ((a, b)))"); |
| execute("INSERT INTO %s (a, b) VALUES (0, 'a')"); |
| execute("INSERT INTO %s (a, b) VALUES (0, 'b')"); |
| execute("INSERT INTO %s (a, b) VALUES (0, 'c')"); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(?, ?)", 0, "a"), |
| row(0, "b"), |
| row(0, "c")); |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(?, ?) and token(a, b) < token(?, ?)", |
| 0, "a", |
| 0, "d"), |
| row(0, "b"), |
| row(0, "c")); |
| assertInvalidMessage("The token() function must be applied to all partition key components or none of them", |
| "SELECT * FROM %s WHERE token(a) > token(?) and token(b) > token(?)", 0, "a"); |
| assertInvalidMessage("The token() function must be applied to all partition key components or none of them", |
| "SELECT * FROM %s WHERE token(a) > token(?, ?) and token(a) < token(?, ?) and token(b) > token(?, ?) ", |
| 0, "a", 0, "d", 0, "a"); |
| assertInvalidMessage("The token function arguments must be in the partition key order: a, b", |
| "SELECT * FROM %s WHERE token(b, a) > token(0, 'c')"); |
| assertInvalidMessage("The token() function must be applied to all partition key components or none of them", |
| "SELECT * FROM %s WHERE token(a, b) > token(?, ?) and token(b) < token(?, ?)", 0, "a", 0, "a"); |
| assertInvalidMessage("The token() function must be applied to all partition key components or none of them", |
| "SELECT * FROM %s WHERE token(a) > token(?, ?) and token(b) > token(?, ?)", 0, "a", 0, "a"); |
| } |
| |
| @Test |
| public void testSingleColumnPartitionKeyWithTokenNonTokenRestrictionsMix() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a int primary key, b int)"); |
| |
| execute("INSERT INTO %s (a, b) VALUES (0, 0);"); |
| execute("INSERT INTO %s (a, b) VALUES (1, 1);"); |
| execute("INSERT INTO %s (a, b) VALUES (2, 2);"); |
| execute("INSERT INTO %s (a, b) VALUES (3, 3);"); |
| execute("INSERT INTO %s (a, b) VALUES (4, 4);"); |
| assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?);", 1, 3), |
| row(1, 1), |
| row(3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a)> token(?) and token(a) <= token(?);", 1, 3), |
| row(2, 2), |
| row(3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a)= token(2);"), |
| row(2, 2)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) <= token(?) AND a IN (?, ?);", |
| 1, 3, 1, 3), |
| row(3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) < token(?) AND token(a) >= token(?) AND a IN (?, ?);", |
| 1, 3, 1, 3), |
| row(3, 3)); |
| assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE, |
| "SELECT * FROM %s WHERE token(a) > token(?) AND token(a) <= token(?) AND a > ?;", 1, 3, 1); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) <= token(?) AND a IN ?;", |
| 1, 3, Arrays.asList(1, 3)), |
| row(3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND a = ?;", 1, 3), |
| row(3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE a = ? AND token(a) > token(?);", 3, 1), |
| row(3, 3)); |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a) > token(?) AND a = ?;", 3, 1)); |
| assertEmpty(execute("SELECT * FROM %s WHERE a = ? AND token(a) > token(?);", 1, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND a IN (?, ?);", 2, 1, 3), |
| row(3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) < token(?) AND a IN (?, ?) ;", 2, 5, 1, 3), |
| row(3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE a IN (?, ?) AND token(a) > token(?) AND token(a) < token(?);", 1, 3, 2, 5), |
| row(3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) > token(?) AND a IN (?, ?) AND token(a) < token(?);", 2, 1, 3, 5), |
| row(3, 3)); |
| assertEmpty(execute("SELECT * FROM %s WHERE a IN (?, ?) AND token(a) > token(?);", 1, 3, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) <= token(?) AND a = ?;", 2, 2), |
| row(2, 2)); |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a) <= token(?) AND a = ?;", 2, 3)); |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a) = token(?) AND a = ?;", 2, 3)); |
| assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(?) AND token(a) <= token(?) AND a = ?;", 2, 2, 2), |
| row(2, 2)); |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a) >= token(?) AND token(a) < token(?) AND a = ?;", 2, 2, 2)); |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) <= token(?) AND a = ?;", 2, 2, 2)); |
| assertEmpty(execute("SELECT * FROM %s WHERE token(a) > token(?) AND token(a) < token(?) AND a = ?;", 2, 2, 2)); |
| } |
| |
| @Test |
| public void testMultiColumnPartitionKeyWithTokenNonTokenRestrictionsMix() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a int, b int, c int, primary key((a, b)))"); |
| |
| execute("INSERT INTO %s (a, b, c) VALUES (0, 0, 0);"); |
| execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 1);"); |
| execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 2);"); |
| execute("INSERT INTO %s (a, b, c) VALUES (1, 0, 3);"); |
| execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 4);"); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(?, ?);", 0, 0), |
| row(0, 1, 1), |
| row(0, 2, 2), |
| row(1, 0, 3), |
| row(1, 1, 4)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(?, ?) AND a = ? AND b IN (?, ?);", |
| 0, 0, 1, 0, 1), |
| row(1, 0, 3), |
| row(1, 1, 4)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE a = ? AND token(a, b) > token(?, ?) AND b IN (?, ?);", |
| 1, 0, 0, 0, 1), |
| row(1, 0, 3), |
| row(1, 1, 4)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) > token(?, ?) AND a = ?;", |
| 0, 1, 0, 0, 1), |
| row(1, 0, 3), |
| row(1, 1, 4)); |
| |
| assertEmpty(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) > token(?, ?) AND token(a, b) < token(?, ?) AND a = ?;", |
| 0, 1, 0, 0, 0, 0, 1)); |
| |
| assertEmpty(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) > token(?, ?) AND token(a, b) <= token(?, ?) AND a = ?;", |
| 0, 1, 0, 0, 0, 0, 1)); |
| |
| assertEmpty(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) >= token(?, ?) AND token(a, b) < token(?, ?) AND a = ?;", |
| 0, 1, 0, 0, 0, 0, 1)); |
| |
| assertEmpty(execute("SELECT * FROM %s WHERE b IN (?, ?) AND token(a, b) = token(?, ?) AND a = ?;", |
| 0, 1, 0, 0, 1)); |
| |
| assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE, |
| "SELECT * FROM %s WHERE token(a, b) > token(?, ?) AND a = ?;", 0, 0, 1); |
| } |
| |
| @Test |
| public void testMultiColumnPartitionKeyWithIndexAndTokenNonTokenRestrictionsMix() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a int, b int, c int, primary key((a, b)))"); |
| createIndex("CREATE INDEX ON %s(b)"); |
| createIndex("CREATE INDEX ON %s(c)"); |
| |
| execute("INSERT INTO %s (a, b, c) VALUES (0, 0, 0);"); |
| execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 1);"); |
| execute("INSERT INTO %s (a, b, c) VALUES (0, 2, 2);"); |
| execute("INSERT INTO %s (a, b, c) VALUES (1, 0, 3);"); |
| execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 4);"); |
| |
| assertRows(execute("SELECT * FROM %s WHERE b = ?;", 1), |
| row(0, 1, 1), |
| row(1, 1, 4)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE token(a, b) > token(?, ?) AND b = ?;", 0, 0, 1), |
| row(0, 1, 1), |
| row(1, 1, 4)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE b = ? AND token(a, b) > token(?, ?);", 1, 0, 0), |
| row(0, 1, 1), |
| row(1, 1, 4)); |
| |
| assertRows(execute("SELECT * FROM %s WHERE b = ? AND token(a, b) > token(?, ?) and c = ? ALLOW FILTERING;", 1, 0, 0, 4), |
| row(1, 1, 4)); |
| } |
| |
| @Test |
| public void testTokenFunctionWithCompoundPartitionAndClusteringCols() throws Throwable |
| { |
| createTable("CREATE TABLE IF NOT EXISTS %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c, d))"); |
| // just test that the queries don't error |
| execute("SELECT * FROM %s WHERE token(a, b) > token(0, 0) AND c > 10 ALLOW FILTERING;"); |
| execute("SELECT * FROM %s WHERE c > 10 AND token(a, b) > token(0, 0) ALLOW FILTERING;"); |
| execute("SELECT * FROM %s WHERE token(a, b) > token(0, 0) AND (c, d) > (0, 0) ALLOW FILTERING;"); |
| execute("SELECT * FROM %s WHERE (c, d) > (0, 0) AND token(a, b) > token(0, 0) ALLOW FILTERING;"); |
| } |
| |
| /** |
| * Test undefined columns |
| * migrated from cql_tests.py:TestCQL.undefined_column_handling_test() |
| */ |
| @Test |
| public void testUndefinedColumns() throws Throwable |
| { |
| createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int,)"); |
| |
| execute("INSERT INTO %s (k, v1, v2) VALUES (0, 0, 0)"); |
| execute("INSERT INTO %s (k, v1) VALUES (1, 1)"); |
| execute("INSERT INTO %s (k, v1, v2) VALUES (2, 2, 2)"); |
| |
| Object[][] rows = getRows(execute("SELECT v2 FROM %s")); |
| assertEquals(0, rows[0][0]); |
| assertEquals(null, rows[1][0]); |
| assertEquals(2, rows[2][0]); |
| |
| rows = getRows(execute("SELECT v2 FROM %s WHERE k = 1")); |
| assertEquals(1, rows.length); |
| assertNull(rows[0][0]); |
| } |
| |
| /** |
| * Check table with only a PK (#4361), |
| * migrated from cql_tests.py:TestCQL.only_pk_test() |
| */ |
| @Test |
| public void testPrimaryKeyOnly() throws Throwable |
| { |
| createTable("CREATE TABLE %s (k int, c int, PRIMARY KEY (k, c))"); |
| |
| for (int k = 0; k < 2; k++) |
| for (int c = 0; c < 2; c++) |
| execute("INSERT INTO %s (k, c) VALUES (?, ?)", k, c); |
| |
| assertRows(execute("SELECT * FROM %s"), |
| row(0, 0), |
| row(0, 1), |
| row(1, 0), |
| row(1, 1)); |
| |
| // Check for dense tables too |
| createTable(" CREATE TABLE %s (k int, c int, PRIMARY KEY (k, c)) WITH COMPACT STORAGE"); |
| |
| for (int k = 0; k < 2; k++) |
| for (int c = 0; c < 2; c++) |
| execute("INSERT INTO %s (k, c) VALUES (?, ?)", k, c); |
| |
| assertRows(execute("SELECT * FROM %s"), |
| row(0, 0), |
| row(0, 1), |
| row(1, 0), |
| row(1, 1)); |
| } |
| |
| /** |
| * Migrated from cql_tests.py:TestCQL.composite_index_with_pk_test() |
| */ |
| @Test |
| public void testCompositeIndexWithPK() throws Throwable |
| { |
| createTable("CREATE TABLE %s (blog_id int, time1 int, time2 int, author text, content text, PRIMARY KEY (blog_id, time1, time2))"); |
| |
| createIndex("CREATE INDEX ON %s(author)"); |
| |
| execute("INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, ?)", 1, 0, 0, "foo", "bar1"); |
| execute("INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, ?)", 1, 0, 1, "foo", "bar2"); |
| execute("INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, ?)", 2, 1, 0, "foo", "baz"); |
| execute("INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, ?)", 3, 0, 1, "gux", "qux"); |
| |
| assertRows(execute("SELECT blog_id, content FROM %s WHERE author='foo'"), |
| row(1, "bar1"), |
| row(1, "bar2"), |
| row(2, "baz")); |
| |
| assertRows(execute("SELECT blog_id, content FROM %s WHERE time1 > 0 AND author='foo' ALLOW FILTERING"), |
| row(2, "baz")); |
| |
| assertRows(execute("SELECT blog_id, content FROM %s WHERE time1 = 1 AND author='foo' ALLOW FILTERING"), |
| row(2, "baz")); |
| |
| assertRows(execute("SELECT blog_id, content FROM %s WHERE time1 = 1 AND time2 = 0 AND author='foo' ALLOW FILTERING"), |
| row(2, "baz")); |
| |
| assertEmpty(execute("SELECT content FROM %s WHERE time1 = 1 AND time2 = 1 AND author='foo' ALLOW FILTERING")); |
| |
| assertEmpty(execute("SELECT content FROM %s WHERE time1 = 1 AND time2 > 0 AND author='foo' ALLOW FILTERING")); |
| |
| assertInvalid("SELECT content FROM %s WHERE time2 >= 0 AND author='foo'"); |
| |
| assertInvalid("SELECT blog_id, content FROM %s WHERE time1 > 0 AND author='foo'"); |
| assertInvalid("SELECT blog_id, content FROM %s WHERE time1 = 1 AND author='foo'"); |
| assertInvalid("SELECT blog_id, content FROM %s WHERE time1 = 1 AND time2 = 0 AND author='foo'"); |
| assertInvalid("SELECT content FROM %s WHERE time1 = 1 AND time2 = 1 AND author='foo'"); |
| assertInvalid("SELECT content FROM %s WHERE time1 = 1 AND time2 > 0 AND author='foo'"); |
| } |
| |
| /** |
| * Test for LIMIT bugs from 4579, |
| * migrated from cql_tests.py:TestCQL.limit_bugs_test() |
| */ |
| @Test |
| public void testLimitBug() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY (a, b))"); |
| |
| execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 1, 1, 1, 1);"); |
| execute("INSERT INTO %s (a, b, c, d, e) VALUES (2, 2, 2, 2, 2);"); |
| execute("INSERT INTO %s (a, b, c, d, e) VALUES (3, 3, 3, 3, 3);"); |
| execute("INSERT INTO %s (a, b, c, d, e) VALUES (4, 4, 4, 4, 4);"); |
| |
| assertRows(execute("SELECT * FROM %s"), |
| row(1, 1, 1, 1, 1), |
| row(2, 2, 2, 2, 2), |
| row(3, 3, 3, 3, 3), |
| row(4, 4, 4, 4, 4)); |
| |
| assertRows(execute("SELECT * FROM %s LIMIT 1"), |
| row(1, 1, 1, 1, 1)); |
| |
| assertRows(execute("SELECT * FROM %s LIMIT 2"), |
| row(1, 1, 1, 1, 1), |
| row(2, 2, 2, 2, 2)); |
| |
| createTable("CREATE TABLE %s (a int primary key, b int, c int,)"); |
| |
| execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 1)"); |
| execute("INSERT INTO %s (a, b, c) VALUES (2, 2, 2)"); |
| execute("INSERT INTO %s (a, b, c) VALUES (3, 3, 3)"); |
| execute("INSERT INTO %s (a, b, c) VALUES (4, 4, 4)"); |
| |
| assertRows(execute("SELECT * FROM %s"), |
| row(1, 1, 1), |
| row(2, 2, 2), |
| row(3, 3, 3), |
| row(4, 4, 4)); |
| |
| assertRows(execute("SELECT * FROM %s LIMIT 1"), |
| row(1, 1, 1)); |
| |
| assertRows(execute("SELECT * FROM %s LIMIT 2"), |
| row(1, 1, 1), |
| row(2, 2, 2)); |
| |
| assertRows(execute("SELECT * FROM %s LIMIT 3"), |
| row(1, 1, 1), |
| row(2, 2, 2), |
| row(3, 3, 3)); |
| |
| assertRows(execute("SELECT * FROM %s LIMIT 4"), |
| row(1, 1, 1), |
| row(2, 2, 2), |
| row(3, 3, 3), |
| row(4, 4, 4)); |
| |
| assertRows(execute("SELECT * FROM %s LIMIT 5"), |
| row(1, 1, 1), |
| row(2, 2, 2), |
| row(3, 3, 3), |
| row(4, 4, 4)); |
| } |
| |
| /** |
| * Test for #4612 bug and more generally order by when multiple C* rows are queried |
| * migrated from cql_tests.py:TestCQL.order_by_multikey_test() |
| */ |
| @Test |
| public void testOrderByMultikey() throws Throwable |
| { |
| createTable("CREATE TABLE %s (my_id varchar, col1 int, col2 int, value varchar, PRIMARY KEY (my_id, col1, col2))"); |
| |
| execute("INSERT INTO %s (my_id, col1, col2, value) VALUES ( 'key1', 1, 1, 'a');"); |
| execute("INSERT INTO %s (my_id, col1, col2, value) VALUES ( 'key2', 3, 3, 'a');"); |
| execute("INSERT INTO %s (my_id, col1, col2, value) VALUES ( 'key3', 2, 2, 'b');"); |
| execute("INSERT INTO %s (my_id, col1, col2, value) VALUES ( 'key4', 2, 1, 'b');"); |
| |
| assertRows(execute("SELECT col1 FROM %s WHERE my_id in('key1', 'key2', 'key3') ORDER BY col1"), |
| row(1), row(2), row(3)); |
| |
| assertRows(execute("SELECT col1, value, my_id, col2 FROM %s WHERE my_id in('key3', 'key4') ORDER BY col1, col2"), |
| row(2, "b", "key4", 1), row(2, "b", "key3", 2)); |
| |
| assertInvalid("SELECT col1 FROM %s ORDER BY col1"); |
| assertInvalid("SELECT col1 FROM %s WHERE my_id > 'key1' ORDER BY col1"); |
| } |
| |
| /** |
| * Migrated from cql_tests.py:TestCQL.composite_index_collections_test() |
| */ |
| @Test |
| public void testIndexOnCompositeWithCollections() throws Throwable |
| { |
| createTable("CREATE TABLE %s (blog_id int, time1 int, time2 int, author text, content set<text>, PRIMARY KEY (blog_id, time1, time2))"); |
| |
| createIndex("CREATE INDEX ON %s (author)"); |
| |
| execute("INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, { 'bar1', 'bar2' })", 1, 0, 0, "foo"); |
| execute("INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, { 'bar2', 'bar3' })", 1, 0, 1, "foo"); |
| execute("INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, { 'baz' })", 2, 1, 0, "foo"); |
| execute("INSERT INTO %s (blog_id, time1, time2, author, content) VALUES (?, ?, ?, ?, { 'qux' })", 3, 0, 1, "gux"); |
| |
| assertRows(execute("SELECT blog_id, content FROM %s WHERE author='foo'"), |
| row(1, set("bar1", "bar2")), |
| row(1, set("bar2", "bar3")), |
| row(2, set("baz"))); |
| } |
| |
| /** |
| * Migrated from cql_tests.py:TestCQL.truncate_clean_cache_test() |
| */ |
| @Test |
| public void testTruncateWithCaching() throws Throwable |
| { |
| createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int) WITH CACHING = { 'keys': 'ALL', 'rows_per_partition': 'ALL' };"); |
| |
| for (int i = 0; i < 3; i++) |
| execute("INSERT INTO %s (k, v1, v2) VALUES (?, ?, ?)", i, i, i * 2); |
| |
| assertRows(execute("SELECT v1, v2 FROM %s WHERE k IN (0, 1, 2)"), |
| row(0, 0), |
| row(1, 2), |
| row(2, 4)); |
| |
| execute("TRUNCATE %s"); |
| |
| assertEmpty(execute("SELECT v1, v2 FROM %s WHERE k IN (0, 1, 2)")); |
| } |
| |
| /** |
| * Migrated from cql_tests.py:TestCQL.range_key_ordered_test() |
| */ |
| @Test |
| public void testRangeKey() throws Throwable |
| { |
| createTable("CREATE TABLE %s (k int PRIMARY KEY)"); |
| |
| execute("INSERT INTO %s (k) VALUES (-1)"); |
| execute("INSERT INTO %s (k) VALUES ( 0)"); |
| execute("INSERT INTO %s (k) VALUES ( 1)"); |
| |
| assertRows(execute("SELECT * FROM %s"), |
| row(0), |
| row(1), |
| row(-1)); |
| |
| assertInvalid("SELECT * FROM %s WHERE k >= -1 AND k < 1"); |
| } |
| |
| @Test |
| public void testTokenFunctionWithInvalidColumnNames() throws Throwable |
| { |
| createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))"); |
| assertInvalidMessage("Undefined column name e", "SELECT * FROM %s WHERE token(a, e) = token(0, 0)"); |
| assertInvalidMessage("Undefined column name e", "SELECT * FROM %s WHERE token(a, e) > token(0, 1)"); |
| assertInvalidMessage("Undefined column name e", "SELECT b AS e FROM %s WHERE token(a, e) = token(0, 0)"); |
| assertInvalidMessage("Undefined column name e", "SELECT b AS e FROM %s WHERE token(a, e) > token(0, 1)"); |
| } |
| } |