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

David Capwell commented on CASSANDRA-19637:
-------------------------------------------

I was curious so tried to run this in Accord to see what happens...

{code}
String cql = "BEGIN TRANSACTION\n" +
                         "LET a = (SELECT * FROM "+qualifiedTableName+" WHERE 
k=?);\n" +
                         "SELECT a.v >= null;\n" +
                         "IF a.v >= null THEN\n" +
                         "  INSERT INTO " + qualifiedTableName + "(k, v) VALUES 
(?, ?);\n" +
                         "END IF\n" +
                         "COMMIT TRANSACTION";
{code}

* both the SELECT and the IF reject the syntax of a.v >= null, right now we use 
"IS NULL" and "IS NOT NULL" here...
* SELECT doesn't allow "a.v IS NULL", so if you wish to know if your if block 
was taken, then there isn't a way to do that in this case?
* when dropping the select and switching to "IS NULL", I had the following bind 
values: 0, 0, [].  When I query the table it returns [0, null].  // Empty and 
Null look the same
* Testing out ">= []" ; select doesn't allow but IF does.  The statement was 
false as the row doesn't exist (null >= [] is false).  When we add row [0, []] 
we and change insert to do [0, [42]] the if statement is now true!  a.v was 
written as an empty list, so is it not "null" internally but instead byte[0]?


> LWT conditions on MultiCell collections return invalid results
> --------------------------------------------------------------
>
>                 Key: CASSANDRA-19637
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-19637
>             Project: Cassandra
>          Issue Type: Bug
>          Components: CQL/Semantics
>            Reporter: Benjamin Lerer
>            Assignee: Benjamin Lerer
>            Priority: Normal
>
> Due to the way multicell collections are implemented, it is not possible to 
> differentiate between {{null}} and empty collections like it is feasible for 
> single cell (frozen) collections. Therefore an empty multicell collection 
> will always be treated as {{null}}.
> Unfortunately, the way LWT conditions handle that is not consistent with that.
> For example for {{colA list<int>}} non null: {code}.. IF colA >= null{code} 
> will throw an invalid request error whereas {code}..IF colA >= []{code} will 
> returns {{true}}.
> Moreover, if we insert an empty list through:
> {code}INSERT INTO mytable (pk, colA) VALUES (1, []);{code}
> and use {code}DELETE FROM mytable WHERE pk=1 IF colA >= []{code} the returned 
> results will be {code}{false, null}{code}. Which can be quite confusing.
> The way to fix that behaviour to make it consistent with other operations is 
> to consider empty multicell collection input as {{null}} and reject the 
> {{null}} input for non {{=}} and {{!=}} operators.    
>   



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org
For additional commands, e-mail: commits-h...@cassandra.apache.org

Reply via email to