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);