[ 
https://issues.apache.org/jira/browse/CASSANDRA-20479?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

David Capwell updated CASSANDRA-20479:
--------------------------------------
    Resolution: Won't Fix
        Status: Resolved  (was: Triage Needed)

confirmed this behavior existed in 4.1, so isn't a change in behavior.

> Inconsistent semantic when CAS condition is on a UDT column
> -----------------------------------------------------------
>
>                 Key: CASSANDRA-20479
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-20479
>             Project: Apache Cassandra
>          Issue Type: Bug
>          Components: Feature/Lightweight Transactions
>            Reporter: David Capwell
>            Priority: Normal
>
> {code}
> @Test
> public void test() throws IOException
> {
>     try (Cluster cluster = Cluster.build(1).start())
>     {
>         var inst = cluster.get(1);
>         init(cluster);
>         cluster.schemaChange(withKeyspace("CREATE TYPE %s.foo(f1 int)"));
>         cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl(pk int, v0 
> foo, v1 int, PRIMARY KEY(pk))"));
>         inst.executeInternal(withKeyspace("INSERT INTO %s.tbl(pk, v1) VALUES 
> (?, ?)"), 0, 0);
>         AssertUtils.assertRows(inst.executeInternal(withKeyspace("SELECT * 
> FROM %s.tbl WHERE v0=? ALLOW FILTERING"), ByteBufferUtil.EMPTY_BYTE_BUFFER),
>                                rows());
>     }
> }
> {code}
> This fails with 
> {code}
> org.apache.cassandra.exceptions.InvalidRequestException: Non-frozen UDT 
> column 'v0' (foo) cannot be restricted by any relation
>       at 
> org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest(RequestValidations.java:370)
>       at 
> org.apache.cassandra.cql3.statements.RequestValidations.checkTrue(RequestValidations.java:97)
>       at 
> org.apache.cassandra.cql3.statements.RequestValidations.checkFalse(RequestValidations.java:223)
>       at org.apache.cassandra.cql3.Operator.validateFor(Operator.java:964)
> {code}
> But we allow this in a CAS condition
> {code}
> @Test
> public void test2() throws IOException
> {
>     try (Cluster cluster = Cluster.build(1).start())
>     {
>         var coord = cluster.coordinator(1);
>         init(cluster);
>         cluster.schemaChange(withKeyspace("CREATE TYPE %s.foo(f1 int)"));
>         cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl(pk int, v0 
> foo, v1 int, PRIMARY KEY(pk))"));
>         coord.execute(withKeyspace("UPDATE %s.tbl SET v1=? WHERE pk=? IF 
> v0=?"), ConsistencyLevel.QUORUM, 0, 0, ByteBufferUtil.EMPTY_BYTE_BUFFER);
>         AssertUtils.assertRows(coord.execute(withKeyspace("SELECT * FROM 
> %s.tbl"), ConsistencyLevel.SERIAL),
>                                rows());
>     }
> }
> {code}
> This test fails differently, it fails because the condition actually applied!
> {code}
> java.lang.AssertionError: Expected: []
> Actual: [[0, null, 0]]
> {code}
> The reason this happens is we don’t seem to validate the operations like we 
> do in the WHERE clause, and 
> org.apache.cassandra.cql3.Operator#isSatisfiedBy(org.apache.cassandra.db.marshal.MultiElementType<?>,
>  org.apache.cassandra.db.rows.ComplexColumnData, java.nio.ByteBuffer) defines 
> the following
> {code}
> if (elements.isEmpty())
>     return leftOperand == null;
> {code}
> Since the row doesn’t exist, leftOperand is null, and elements is empty 
> (tuple of null values != null logically).



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

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to