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