summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
Diffstat (limited to 'sql')
-rw-r--r--sql/lex.h1
-rw-r--r--sql/mysqld.cc1
-rw-r--r--sql/sql_lex.h4
-rw-r--r--sql/sql_parse.cc3
-rw-r--r--sql/sql_yacc.yy24
5 files changed, 29 insertions, 4 deletions
diff --git a/sql/lex.h b/sql/lex.h
index d9a84dd25b4..3bbe1da185e 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -309,6 +309,7 @@ static SYMBOL symbols[] = {
{ "ROLLUP", SYM(ROLLUP_SYM),0,0},
{ "ROW", SYM(ROW_SYM),0,0},
{ "ROWS", SYM(ROWS_SYM),0,0},
+ { "SAVEPOINT", SYM(SAVEPOINT_SYM),0,0},
{ "SECOND", SYM(SECOND_SYM),0,0},
{ "SELECT", SYM(SELECT_SYM),0,0},
{ "SERIALIZABLE", SYM(SERIALIZABLE_SYM),0,0},
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 315931094c2..7883b9700ad 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -4021,6 +4021,7 @@ struct show_var_st status_vars[]= {
{"Com_restore_table", (char*) (com_stat+(uint) SQLCOM_RESTORE_TABLE),SHOW_LONG},
{"Com_revoke", (char*) (com_stat+(uint) SQLCOM_REVOKE),SHOW_LONG},
{"Com_rollback", (char*) (com_stat+(uint) SQLCOM_ROLLBACK),SHOW_LONG},
+ {"Com_savepoint", (char*) (com_stat+(uint) SQLCOM_SAVEPOINT),SHOW_LONG},
{"Com_select", (char*) (com_stat+(uint) SQLCOM_SELECT),SHOW_LONG},
{"Com_set_option", (char*) (com_stat+(uint) SQLCOM_SET_OPTION),SHOW_LONG},
{"Com_show_binlog_events", (char*) (com_stat+(uint) SQLCOM_SHOW_BINLOG_EVENTS),SHOW_LONG},
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index a905871e629..7d931399782 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -54,7 +54,8 @@ enum enum_sql_command {
SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,
SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_ANALYZE,
- SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
+ SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SAVEPOINT,
+ SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE,
SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_SHOW_BINLOGS,
@@ -154,6 +155,7 @@ typedef struct st_lex
SQL_LIST proc_list, auxilliary_table_list;
TYPELIB *interval;
create_field *last_field;
+ char* savepoint_name; // Transaction savepoint id
Item *default_value;
CONVERT *convert_set;
CONVERT *thd_convert_set; // Set with SET CHAR SET
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index b06a48f9045..7447ba44e76 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2533,6 +2533,9 @@ mysql_execute_command(void)
res= -1;
thd->options&= ~(ulong) (OPTION_BEGIN | OPTION_STATUS_NO_TRANS_UPDATE);
break;
+ case SQLCOM_SAVEPOINT:
+ send_ok(&thd->net);
+ break;
default: /* Impossible */
send_ok(&thd->net);
break;
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index b0c81d6f6b0..2ef0992cdf7 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -135,6 +135,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token RESET_SYM
%token ROLLBACK_SYM
%token ROLLUP_SYM
+%token SAVEPOINT_SYM
%token SELECT_SYM
%token SHOW
%token SLAVE
@@ -573,7 +574,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
query verb_clause create change select do drop insert replace insert2
insert_values update delete truncate rename
show describe load alter optimize flush
- reset purge begin commit rollback slave master_def master_defs
+ reset purge begin commit rollback savepoint
+ slave master_def master_defs
repair restore backup analyze check start
field_list field_list_item field_spec kill column_def key_def
select_item_list select_item values_list no_braces
@@ -649,6 +651,7 @@ verb_clause:
| restore
| revoke
| rollback
+ | savepoint
| select
| set
| slave
@@ -3382,6 +3385,7 @@ keyword:
| ROWS_SYM {}
| ROW_FORMAT_SYM {}
| ROW_SYM {}
+ | SAVEPOINT_SYM {}
| SECOND_SYM {}
| SERIALIZABLE_SYM {}
| SESSION_SYM {}
@@ -3915,8 +3919,22 @@ commit:
COMMIT_SYM { Lex->sql_command = SQLCOM_COMMIT;};
rollback:
- ROLLBACK_SYM { Lex->sql_command = SQLCOM_ROLLBACK;};
-
+ ROLLBACK_SYM
+ {
+ Lex->sql_command = SQLCOM_ROLLBACK;
+ Lex->savepoint_name = NULL;
+ }
+ | ROLLBACK_SYM TO_SYM SAVEPOINT_SYM ident
+ {
+ Lex->sql_command = SQLCOM_ROLLBACK;
+ Lex->savepoint_name = $4.str;
+ };
+savepoint:
+ SAVEPOINT_SYM ident
+ {
+ Lex->sql_command = SQLCOM_SAVEPOINT;
+ Lex->savepoint_name = $2.str;
+ };
/*
** UNIONS : glue selects together