diff options
author | Alexander Barkov <bar@mariadb.org> | 2016-09-27 13:22:38 +0400 |
---|---|---|
committer | Alexander Barkov <bar@mariadb.org> | 2017-04-05 15:02:51 +0400 |
commit | 7fa1ad14dca4850caee52e75d69eae441af3f824 (patch) | |
tree | 6da9a4b31390a3e83b1e2282e1b55cefd46d9cb8 | |
parent | 76714a5c9a4c05fa7084f2c562a9eb50a0b7bd17 (diff) | |
download | mariadb-git-7fa1ad14dca4850caee52e75d69eae441af3f824.tar.gz |
MDEV-10840 sql_mode=ORACLE: RAISE statement for predefined exceptions
-rw-r--r-- | mysql-test/r/keywords.result | 2 | ||||
-rw-r--r-- | mysql-test/suite/compat/oracle/r/exception.result | 150 | ||||
-rw-r--r-- | mysql-test/suite/compat/oracle/t/exception.test | 191 | ||||
-rw-r--r-- | mysql-test/t/keywords.test | 3 | ||||
-rw-r--r-- | sql/lex.h | 1 | ||||
-rw-r--r-- | sql/sp_pcontext.cc | 14 | ||||
-rw-r--r-- | sql/sp_pcontext.h | 24 | ||||
-rw-r--r-- | sql/sql_lex.cc | 19 | ||||
-rw-r--r-- | sql/sql_lex.h | 3 | ||||
-rw-r--r-- | sql/sql_signal.cc | 14 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 19 | ||||
-rw-r--r-- | sql/sql_yacc_ora.yy | 39 |
12 files changed, 434 insertions, 45 deletions
diff --git a/mysql-test/r/keywords.result b/mysql-test/r/keywords.result index 07d7ae233e5..6649df3d8a7 100644 --- a/mysql-test/r/keywords.result +++ b/mysql-test/r/keywords.result @@ -354,3 +354,5 @@ CREATE TABLE isopen (isopen int); DROP TABLE isopen; CREATE TABLE notfound (notfound int); DROP TABLE notfound; +CREATE TABLE raise (raise int); +DROP TABLE raise; diff --git a/mysql-test/suite/compat/oracle/r/exception.result b/mysql-test/suite/compat/oracle/r/exception.result index f73efb0c08e..28e31eb533f 100644 --- a/mysql-test/suite/compat/oracle/r/exception.result +++ b/mysql-test/suite/compat/oracle/r/exception.result @@ -51,3 +51,153 @@ a 10 DROP PROCEDURE p1; DROP TABLE t1; +# +# MDEV-10840 sql_mode=ORACLE: RAISE statement for predefined exceptions +# +# +# RAISE outside of an SP context +# +RAISE NO_DATA_FOUND; +ERROR 42000: Undefined CONDITION: NO_DATA_FOUND +RAISE INVALID_CURSOR; +ERROR 42000: Undefined CONDITION: INVALID_CURSOR +RAISE DUP_VAL_ON_INDEX; +ERROR 42000: Undefined CONDITION: DUP_VAL_ON_INDEX +RAISE TOO_MANY_ROWS; +ERROR 42000: Undefined CONDITION: TOO_MANY_ROWS +RAISE; +ERROR 0K000: RESIGNAL when handler not active +# +# RAISE for an undefinite exception +# +CREATE PROCEDURE p1 +AS +BEGIN +RAISE xxx; +END; +$$ +ERROR 42000: Undefined CONDITION: xxx +# +# RAISE for predefined exceptions +# +CREATE PROCEDURE p1 +AS +BEGIN +RAISE no_data_found; +END; +$$ +CALL p1(); +Warnings: +Warning 1329 No data - zero rows fetched, selected, or processed +DROP PROCEDURE p1; +CREATE PROCEDURE p1 +AS +BEGIN +RAISE invalid_cursor; +END; +$$ +CALL p1(); +ERROR 24000: Cursor is not open +DROP PROCEDURE p1; +CREATE PROCEDURE p1 +AS +BEGIN +RAISE dup_val_on_index; +END; +$$ +CALL p1(); +ERROR 23000: Duplicate entry '%-.192s' for key %d +DROP PROCEDURE p1; +CREATE PROCEDURE p1 +AS +BEGIN +raise too_many_rows; +END; +$$ +CALL p1(); +ERROR 42000: Result consisted of more than one row +DROP PROCEDURE p1; +# +# RAISE with no exception name (resignal) +# +CREATE PROCEDURE p1() +AS +BEGIN +RAISE; +END; +$$ +CALL p1(); +ERROR 0K000: RESIGNAL when handler not active +DROP PROCEDURE p1; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20); +CREATE PROCEDURE p1(lim INT) +AS +a INT; +BEGIN +SELECT a INTO a FROM t1 LIMIT lim; +EXCEPTION +WHEN TOO_MANY_ROWS THEN RAISE; +WHEN NO_DATA_FOUND THEN RAISE; +END; +$$ +CALL p1(0); +Warnings: +Warning 1329 No data - zero rows fetched, selected, or processed +CALL p1(2); +ERROR 42000: Result consisted of more than one row +DROP PROCEDURE p1; +DROP TABLE t1; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20); +CREATE PROCEDURE p1(lim INT) +AS +a INT; +BEGIN +SELECT a INTO a FROM t1 LIMIT lim; +EXCEPTION +WHEN OTHERS THEN RAISE; +END; +$$ +CALL p1(0); +Warnings: +Warning 1329 No data - zero rows fetched, selected, or processed +CALL p1(2); +ERROR 42000: Result consisted of more than one row +DROP PROCEDURE p1; +DROP TABLE t1; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20); +CREATE PROCEDURE p1() +AS +a INT; +CURSOR c IS SELECT a FROM t1; +BEGIN +FETCH c INTO a; +EXCEPTION +WHEN INVALID_CURSOR THEN RAISE; +END; +$$ +CALL p1(); +ERROR 24000: Cursor is not open +DROP PROCEDURE p1; +DROP TABLE t1; +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20); +CREATE PROCEDURE p1() +AS +a INT; +CURSOR c IS SELECT a FROM t1; +BEGIN +FETCH c INTO a; +EXCEPTION +WHEN OTHERS THEN RAISE; +END; +$$ +CALL p1(); +ERROR 24000: Cursor is not open +DROP PROCEDURE p1; +DROP TABLE t1; +# +# End of MDEV-10840 sql_mode=ORACLE: RAISE statement for predefined exceptions +# diff --git a/mysql-test/suite/compat/oracle/t/exception.test b/mysql-test/suite/compat/oracle/t/exception.test index f61b495ed86..52a300dffe6 100644 --- a/mysql-test/suite/compat/oracle/t/exception.test +++ b/mysql-test/suite/compat/oracle/t/exception.test @@ -52,3 +52,194 @@ SELECT @res; SELECT * FROM t1; DROP PROCEDURE p1; DROP TABLE t1; + + +--echo # +--echo # MDEV-10840 sql_mode=ORACLE: RAISE statement for predefined exceptions +--echo # + +--echo # +--echo # RAISE outside of an SP context +--echo # + +--error ER_SP_COND_MISMATCH +RAISE NO_DATA_FOUND; +--error ER_SP_COND_MISMATCH +RAISE INVALID_CURSOR; +--error ER_SP_COND_MISMATCH +RAISE DUP_VAL_ON_INDEX; +--error ER_SP_COND_MISMATCH +RAISE TOO_MANY_ROWS; + +--error ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER +RAISE; + + +--echo # +--echo # RAISE for an undefinite exception +--echo # + +DELIMITER $$; +--error ER_SP_COND_MISMATCH +CREATE PROCEDURE p1 +AS +BEGIN + RAISE xxx; +END; +$$ +DELIMITER ;$$ + + +--echo # +--echo # RAISE for predefined exceptions +--echo # + +DELIMITER $$; +CREATE PROCEDURE p1 +AS +BEGIN + RAISE no_data_found; +END; +$$ +DELIMITER ;$$ +CALL p1(); +DROP PROCEDURE p1; + +DELIMITER $$; +CREATE PROCEDURE p1 +AS +BEGIN + RAISE invalid_cursor; +END; +$$ +DELIMITER ;$$ +--error ER_SP_CURSOR_NOT_OPEN +CALL p1(); +DROP PROCEDURE p1; + +DELIMITER $$; +CREATE PROCEDURE p1 +AS +BEGIN + RAISE dup_val_on_index; +END; +$$ +DELIMITER ;$$ +--error ER_DUP_ENTRY +CALL p1(); +DROP PROCEDURE p1; + +DELIMITER $$; +CREATE PROCEDURE p1 +AS +BEGIN + raise too_many_rows; +END; +$$ +DELIMITER ;$$ +--error ER_TOO_MANY_ROWS +CALL p1(); +DROP PROCEDURE p1; + + +--echo # +--echo # RAISE with no exception name (resignal) +--echo # + +DELIMITER $$; +CREATE PROCEDURE p1() +AS +BEGIN + RAISE; +END; +$$ +DELIMITER ;$$ +--error ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER +CALL p1(); +DROP PROCEDURE p1; + + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20); +DELIMITER $$; +CREATE PROCEDURE p1(lim INT) +AS + a INT; +BEGIN + SELECT a INTO a FROM t1 LIMIT lim; +EXCEPTION + WHEN TOO_MANY_ROWS THEN RAISE; + WHEN NO_DATA_FOUND THEN RAISE; +END; +$$ +DELIMITER ;$$ +CALL p1(0); +--error ER_TOO_MANY_ROWS +CALL p1(2); +DROP PROCEDURE p1; +DROP TABLE t1; + + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20); +DELIMITER $$; +CREATE PROCEDURE p1(lim INT) +AS + a INT; +BEGIN + SELECT a INTO a FROM t1 LIMIT lim; +EXCEPTION + WHEN OTHERS THEN RAISE; +END; +$$ +DELIMITER ;$$ +CALL p1(0); +--error ER_TOO_MANY_ROWS +CALL p1(2); +DROP PROCEDURE p1; +DROP TABLE t1; + + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20); +DELIMITER $$; +CREATE PROCEDURE p1() +AS + a INT; + CURSOR c IS SELECT a FROM t1; +BEGIN + FETCH c INTO a; +EXCEPTION + WHEN INVALID_CURSOR THEN RAISE; +END; +$$ +DELIMITER ;$$ +--error ER_SP_CURSOR_NOT_OPEN +CALL p1(); +DROP PROCEDURE p1; +DROP TABLE t1; + + +CREATE TABLE t1 (a INT); +INSERT INTO t1 VALUES (10),(20); +DELIMITER $$; +CREATE PROCEDURE p1() +AS + a INT; + CURSOR c IS SELECT a FROM t1; +BEGIN + FETCH c INTO a; +EXCEPTION + WHEN OTHERS THEN RAISE; +END; +$$ +DELIMITER ;$$ +--error ER_SP_CURSOR_NOT_OPEN +CALL p1(); +DROP PROCEDURE p1; +DROP TABLE t1; + + +--echo # +--echo # End of MDEV-10840 sql_mode=ORACLE: RAISE statement for predefined exceptions +--echo # diff --git a/mysql-test/t/keywords.test b/mysql-test/t/keywords.test index b61f09e4048..dd006d01064 100644 --- a/mysql-test/t/keywords.test +++ b/mysql-test/t/keywords.test @@ -253,3 +253,6 @@ DROP TABLE isopen; CREATE TABLE notfound (notfound int); DROP TABLE notfound; + +CREATE TABLE raise (raise int); +DROP TABLE raise; diff --git a/sql/lex.h b/sql/lex.h index 08bcba3beee..a932a24cd3c 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -476,6 +476,7 @@ static SYMBOL symbols[] = { { "QUARTER", SYM(QUARTER_SYM)}, { "QUERY", SYM(QUERY_SYM)}, { "QUICK", SYM(QUICK)}, + { "RAISE", SYM(RAISE_SYM)}, { "RANGE", SYM(RANGE_SYM)}, { "RAW", SYM(RAW)}, { "READ", SYM(READ_SYM)}, diff --git a/sql/sp_pcontext.cc b/sql/sp_pcontext.cc index daf8a6febd0..20ff92e3cf1 100644 --- a/sql/sp_pcontext.cc +++ b/sql/sp_pcontext.cc @@ -289,16 +289,20 @@ sp_condition_value *sp_pcontext::find_condition(const LEX_STRING name, static sp_condition_value - cond_invalid_cursor(ER_SP_CURSOR_NOT_OPEN), - cond_no_data_found(ER_SP_FETCH_NO_DATA), - cond_dup_val_on_index(ER_DUP_ENTRY), - cond_too_many_rows(ER_TOO_MANY_ROWS); + // Warnings + cond_no_data_found(ER_SP_FETCH_NO_DATA, "01000"), + // Errors + cond_invalid_cursor(ER_SP_CURSOR_NOT_OPEN, "24000"), + cond_dup_val_on_index(ER_DUP_ENTRY, "23000"), + cond_too_many_rows(ER_TOO_MANY_ROWS, "42000"); static sp_condition sp_predefined_conditions[]= { - sp_condition(C_STRING_WITH_LEN("INVALID_CURSOR"), &cond_invalid_cursor), + // Warnings sp_condition(C_STRING_WITH_LEN("NO_DATA_FOUND"), &cond_no_data_found), + // Errors + sp_condition(C_STRING_WITH_LEN("INVALID_CURSOR"), &cond_invalid_cursor), sp_condition(C_STRING_WITH_LEN("DUP_VAL_ON_INDEX"), &cond_dup_val_on_index), sp_condition(C_STRING_WITH_LEN("TOO_MANY_ROWS"), &cond_too_many_rows) }; diff --git a/sql/sp_pcontext.h b/sql/sp_pcontext.h index 808143d832c..4f4595899fb 100644 --- a/sql/sp_pcontext.h +++ b/sql/sp_pcontext.h @@ -129,6 +129,10 @@ public: class sp_condition_value : public Sql_alloc { + void init_sql_state() + { + sql_state[0]= '\0'; + } public: enum enum_type { @@ -153,11 +157,21 @@ public: :Sql_alloc(), type(ERROR_CODE), mysqlerr(_mysqlerr) - { } + { init_sql_state(); } + + sp_condition_value(uint _mysqlerr, const char *_sql_state) + :Sql_alloc(), + type(ERROR_CODE), + mysqlerr(_mysqlerr) + { + memcpy(sql_state, _sql_state, SQLSTATE_LENGTH); + sql_state[SQLSTATE_LENGTH]= 0; + } sp_condition_value(const char *_sql_state) :Sql_alloc(), - type(SQLSTATE) + type(SQLSTATE), + mysqlerr(0) { memcpy(sql_state, _sql_state, SQLSTATE_LENGTH); sql_state[SQLSTATE_LENGTH]= 0; @@ -165,9 +179,11 @@ public: sp_condition_value(enum_type _type) :Sql_alloc(), - type(_type) + type(_type), + mysqlerr(0) { DBUG_ASSERT(type != ERROR_CODE && type != SQLSTATE); + init_sql_state(); } /// Check if two instances of sp_condition_value are equal or not. @@ -176,6 +192,8 @@ public: /// /// @return true if the instances are equal, false otherwise. bool equals(const sp_condition_value *cv) const; + + bool has_sql_state() const { return sql_state[0] != '\0'; } }; /////////////////////////////////////////////////////////////////////////// diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 6d9d6e8365b..bf19ac34b67 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -30,6 +30,7 @@ #include "sp.h" #include "sql_select.h" #include "sql_cte.h" +#include "sql_signal.h" void LEX::parse_error() @@ -5903,6 +5904,24 @@ Item_param *LEX::add_placeholder(THD *thd, char *name, } +bool LEX::add_signal_statement(THD *thd, const sp_condition_value *v) +{ + Yacc_state *state= &thd->m_parser_state->m_yacc; + sql_command= SQLCOM_SIGNAL; + m_sql_cmd= new (thd->mem_root) Sql_cmd_signal(v, state->m_set_signal_info); + return m_sql_cmd == NULL; +} + + +bool LEX::add_resignal_statement(THD *thd, const sp_condition_value *v) +{ + Yacc_state *state= &thd->m_parser_state->m_yacc; + sql_command= SQLCOM_RESIGNAL; + m_sql_cmd= new (thd->mem_root) Sql_cmd_resignal(v, state->m_set_signal_info); + return m_sql_cmd == NULL; +} + + #ifdef MYSQL_SERVER uint binlog_unsafe_map[256]; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 8f0e83610cd..649f8ec11fc 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -3197,6 +3197,9 @@ public: bool sp_for_loop_index_and_bounds(THD *thd, const Lex_for_loop_st &loop); bool sp_for_loop_finalize(THD *thd, const Lex_for_loop_st &loop); + bool add_signal_statement(THD *thd, const class sp_condition_value *value); + bool add_resignal_statement(THD *thd, const class sp_condition_value *value); + // Check if "KEY IF NOT EXISTS name" used outside of ALTER context bool check_add_key(DDL_options_st ddl) { diff --git a/sql/sql_signal.cc b/sql/sql_signal.cc index 1b7edbee54a..4765cebc355 100644 --- a/sql/sql_signal.cc +++ b/sql/sql_signal.cc @@ -102,7 +102,7 @@ void Sql_cmd_common_signal::eval_defaults(THD *thd, Sql_condition *cond) /* SIGNAL is restricted in sql_yacc.yy to only signal SQLSTATE conditions. */ - DBUG_ASSERT(m_cond->type == sp_condition_value::SQLSTATE); + DBUG_ASSERT(m_cond->has_sql_state()); sqlstate= m_cond->sql_state; cond->set_sqlstate(sqlstate); } @@ -117,19 +117,25 @@ void Sql_cmd_common_signal::eval_defaults(THD *thd, Sql_condition *cond) { /* SQLSTATE class "01": warning. */ assign_defaults(cond, set_defaults, - Sql_condition::WARN_LEVEL_WARN, ER_SIGNAL_WARN); + Sql_condition::WARN_LEVEL_WARN, + m_cond && m_cond->mysqlerr ? m_cond->mysqlerr : + ER_SIGNAL_WARN); } else if ((sqlstate[0] == '0') && (sqlstate[1] == '2')) { /* SQLSTATE class "02": not found. */ assign_defaults(cond, set_defaults, - Sql_condition::WARN_LEVEL_ERROR, ER_SIGNAL_NOT_FOUND); + Sql_condition::WARN_LEVEL_ERROR, + m_cond && m_cond->mysqlerr ? m_cond->mysqlerr : + ER_SIGNAL_NOT_FOUND); } else { /* other SQLSTATE classes : error. */ assign_defaults(cond, set_defaults, - Sql_condition::WARN_LEVEL_ERROR, ER_SIGNAL_EXCEPTION); + Sql_condition::WARN_LEVEL_ERROR, + m_cond && m_cond->mysqlerr ? m_cond->mysqlerr : + ER_SIGNAL_EXCEPTION); } } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 3a63b8467e9..dcf88f5564e 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1362,6 +1362,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token QUARTER_SYM %token QUERY_SYM %token QUICK +%token RAISE_SYM /* Oracle-PLSQL-R */ %token RANGE_SYM /* SQL-2003-R */ %token RANK_SYM %token RAW /* Oracle */ @@ -3124,13 +3125,7 @@ sp_hcond: signal_stmt: SIGNAL_SYM signal_value opt_set_signal_information { - LEX *lex= thd->lex; - Yacc_state *state= & thd->m_parser_state->m_yacc; - - lex->sql_command= SQLCOM_SIGNAL; - lex->m_sql_cmd= - new (thd->mem_root) Sql_cmd_signal($2, state->m_set_signal_info); - if (lex->m_sql_cmd == NULL) + if (Lex->add_signal_statement(thd, $2)) MYSQL_YYABORT; } ; @@ -3251,14 +3246,7 @@ signal_condition_information_item_name: resignal_stmt: RESIGNAL_SYM opt_signal_value opt_set_signal_information { - LEX *lex= thd->lex; - Yacc_state *state= & thd->m_parser_state->m_yacc; - - lex->sql_command= SQLCOM_RESIGNAL; - lex->m_sql_cmd= - new (thd->mem_root) Sql_cmd_resignal($2, - state->m_set_signal_info); - if (lex->m_sql_cmd == NULL) + if (Lex->add_resignal_statement(thd, $2)) MYSQL_YYABORT; } ; @@ -14449,6 +14437,7 @@ keyword_sp: | QUARTER_SYM {} | QUERY_SYM {} | QUICK {} + | RAISE_SYM {} | RAW {} | READ_ONLY_SYM {} | REBUILD_SYM {} diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index 7ab03be7617..672ab119343 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -741,6 +741,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize); %token QUARTER_SYM %token QUERY_SYM %token QUICK +%token RAISE_SYM /* Oracle-PLSQL-R */ %token RANGE_SYM /* SQL-2003-R */ %token RANK_SYM %token RAW /* Oracle */ @@ -1311,7 +1312,7 @@ END_OF_INPUT %type <num> index_hint_clause normal_join inner_join %type <filetype> data_or_xml -%type <NONE> signal_stmt resignal_stmt +%type <NONE> signal_stmt resignal_stmt raise_stmt %type <diag_condition_item_name> signal_condition_information_item_name %type <trg_execution_order> trigger_follows_precedes_clause; @@ -1460,6 +1461,7 @@ statement: | preload | prepare | purge + | raise_stmt | release | rename | repair @@ -2549,16 +2551,24 @@ sp_hcond: } ; + +raise_stmt: + RAISE_SYM opt_set_signal_information + { + if (Lex->add_resignal_statement(thd, NULL)) + MYSQL_YYABORT; + } + | RAISE_SYM signal_value opt_set_signal_information + { + if (Lex->add_signal_statement(thd, $2)) + MYSQL_YYABORT; + } + ; + signal_stmt: SIGNAL_SYM signal_value opt_set_signal_information { - LEX *lex= thd->lex; - Yacc_state *state= & thd->m_parser_state->m_yacc; - - lex->sql_command= SQLCOM_SIGNAL; - lex->m_sql_cmd= - new (thd->mem_root) Sql_cmd_signal($2, state->m_set_signal_info); - if (lex->m_sql_cmd == NULL) + if (Lex->add_signal_statement(thd, $2)) MYSQL_YYABORT; } ; @@ -2572,10 +2582,10 @@ signal_value: /* SIGNAL foo cannot be used outside of stored programs */ if (lex->spcont == NULL) my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), $1.str)); - cond= lex->spcont->find_condition($1, false); + cond= lex->spcont->find_declared_or_predefined_condition($1); if (cond == NULL) my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), $1.str)); - if (cond->type != sp_condition_value::SQLSTATE) + if (!cond->has_sql_state()) my_yyabort_error((ER_SIGNAL_BAD_CONDITION_TYPE, MYF(0))); $$= cond; } @@ -2679,14 +2689,7 @@ signal_condition_information_item_name: resignal_stmt: RESIGNAL_SYM opt_signal_value opt_set_signal_information { - LEX *lex= thd->lex; - Yacc_state *state= & thd->m_parser_state->m_yacc; - - lex->sql_command= SQLCOM_RESIGNAL; - lex->m_sql_cmd= - new (thd->mem_root) Sql_cmd_resignal($2, - state->m_set_signal_info); - if (lex->m_sql_cmd == NULL) + if (Lex->add_resignal_statement(thd, $2)) MYSQL_YYABORT; } ; |