Skip to content

Commit

Permalink
[Feature] Issue #41 Sequence Engine
Browse files Browse the repository at this point in the history
Description:
------------
SEQUENCE engine as an embedded logical engine, it mainly used to generate unique number,
it is the middle layer engine that use InnoDB or other storage engine as the based table engine,
All query on sequence table will be changed into the operation on based table.
the cache or other sequence value management is decided by SEQUENCE engine handler.

According to the setting which is defined by 'CREATE SEQUENCE ... ' or 'CREATE SEQUENCE TABLE... + INSERT VALUES'.
user can query the nextval or currval from sequence.
In order to distinguish the normal SELECT statement, we supply new Syntax 'SELECT NEXTVAL FOR SEQUENCE';
  1. 'SELECT NEXTVAL FROM SEQUENCE' will return the based table record directly.
  2. 'SELECT NEXTVAL FOR SEQUENCE' will return the iteratored record.

Syntax:
-------
CREATE SEQUENCE SYNTAX:

CREATE SEQUENCE [IF NOT EXISTS] schema.sequence_name
   [START WITH <constant>]
   [MINVALUE <constant>]
   [MAXVALUE <constant>]
   [INCREMENT BY <constant>]
   [CACHE <constant> | NOCACHE]
   [CYCLE | NOCYCLE]
  ;

OR:
  CREATE SEQUENCE schema.sequence_name (
  `currval` bigint(21) NOT NULL COMMENT 'current value',
  `nextval` bigint(21) NOT NULL COMMENT 'next value',
  `minvalue` bigint(21) NOT NULL COMMENT 'min value',
  `maxvalue` bigint(21) NOT NULL COMMENT 'max value',
  `start` bigint(21) NOT NULL COMMENT 'start value',
  `increment` bigint(21) NOT NULL COMMENT 'increment value',
  `cache` bigint(21) NOT NULL COMMENT 'cache size',
  `cycle` bigint(21) NOT NULL COMMENT 'cycle state',
  `round` bigint(21) NOT NULL COMMENT 'already how many round'
) ENGINE=InnoDB DEFAULT CHARSET=latin1

INSERT INTO schema.sequence_name VALUES(0,0,1,9223372036854775807,1,1,10000,1,0);
COMMIT;

Strongly recommend the first CREATE SEQUENCE syntax.

SHOW SYNTAX:
  SHOW CREATE SEQUENCE schema.sequence_name;
  SHOW CREATE TABLE schema.sequence_name;

QUERY SYNTAX:
  SELECT [nextval | currval | *] FOR schema.sequence_name;
  SELECT [nextval | currval | *] FROM schema.sequence_name;

Usage:
------
FOR EXAMPLE:
  create sequence s;
  create table t(id int);
  select nextval for s;
  insert into t select nextval for s;
  • Loading branch information
AliSQL authored and AliSQL committed Feb 14, 2017
1 parent 02a5207 commit b2f60ae
Show file tree
Hide file tree
Showing 50 changed files with 6,597 additions and 17 deletions.
5 changes: 4 additions & 1 deletion include/my_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,10 @@ is the global server default. */
#define HA_ERR_TEMP_FILE_WRITE_FAILURE 189 /* Temporary file write failure */
#define HA_ERR_INNODB_FORCED_RECOVERY 190 /* Innodb is in force recovery mode */
#define HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE 191 /* Too many words in a phrase */
#define HA_ERR_LAST 191 /* Copy of last error nr */
#define HA_ERR_SEQUENCE_RUN_OUT 192 /* Sequence has been run out */
#define HA_ERR_SEQUENCE_INVALID 193 /* Sequence structure or number is invalid.*/
#define HA_ERR_SEQUENCE_ACCESS_ERROR 194 /* Sequence access error */
#define HA_ERR_LAST 194 /* Copy of last error nr */

/* Number of different errors */
#define HA_ERR_ERRORS (HA_ERR_LAST - HA_ERR_FIRST + 1)
Expand Down
4 changes: 4 additions & 0 deletions include/mysql/plugin.h
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,10 @@ void *thd_get_ha_data(const MYSQL_THD thd, const struct handlerton *hton);
*/
void thd_set_ha_data(MYSQL_THD thd, const struct handlerton *hton,
const void *ha_data);
void *thd_get_atm_ha_data(const MYSQL_THD thd);
void thd_set_atm_ha_data(MYSQL_THD thd, const void *ha_data);
unsigned long thd_get_atm_lock_type(const MYSQL_THD thd);
void thd_set_atm_lock_type(MYSQL_THD thd, unsigned long lock_type);
#ifdef __cplusplus
}
#endif
Expand Down
4 changes: 4 additions & 0 deletions include/mysql/plugin_audit.h.pp
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,10 @@
void *thd_get_ha_data(const void* thd, const struct handlerton *hton);
void thd_set_ha_data(void* thd, const struct handlerton *hton,
const void *ha_data);
void *thd_get_atm_ha_data(const void* thd);
void thd_set_atm_ha_data(void* thd, const void *ha_data);
unsigned long thd_get_atm_lock_type(const void *thd);
void thd_set_atm_lock_type(void *thd, unsigned long lock_type);
struct mysql_event_general
{
unsigned int event_subclass;
Expand Down
4 changes: 4 additions & 0 deletions include/mysql/plugin_auth.h.pp
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,10 @@
void *thd_get_ha_data(const void* thd, const struct handlerton *hton);
void thd_set_ha_data(void* thd, const struct handlerton *hton,
const void *ha_data);
void *thd_get_atm_ha_data(const void* thd);
void thd_set_atm_ha_data(void* thd, const void *ha_data);
unsigned long thd_get_atm_lock_type(const void *thd);
void thd_set_atm_lock_type(void *thd, unsigned long lock_type);
#include <mysql/plugin_auth_common.h>
typedef struct st_plugin_vio_info
{
Expand Down
4 changes: 4 additions & 0 deletions include/mysql/plugin_ftparser.h.pp
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,10 @@
void *thd_get_ha_data(const void* thd, const struct handlerton *hton);
void thd_set_ha_data(void* thd, const struct handlerton *hton,
const void *ha_data);
void *thd_get_atm_ha_data(const void* thd);
void thd_set_atm_ha_data(void* thd, const void *ha_data);
unsigned long thd_get_atm_lock_type(const void *thd);
void thd_set_atm_lock_type(void *thd, unsigned long lock_type);
enum enum_ftparser_mode
{
MYSQL_FTPARSER_SIMPLE_MODE= 0,
Expand Down
Loading

0 comments on commit b2f60ae

Please sign in to comment.