[ 
https://issues.apache.org/jira/browse/CASSANDRA-12829?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15695706#comment-15695706
 ] 

Benjamin Lerer commented on CASSANDRA-12829:
--------------------------------------------

Thanks for the patch and sorry for the delay.

Your approach is working but if the query has an {{IN}} restriction on the 
primary key the {{clusterings}} and the {{UpdateParameters}} will be computed 
multiple times.
Replacing {{clusterings.isEmpty()}} by 
{{!restrictions.hasClusteringColumnsRestriction()}} would have apparently been 
enough to fix the problem. Did you have a reason for doing more changes? (I 
just want to be sure that I did not miss anything).

While playing with the tests I noticed that conditional deletions with empty 
{{IN}} restrictions on the clustering key were also broken.
The problem can be reproduced with the following test:
{code}
    @Test
    public void testEmptyInWithConditions() throws Throwable
    {
        createTable("CREATE TABLE %s (a int, b int, c int, d int, s int static, 
PRIMARY KEY ((a,b), c))");
        execute("INSERT INTO %s (a,b,c,d,s) VALUES (?,?,?,?,?)",1,1,1,1,1);
        execute("INSERT INTO %s (a,b,c,d,s) VALUES (?,?,?,?,?)",1,1,2,2,1);
        execute("INSERT INTO %s (a,b,c,d,s) VALUES (?,?,?,?,?)",1,1,3,3,1);
        
        execute("DELETE FROM %s WHERE a = 1 AND b = 1 AND c IN () IF d = 1;");
        assertRows(execute("SELECT * FROM %s"),
                   row(1,1,1,1,1),
                   row(1,1,2,1,2),
                   row(1,1,3,1,3));
    }
{code}

On the test side, I think that the tests should be moved to {{UpdateTest}} and 
{{DeleteTest}} as they clearly belongs there. It might also be good to add some 
tests with empty {{IN}} conditions on the partition keys as well as some tests 
with mutliple clustering columns.

> DELETE query with an empty IN clause can delete more than expected
> ------------------------------------------------------------------
>
>                 Key: CASSANDRA-12829
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-12829
>             Project: Cassandra
>          Issue Type: Bug
>          Components: CQL
>         Environment: Arch Linux x64, kernel 4.7.6, Cassandra 3.9 downloaded 
> from the website
>            Reporter: Jason T. Bradshaw
>            Assignee: Alex Petrov
>
> 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:*
> {code}
> 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)
> {code}
> *Expected:*
> {code}
> 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)
> {code}
> *Actual:*
> {code}
> 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)
> {code}
> 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:
> {code}
> cqlsh> delete from test where a = 'a' and b in ('a', 'b', 'c');
> {code}
> This seems to be related to the presence of a tuple clustering key, as I 
> could not reproduce it without one.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to