Seems to me that this should use the same behavior as a counter unless IF
EXISTS is supplied.

I can see a solid argument for failing though, if the argument is that only
counters behave that way, vs increment / decrement.



On Fri, Jun 21, 2024 at 4:32 PM Josh McKenzie <jmcken...@apache.org> wrote:

> What about aborting the transaction / raising an exception if you try and
> do an incremental operator against a non-existent PK?
>
> The reasonable inferred intent of the user is to change a value that's
> expected to be there, so if it's not there it's an error case right?
> Otherwise you'd append "IF EXISTS".
>
> On Fri, Jun 21, 2024, at 1:56 AM, Caleb Rackliffe wrote:
>
> It does, but the primary reason it does is that it is setting a value, not
> incrementing one. When we’re setting a value, we don’t care what was there
> before. Incrementing a value is not possible in a non-transitional update,
> hence this thread…
>
> On Jun 20, 2024, at 5:17 PM, Bernardo Botella <
> conta...@bernardobotella.com> wrote:
>
> Doesn’t an UPDATE statement creates a row if the partition key does not
> exist? That’s also confirmed by the official Cassandra documentation here
> <https://cassandra.apache.org/doc/stable/cassandra/cql/dml.html#update-statement>
> :
>
> ”Unlike in SQL, UPDATE does not check the prior existence of the row by
> default. The row is created if none existed before, and updated otherwise.
> Furthermore, there is no means of knowing which action occurred.”
>
> That being the case, I think the second option you mention is what keeps
> consistency with the UPDATEs out of the transaction.
>
> Kind regards,
> Bernardo
>
> On Jun 20, 2024, at 1:54 PM, Caleb Rackliffe <calebrackli...@gmail.com>
> wrote:
>
> We had a bug report a while back from Luis E Fernandez and team in
> CASSANDRA-18988 <https://issues.apache.org/jira/browse/CASSANDRA-18988>
> around the behavior of increments/decrements on numeric fields for
> non-existent rows. Consider the following, wich can be run on the
> cep-15-accord branch:
>
> CREATE KEYSPACE accord WITH replication = {'class': 'SimpleStrategy', 
> 'replication_factor': '1'} AND durable_writes = true
>
>
> CREATE TABLE accord.accounts (
>     partition text,
>     account_id int,
>     balance int,
>     PRIMARY KEY (partition, account_id)
> ) WITH CLUSTERING ORDER BY (account_id ASC) AND transactional_mode='full'
>
>
> BEGIN TRANSACTION
>     INSERT INTO accord.accounts (partition, account_id, balance) VALUES 
> ('default', 0, 100);
>     INSERT INTO accord.accounts (partition, account_id, balance) VALUES 
> ('default', 1, 100);
> COMMIT TRANSACTION
>
>
> BEGIN TRANSACTION
>     UPDATE accord.accounts SET balance -= 10 WHERE partition = 'default' AND 
> account_id = 1;
>     UPDATE accord.accounts SET balance += 10 WHERE partition = 'default' AND 
> account_id = 3;
> COMMIT TRANSACTION
>
>
> Reading the 'default' partition will produce the following result.
>
>
>  partition | account_id | balance
> -----------+------------+---------
>    default |          0 |     100
>    default |          1 |      90
>
>
> As you will notice, we have not implicitly inserted a row for account_id 3, 
> which does not exist when we request that its balance be incremented by 10. 
> This is by design, as null + 10 == null.
>
>
> Before I close CASSANDRA-18988 
> <https://issues.apache.org/jira/browse/CASSANDRA-18988>, *I'd like to confirm 
> with everyone reading this that the behavior above is reasonable*. The only 
> other option I've seen proposed that would make sense is perhaps producing a 
> result like:
>
>
>  partition | account_id | balance
> -----------+------------+---------
>    default |          0 |     100
>    default |          1 |      90
>
>    default |          3 |    null
>
>
> Note however that this is exactly what we would produce if we had first 
> inserted a row w/ no value for balance:
>
>
> INSERT INTO accord.accounts (partition, account_id) VALUES ('default', 3);
>
>
>

Reply via email to