Merge branch 'cassandra-3.0' into cassandra-3.11

This commit is contained in:
Andrés de la Peña 2022-03-10 13:08:38 +00:00
commit fcdb3d154e
4 changed files with 60 additions and 11 deletions

View File

@ -2,6 +2,7 @@
* Validate existence of DCs when repairing (CASSANDRA-17407)
* dropping of a materialized view creates a snapshot with dropped- prefix (CASSANDRA-17415)
Merged from 3.0:
* Disallow CONTAINS for UPDATE and DELETE (CASSANDRA-15266)
* filter out NULL_VERSION entries from peers table in ConfiguredLimit (CASSANDRA-16518)
* Suppress inapplicable CVEs (CASSANDRA-17368)
* Fix flaky test - test_cqlsh_completion.TestCqlshCompletion (CASSANDRA-17338)

View File

@ -152,9 +152,15 @@ public final class StatementRestrictions
* allow two IN for the same entity but that doesn't seem very useful)
* - The value_alias cannot be restricted in any way (we don't support wide rows with indexed value
* in CQL so far)
* - CONTAINS and CONTAINS_KEY cannot be used with UPDATE or DELETE
*/
for (Relation relation : whereClause.relations)
{
if ((relation.isContains() || relation.isContainsKey()) && (type.isUpdate() || type.isDelete()))
{
throw invalidRequest("Cannot use %s with %s", type, relation.operator());
}
if (relation.operator() == Operator.IS_NOT)
{
if (!forView)

View File

@ -162,6 +162,27 @@ public class DeleteTest extends CQLTester
row("abc", 4, "xyz", "some other value"));
}
@Test
public void testDeletionWithContainsAndContainsKey() throws Throwable
{
createTable("CREATE TABLE %s (a int, b frozen<map<int, int>>, c int, primary key (a, b))");
Object[] row = row(1, map(1, 1, 2, 2), 3);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", row);
assertRows(execute("SELECT * FROM %s"), row);
assertInvalidMessage("Cannot use DELETE with CONTAINS",
"DELETE FROM %s WHERE a=1 AND b CONTAINS 1");
assertRows(execute("SELECT * FROM %s"), row);
assertInvalidMessage("Cannot use DELETE with CONTAINS KEY",
"DELETE FROM %s WHERE a=1 AND b CONTAINS KEY 1");
assertRows(execute("SELECT * FROM %s"), row);
}
/**
* Test deletion by 'composite prefix' (range tombstones)
* migrated from cql_tests.py:TestCQL.range_tombstones_test()
@ -489,7 +510,7 @@ public class DeleteTest extends CQLTester
assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
"DELETE FROM %s WHERE partitionKey > ? ", 0);
assertInvalidMessage("Cannot use CONTAINS on non-collection column partitionkey",
assertInvalidMessage("Cannot use DELETE with CONTAINS",
"DELETE FROM %s WHERE partitionKey CONTAINS ?", 0);
// Non primary key in the where clause
@ -581,7 +602,7 @@ public class DeleteTest extends CQLTester
assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
"DELETE FROM %s WHERE partitionKey > ? AND clustering = ?", 0, 1);
assertInvalidMessage("Cannot use CONTAINS on non-collection column partitionkey",
assertInvalidMessage("Cannot use DELETE with CONTAINS",
"DELETE FROM %s WHERE partitionKey CONTAINS ? AND clustering = ?", 0, 1);
// Non primary key in the where clause
@ -711,7 +732,7 @@ public class DeleteTest extends CQLTester
assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
"DELETE FROM %s WHERE partitionKey > ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
assertInvalidMessage("Cannot use CONTAINS on non-collection column partitionkey",
assertInvalidMessage("Cannot use DELETE with CONTAINS",
"DELETE FROM %s WHERE partitionKey CONTAINS ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
// Non primary key in the where clause
@ -1124,17 +1145,17 @@ public class DeleteTest extends CQLTester
assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
"DELETE FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND value = ?", 3, 3, 3);
assertInvalidMessage("Non PRIMARY KEY columns found in where clause: values",
assertInvalidMessage("Cannot use DELETE with CONTAINS",
"DELETE FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND values CONTAINS ?", 3, 3, 3);
assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
"DELETE FROM %s WHERE partitionKey = ? AND value = ?", 3, 3);
assertInvalidMessage("Non PRIMARY KEY columns found in where clause: values",
assertInvalidMessage("Cannot use DELETE with CONTAINS",
"DELETE FROM %s WHERE partitionKey = ? AND values CONTAINS ?", 3, 3);
assertInvalidMessage("Some partition key parts are missing: partitionkey",
"DELETE FROM %s WHERE clustering_1 = ?", 3);
assertInvalidMessage("Some partition key parts are missing: partitionkey",
"DELETE FROM %s WHERE value = ?", 3);
assertInvalidMessage("Some partition key parts are missing: partitionkey",
assertInvalidMessage("Cannot use DELETE with CONTAINS",
"DELETE FROM %s WHERE values CONTAINS ?", 3);
}

View File

@ -182,7 +182,7 @@ public class UpdateTest extends CQLTester
assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
"UPDATE %s SET value = ? WHERE partitionKey > ? AND clustering_1 = ?", 7, 0, 1);
assertInvalidMessage("Cannot use CONTAINS on non-collection column partitionkey",
assertInvalidMessage("Cannot use UPDATE with CONTAINS",
"UPDATE %s SET value = ? WHERE partitionKey CONTAINS ? AND clustering_1 = ?", 7, 0, 1);
assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
@ -193,6 +193,27 @@ public class UpdateTest extends CQLTester
}
}
@Test
public void testUpdateWithContainsAndContainsKey() throws Throwable
{
createTable("CREATE TABLE %s (a int, b frozen<map<int, int>>, c int, primary key (a, b))");
Object[] row = row(1, map(1, 1, 2, 2), 3);
execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", row);
assertRows(execute("SELECT * FROM %s"), row);
assertInvalidMessage("Cannot use UPDATE with CONTAINS",
"UPDATE %s SET c=3 WHERE a=1 AND b CONTAINS 1");
assertRows(execute("SELECT * FROM %s"), row);
assertInvalidMessage("Cannot use UPDATE with CONTAINS KEY",
"UPDATE %s SET c=3 WHERE a=1 AND b CONTAINS KEY 1");
assertRows(execute("SELECT * FROM %s"), row);
}
@Test
public void testUpdateWithSecondaryIndices() throws Throwable
{
@ -222,17 +243,17 @@ public class UpdateTest extends CQLTester
assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
"UPDATE %s SET values= {6} WHERE partitionKey = ? AND clustering_1 = ? AND value = ?", 3, 3, 3);
assertInvalidMessage("Non PRIMARY KEY columns found in where clause: values",
assertInvalidMessage("Cannot use UPDATE with CONTAINS",
"UPDATE %s SET value= ? WHERE partitionKey = ? AND clustering_1 = ? AND values CONTAINS ?", 6, 3, 3, 3);
assertInvalidMessage("Some clustering keys are missing: clustering_1",
"UPDATE %s SET values= {6} WHERE partitionKey = ? AND value = ?", 3, 3);
assertInvalidMessage("Some clustering keys are missing: clustering_1",
assertInvalidMessage("Cannot use UPDATE with CONTAINS",
"UPDATE %s SET value= ? WHERE partitionKey = ? AND values CONTAINS ?", 6, 3, 3);
assertInvalidMessage("Some partition key parts are missing: partitionkey",
"UPDATE %s SET values= {6} WHERE clustering_1 = ?", 3);
assertInvalidMessage("Some partition key parts are missing: partitionkey",
"UPDATE %s SET values= {6} WHERE value = ?", 3);
assertInvalidMessage("Some partition key parts are missing: partitionkey",
assertInvalidMessage("Cannot use UPDATE with CONTAINS",
"UPDATE %s SET value= ? WHERE values CONTAINS ?", 6, 3);
}
@ -369,7 +390,7 @@ public class UpdateTest extends CQLTester
assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
"UPDATE %s SET value = ? WHERE partitionKey > ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
assertInvalidMessage("Cannot use CONTAINS on non-collection column partitionkey",
assertInvalidMessage("Cannot use UPDATE with CONTAINS",
"UPDATE %s SET value = ? WHERE partitionKey CONTAINS ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",