[ https://issues.apache.org/jira/browse/CASSANDRA-5443?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Sylvain Lebresne updated CASSANDRA-5443: ---------------------------------------- Attachment: 0004-Support-tombstones-when-comparing-for-CAS.txt 0003-Handle-deleted-and-expiring-column-in-paxos-updates.txt 0002-Add-syntax-to-support-conditional-update-delete.txt 0001-Refactor-Update-and-Delete-statement-to-extract-common.txt Attaching patches for this. The first patch is a refactor whose goal is to make the 2nd patch, the one that add the new bits, easier. That refactor also cleans up those statements somewhat by better sharing code that is common. The 2nd patch adds the following syntax: {noformat} UPDATE test SET v1 = 5, v2 = 'foobar', v3 = 5 WHERE k = 0 IF v1 = 3 AND v2 = 'foo'; DELETE v2 FROM test WHERE k = 0 IF v1 = 5; {noformat} A few remarks on that syntax: * Despites my earlier comments, I've left off the {{ATOMICALLY}} and I admit it's seducing to just have the {{IF}} and nothing more. That being said, I still think that simplify has a downside, which is that it doesn't emphasis much that an update with or without IF have very different perfomance characteristics. But let's say I'm now leaning more towards a simpler syntax and making sure we're clear on the performance impact in documentations. * I've used {{AND}} to separate conditions. The other option would be to use a comma to mimick the SET clause, but it felt a {{AND}} was sounding better after a {{IF}}. The 2 last patches fix small "bugs" with the paxos code itself (and can be committed independently): * patch 3 fixes make sure we don't correctly preserve deleted and expiring columns in paxos updates. * patch 4 tweaks the CAS comparison to handle correctly deleted columns in "expected". That allows to support condition like "IF v1 = null". Now there is a few things that don't work yet: # updating a row if it doesn't exist yet is not supported. To be more precise, we do handle {{null}} in conditions, but that's only good for non primary key components. And I'm not sure allowing PK columns in conditions would be a good solution because I'm not sure {noformat} UPDATE test SET v1 = 5, v2 = 'foobar' WHERE k = 0 IF k = null {noformat} really carries the intent very well (the {{WHERE}} and {{IF}} _sound_ contradictory). Also, the fact that {noformat} UPDATE test SET v1 = 5, v2 = 'foobar' WHERE k = 0 IF k = 1 {noformat} suggests to me that it's not really the right syntax. Lastly, it would require a bit of ugly special casing in the code (not a blocker but ...). # the code ignores completely the consistency level so far. That part is basically pending CASSANDRA-5442. # the code does support sets and maps in conditions, but lists are *not* supported (an InvalidRequestException is thrown is a list is in the conditions). The reason is that for lists, the cell name contains a server side generated timeuuid, and so we would need to make sure the timeuuids in the _expected_ CF we build match the current ones. And well, that's doable but will require some special additional code so I've left it off for now. Last but not least, so far the code returns a resultset with one boolean column named 'result' (so like in my comment above). We can easily change that to a count of 0 or 1 expressing the number of affected rows as discussed above, but as said I'm not fully convinced by that idea yet. One of the reason being that if we do ever allow conditional updates in batches (which would be doable, at least for UNLOGGED ones), the number of affected rows wouldn't cut it anymore. Now, to be fair, the current 1 column resultSet wouldn't work either, but that's why my suggestion would be to change that to return one column per partition key (since we do CAS at that level). So for instance {noformat} UPDATE test SET v1 = 5, v2 = 'foobar', v3 = 5 WHERE k = 0 IF v1 = 3 AND v2 = 'foo'; {noformat} would return the following result set: {noformat} upd(k = 0) ---------- true {noformat} so basically the same thing that with the attached patch except that the column result would indicate the value of the partition key updated, which would work if we do add batches (the one downside being that if people starts to use large blobs as partition keys it'll get messy, but not sure that's a big concern). Opinions? > Add CAS CQL support > ------------------- > > Key: CASSANDRA-5443 > URL: https://issues.apache.org/jira/browse/CASSANDRA-5443 > Project: Cassandra > Issue Type: Sub-task > Components: API, Core > Reporter: Jonathan Ellis > Assignee: Sylvain Lebresne > Fix For: 2.0 > > Attachments: > 0001-Refactor-Update-and-Delete-statement-to-extract-common.txt, > 0002-Add-syntax-to-support-conditional-update-delete.txt, > 0003-Handle-deleted-and-expiring-column-in-paxos-updates.txt, > 0004-Support-tombstones-when-comparing-for-CAS.txt > > -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira