[ 
https://issues.apache.org/jira/browse/CASSANDRA-9200?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14541556#comment-14541556
 ] 

Robert Stupp commented on CASSANDRA-9200:
-----------------------------------------

The linked branch contains an implementation of sequences. The code is still 
ugly but works including utests.

Syntax is explained in {{CQL.textile}} like this:

{code}
<create-sequence-stmt> ::= CREATE ( OR REPLACE )? SEQUENCE ( IF NOT EXISTS )?
                         ( <keyspace> '.' )? <sequencename>
                         ( INCREMENT ( BY )? <integer> )?
                         ( ( MINVALUE <integer> ) | ( NO MINVALUE ) )?
                         ( ( MAXVALUE <integer> ) | ( NO MAXVALUE ) )?
                         ( START ( WITH )? <integer> )?
                         ( CACHE <integer> )?
                         ( CACHE LOCAL <integer> )?
                         ( SERIAL CONSISTENCY LEVEL <consistencyLevel> )?
                         ( CONSISTENCY LEVEL <consistencyLevel> )?
{code}

Access to sequences:
{code}
SELECT nextval('keyspace_name', 'sequence_name') FROM table;
{code}


The implementation uses three tables:
# {{system.schema_sequences}} holding the sequence definitions
# {{system_distributed.seq_reservations}}  tracking the next available sequence 
value
# {{system.sequence_local}} tracking the range of values exclusively assigned 
to a node

Notes:
* {{CACHE}} defines the number of values to acquire from the overall range 
({{system_distributed.seq_reservations}}).
* {{CACHE LOCAL}} (defaults to {{CACHE}}) defines the number of values to take 
from {{system.sequence_local}} - not sure whether to keep that option. It's not 
really necessary and its only limited use is when a node crashes without being 
gracefully shut down.
* the consistency levels are those used to read from/modify 
{{system_distributed.seq_reservations}}
* I've not included a {{CYCLE}} option. Reason for that is that it would 
require a global synchronization of all nodes to ensure that no node still owns 
a range before wrapping around.
* It also has some limited support for permissions (CASSANDRA-9372).
* {{SELECT nextval}} would benefit from virtual tables (CASSANDRA-7622) - i.e. 
{{SELECT nextval(...) FROM DUAL}}
* Implementation of {{nextval()}} function requires to pass constant values to 
function arguments (sneaked into the branch)


> Sequences
> ---------
>
>                 Key: CASSANDRA-9200
>                 URL: https://issues.apache.org/jira/browse/CASSANDRA-9200
>             Project: Cassandra
>          Issue Type: New Feature
>            Reporter: Jonathan Ellis
>            Assignee: Robert Stupp
>             Fix For: 3.x
>
>
> UUIDs are usually the right choice for surrogate keys, but sometimes 
> application constraints dictate an increasing numeric value.
> We could do this by using LWT to reserve "blocks" of the sequence for each 
> member of the cluster, which would eliminate paxos contention at the cost of 
> not being strictly increasing.
> PostgreSQL syntax: 
> http://www.postgresql.org/docs/9.4/static/sql-createsequence.html



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to