Details
-
Bug
-
Status: Resolved
-
Normal
-
Resolution: Fixed
-
None
-
Arch Linux x64, kernel 4.7.6, Cassandra 3.9 downloaded from the website
-
Normal
Description
When deleting from a table with a certain structure and using an in clause with an empty list, the in clause with an empty list can be ignored, resulting in deleting more than is expected.
Setup:
cqlsh> create table test (a text, b text, id uuid, primary key ((a, b), id)); cqlsh> insert into test (a, b, id) values ('a', 'b', 00000000-0000-0000-0000-000000000000); cqlsh> insert into test (a, b, id) values ('b', 'c', 00000000-0000-0000-0000-000000000000); cqlsh> insert into test (a, b, id) values ('a', 'c', 00000000-0000-0000-0000-000000000000); cqlsh> select * from test; a | b | id ---+---+-------------------------------------- a | c | 00000000-0000-0000-0000-000000000000 b | c | 00000000-0000-0000-0000-000000000000 a | b | 00000000-0000-0000-0000-000000000000 (3 rows)
Expected:
cqlsh> delete from test where a = 'a' and b in ('a', 'b', 'c') and id in (); cqlsh> select * from test; a | b | id ---+---+-------------------------------------- a | c | 00000000-0000-0000-0000-000000000000 b | c | 00000000-0000-0000-0000-000000000000 a | b | 00000000-0000-0000-0000-000000000000 (3 rows)
Actual:
cqlsh> delete from test where a = 'a' and b in ('a', 'b', 'c') and id in (); cqlsh> select * from test; a | b | id ---+---+-------------------------------------- b | c | 00000000-0000-0000-0000-000000000000 (1 rows)
Instead of deleting nothing, as the final empty in clause would imply, it instead deletes everything that matches the first two clauses, acting as if the following query had been issued instead:
cqlsh> delete from test where a = 'a' and b in ('a', 'b', 'c');
This seems to be related to the presence of a tuple clustering key, as I could not reproduce it without one.