cql-pytest: translate Cassandra's reproducers for issue #2963
This is a translation of Cassandra's CQL unit test source file validation/entities/SecondaryIndexOnStaticColumnTest.java into our our cql-pytest framework. This test file checks various features of indexing (with secondary index) static rows. All these tests pass on Cassandra, but fail on Scylla because of issue #2963 - we do not yet support indexing of a static row. The failing test currently fail as soon as they try to create the index, with the message: "Indexing static columns is not implemented yet." Refs #2963. Signed-off-by: Nadav Har'El <nyh@scylladb.com> Message-Id: <20210411153014.311090-1-nyh@scylladb.com>
This commit is contained in:
committed by
Piotr Sarna
parent
989589b570
commit
2932f20b40
@@ -0,0 +1,203 @@
|
||||
# This file was translated from the original Java test from the Apache
|
||||
# Cassandra source repository, as of commit 6ca34f81386dc8f6020cdf2ea4246bca2a0896c5
|
||||
#
|
||||
# The original Apache Cassandra license:
|
||||
#
|
||||
# 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.
|
||||
|
||||
from cassandra_tests.porting import *
|
||||
|
||||
|
||||
@pytest.mark.xfail(reason="issues #2963")
|
||||
def testSimpleStaticColumn(cql, test_keyspace):
|
||||
with create_table(cql, test_keyspace, "(id int, name text, age int static, PRIMARY KEY (id, name))") as table:
|
||||
cql.execute(f"CREATE INDEX static_age on {table}(age)")
|
||||
id1 = 1
|
||||
id2 = 2
|
||||
age1 = 24
|
||||
age2 = 32
|
||||
name1A = "Taylor"
|
||||
name1B = "Swift"
|
||||
name2 = "Jamie"
|
||||
|
||||
execute(cql, table, "INSERT INTO %s (id, name, age) VALUES (?, ?, ?)", id1, name1A, age1)
|
||||
execute(cql, table, "INSERT INTO %s (id, name, age) VALUES (?, ?, ?)", id1, name1B, age1)
|
||||
execute(cql, table, "INSERT INTO %s (id, name, age) VALUES (?, ?, ?)", id2, name2, age2)
|
||||
|
||||
assert_rows(execute(cql, table, "SELECT id, name, age FROM %s WHERE age=?", age1),
|
||||
[id1, name1B, age1], [id1, name1A, age1])
|
||||
assert_rows(execute(cql, table, "SELECT id, name, age FROM %s WHERE age=?", age2),
|
||||
[id2, name2, age2])
|
||||
|
||||
# Update the rows. Validate that updated values will be reflected in the index.
|
||||
newAge1 = 40
|
||||
execute(cql, table, "UPDATE %s SET age = ? WHERE id = ?", newAge1, id1)
|
||||
assert_empty(execute(cql, table, "SELECT id, name, age FROM %s WHERE age=?", age1))
|
||||
assert_rows(execute(cql, table, "SELECT id, name, age FROM %s WHERE age=?", newAge1),
|
||||
[id1, name1B, newAge1], [id1, name1A, newAge1])
|
||||
execute(cql, table, "DELETE FROM %s WHERE id = ?", id2)
|
||||
assert_empty(execute(cql, table, "SELECT id, name, age FROM %s WHERE age=?", age2))
|
||||
|
||||
|
||||
@pytest.mark.xfail(reason="issues #2963")
|
||||
def testIndexOnCompoundRowKey(cql, test_keyspace):
|
||||
with create_table(cql, test_keyspace, "(interval text, seq int, id int, severity int static, PRIMARY KEY ((interval, seq), id) ) WITH CLUSTERING ORDER BY (id DESC)") as table:
|
||||
execute(cql, table, "CREATE INDEX ON %s (severity)")
|
||||
|
||||
execute(cql, table, "insert into %s (interval, seq, id , severity) values('t',1, 3, 10)")
|
||||
execute(cql, table, "insert into %s (interval, seq, id , severity) values('t',1, 4, 10)")
|
||||
execute(cql, table, "insert into %s (interval, seq, id , severity) values('t',2, 3, 10)")
|
||||
execute(cql, table, "insert into %s (interval, seq, id , severity) values('t',2, 4, 10)")
|
||||
execute(cql, table, "insert into %s (interval, seq, id , severity) values('m',1, 3, 11)")
|
||||
execute(cql, table, "insert into %s (interval, seq, id , severity) values('m',1, 4, 11)")
|
||||
execute(cql, table, "insert into %s (interval, seq, id , severity) values('m',2, 3, 11)")
|
||||
execute(cql, table, "insert into %s (interval, seq, id , severity) values('m',2, 4, 11)")
|
||||
|
||||
assert_rows(execute(cql, table, "select * from %s where severity = 10 and interval = 't' and seq = 1"),
|
||||
["t", 1, 4, 10], ["t", 1, 3, 10])
|
||||
|
||||
@pytest.mark.xfail(reason="issues #2963")
|
||||
def testIndexOnCollections(cql, test_keyspace):
|
||||
with create_table(cql, test_keyspace, "(k int, v int, l list<int> static, s set<text> static, m map<text, int> static, PRIMARY KEY (k, v))") as table:
|
||||
execute(cql, table, "CREATE INDEX ON %s (l)")
|
||||
execute(cql, table, "CREATE INDEX ON %s (s)")
|
||||
execute(cql, table, "CREATE INDEX ON %s (m)")
|
||||
execute(cql, table, "CREATE INDEX ON %s (keys(m))")
|
||||
|
||||
execute(cql, table, "INSERT INTO %s (k, v, l, s, m) VALUES (0, 0, [1, 2], {'a'}, {'a' : 1, 'b' : 2})")
|
||||
execute(cql, table, "INSERT INTO %s (k, v) VALUES (0, 1) ")
|
||||
execute(cql, table, "INSERT INTO %s (k, v, l, s, m) VALUES (1, 0, [4, 5], {'d'}, {'b' : 1, 'c' : 4})")
|
||||
|
||||
# lists
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE l CONTAINS 1"), [0, 0], [0, 1])
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE k = 1 AND l CONTAINS 1"))
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE l CONTAINS 4"), [1, 0])
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE l CONTAINS 6"))
|
||||
|
||||
# update lists
|
||||
execute(cql, table, "UPDATE %s SET l = l + [3] WHERE k = ?", 0)
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE l CONTAINS 3"), [0, 0], [0, 1])
|
||||
|
||||
# sets
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE s CONTAINS 'a'"), [0, 0], [0, 1])
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE k = 0 AND s CONTAINS 'a'"), [0, 0], [0, 1])
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE s CONTAINS 'd'"), [1, 0])
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE s CONTAINS 'e'"))
|
||||
|
||||
# update sets
|
||||
execute(cql, table, "UPDATE %s SET s = s + {'b'} WHERE k = ?", 0)
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE s CONTAINS 'b'"), [0, 0], [0, 1])
|
||||
execute(cql, table, "UPDATE %s SET s = s - {'a'} WHERE k = ?", 0)
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE s CONTAINS 'a'"))
|
||||
|
||||
# maps
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS 1"), [1, 0], [0, 0], [0, 1])
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE k = 0 AND m CONTAINS 1"), [0, 0], [0, 1])
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS 4"), [1, 0])
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS 5"))
|
||||
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS KEY 'b'"), [1, 0], [0, 0], [0, 1])
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE k = 0 AND m CONTAINS KEY 'b'"), [0, 0], [0, 1])
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS KEY 'c'"), [1, 0])
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS KEY 'd'"))
|
||||
|
||||
# update maps.
|
||||
execute(cql, table, "UPDATE %s SET m['c'] = 5 WHERE k = 0")
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS 5"), [0, 0], [0, 1])
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS KEY 'c'"), [1, 0], [0, 0], [0, 1])
|
||||
execute(cql, table, "DELETE m['a'] FROM %s WHERE k = 0")
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE m CONTAINS KEY 'a'"))
|
||||
|
||||
@pytest.mark.xfail(reason="issues #2963")
|
||||
def testIndexOnFrozenCollections(cql, test_keyspace):
|
||||
with create_table(cql, test_keyspace, "(k int, v int, l frozen<list<int>> static, s frozen<set<text>> static, m frozen<map<text, int>> static, PRIMARY KEY (k, v))") as table:
|
||||
execute(cql, table, "CREATE INDEX ON %s (FULL(l))")
|
||||
execute(cql, table, "CREATE INDEX ON %s (FULL(s))")
|
||||
execute(cql, table, "CREATE INDEX ON %s (FULL(m))")
|
||||
|
||||
execute(cql, table, "INSERT INTO %s (k, v, l, s, m) VALUES (0, 0, [1, 2], {'a'}, {'a' : 1, 'b' : 2})")
|
||||
execute(cql, table, "INSERT INTO %s (k, v) VALUES (0, 1) ")
|
||||
execute(cql, table, "INSERT INTO %s (k, v, l, s, m) VALUES (1, 0, [4, 5], {'d'}, {'b' : 1, 'c' : 4})")
|
||||
execute(cql, table, "UPDATE %s SET l=[3], s={'3'}, m={'3': 3} WHERE k=3" )
|
||||
|
||||
# lists
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE l = [1, 2]"), [0, 0], [0, 1])
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE k = 1 AND l = [1, 2]"))
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE l = [4]"))
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE l = [3]"), [3, None])
|
||||
|
||||
# update lists
|
||||
execute(cql, table, "UPDATE %s SET l = [1, 2, 3] WHERE k = ?", 0)
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE l = [1, 2]"))
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE l = [1, 2, 3]"), [0, 0], [0, 1])
|
||||
|
||||
# sets
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE s = {'a'}"), [0, 0], [0, 1])
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE k = 1 AND s = {'a'}"))
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE s = {'b'}"))
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE s = {'3'}"), [3, None])
|
||||
|
||||
# update sets
|
||||
execute(cql, table, "UPDATE %s SET s = {'a', 'b'} WHERE k = ?", 0)
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE s = {'a'}"))
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE s = {'a', 'b'}"), [0, 0], [0, 1])
|
||||
|
||||
# maps
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m = {'a' : 1, 'b' : 2}"), [0, 0], [0, 1])
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE k = 1 AND m = {'a' : 1, 'b' : 2}"))
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE m = {'a' : 1, 'b' : 3}"))
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE m = {'a' : 1, 'c' : 2}"))
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m = {'3': 3}"), [3, None])
|
||||
|
||||
# update maps.
|
||||
execute(cql, table, "UPDATE %s SET m = {'a': 2, 'b': 3} WHERE k = ?", 0)
|
||||
assert_empty(execute(cql, table, "SELECT k, v FROM %s WHERE m = {'a': 1, 'b': 2}"))
|
||||
assert_rows(execute(cql, table, "SELECT k, v FROM %s WHERE m = {'a': 2, 'b': 3}"), [0, 0], [0, 1])
|
||||
|
||||
@pytest.mark.xfail(reason="issues #2963")
|
||||
def testStaticIndexAndNonStaticIndex(cql, test_keyspace):
|
||||
with create_table(cql, test_keyspace, "(id int, company text, age int static, salary int, PRIMARY KEY(id, company))") as table:
|
||||
execute(cql, table, "CREATE INDEX on %s(age)")
|
||||
execute(cql, table, "CREATE INDEX on %s(salary)")
|
||||
|
||||
company1 = "company1"
|
||||
company2 = "company2"
|
||||
|
||||
execute(cql, table, "INSERT INTO %s(id, company, age, salary) VALUES(?, ?, ?, ?)", 1, company1, 20, 1000)
|
||||
execute(cql, table, "INSERT INTO %s(id, company, salary) VALUES(?, ?, ?)", 1, company2, 2000)
|
||||
execute(cql, table, "INSERT INTO %s(id, company, age, salary) VALUES(?, ?, ?, ?)", 2, company1, 40, 2000)
|
||||
|
||||
assert_rows(execute(cql, table, "SELECT id, company, age, salary FROM %s WHERE age = 20 AND salary = 2000 ALLOW FILTERING"),
|
||||
[1, company2, 20, 2000])
|
||||
|
||||
@pytest.mark.xfail(reason="issues #2963")
|
||||
def testIndexOnUDT(cql, test_keyspace):
|
||||
with create_type(cql, test_keyspace, "(street text, city text)") as type_name:
|
||||
with create_table(cql, test_keyspace, f"(id int, company text, home frozen<{type_name}> static, price int, PRIMARY KEY(id, company))") as table:
|
||||
execute(cql, table, "CREATE INDEX on %s(home)")
|
||||
|
||||
addressString = "{street: 'Centre', city: 'C'}"
|
||||
companyName = "Random"
|
||||
|
||||
execute(cql, table, "INSERT INTO %s(id, company, home, price) "
|
||||
+ "VALUES(1, '" + companyName + "', " + addressString + ", 10000)")
|
||||
assert_rows(execute(cql, table, "SELECT id, company FROM %s WHERE home = " + addressString), [1, companyName])
|
||||
newAddressString = "{street: 'Fifth', city: 'P'}"
|
||||
|
||||
execute(cql, table, "UPDATE %s SET home = " + newAddressString + " WHERE id = 1")
|
||||
assert_empty(execute(cql, table, "SELECT id, company FROM %s WHERE home = " + addressString))
|
||||
assert_rows(execute(cql, table, "SELECT id, company FROM %s WHERE home = " + newAddressString), [1, companyName])
|
||||
Reference in New Issue
Block a user