MDEV-10840 sql_mode=ORACLE: RAISE statement for predefined exceptions
This commit is contained in:
parent
76714a5c9a
commit
7fa1ad14dc
@ -354,3 +354,5 @@ CREATE TABLE isopen (isopen int);
|
|||||||
DROP TABLE isopen;
|
DROP TABLE isopen;
|
||||||
CREATE TABLE notfound (notfound int);
|
CREATE TABLE notfound (notfound int);
|
||||||
DROP TABLE notfound;
|
DROP TABLE notfound;
|
||||||
|
CREATE TABLE raise (raise int);
|
||||||
|
DROP TABLE raise;
|
||||||
|
@ -51,3 +51,153 @@ a
|
|||||||
10
|
10
|
||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP TABLE t1;
|
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
|
||||||
|
#
|
||||||
|
@ -52,3 +52,194 @@ SELECT @res;
|
|||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP TABLE t1;
|
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 #
|
||||||
|
@ -253,3 +253,6 @@ DROP TABLE isopen;
|
|||||||
|
|
||||||
CREATE TABLE notfound (notfound int);
|
CREATE TABLE notfound (notfound int);
|
||||||
DROP TABLE notfound;
|
DROP TABLE notfound;
|
||||||
|
|
||||||
|
CREATE TABLE raise (raise int);
|
||||||
|
DROP TABLE raise;
|
||||||
|
@ -476,6 +476,7 @@ static SYMBOL symbols[] = {
|
|||||||
{ "QUARTER", SYM(QUARTER_SYM)},
|
{ "QUARTER", SYM(QUARTER_SYM)},
|
||||||
{ "QUERY", SYM(QUERY_SYM)},
|
{ "QUERY", SYM(QUERY_SYM)},
|
||||||
{ "QUICK", SYM(QUICK)},
|
{ "QUICK", SYM(QUICK)},
|
||||||
|
{ "RAISE", SYM(RAISE_SYM)},
|
||||||
{ "RANGE", SYM(RANGE_SYM)},
|
{ "RANGE", SYM(RANGE_SYM)},
|
||||||
{ "RAW", SYM(RAW)},
|
{ "RAW", SYM(RAW)},
|
||||||
{ "READ", SYM(READ_SYM)},
|
{ "READ", SYM(READ_SYM)},
|
||||||
|
@ -289,16 +289,20 @@ sp_condition_value *sp_pcontext::find_condition(const LEX_STRING name,
|
|||||||
|
|
||||||
|
|
||||||
static sp_condition_value
|
static sp_condition_value
|
||||||
cond_invalid_cursor(ER_SP_CURSOR_NOT_OPEN),
|
// Warnings
|
||||||
cond_no_data_found(ER_SP_FETCH_NO_DATA),
|
cond_no_data_found(ER_SP_FETCH_NO_DATA, "01000"),
|
||||||
cond_dup_val_on_index(ER_DUP_ENTRY),
|
// Errors
|
||||||
cond_too_many_rows(ER_TOO_MANY_ROWS);
|
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[]=
|
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),
|
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("DUP_VAL_ON_INDEX"), &cond_dup_val_on_index),
|
||||||
sp_condition(C_STRING_WITH_LEN("TOO_MANY_ROWS"), &cond_too_many_rows)
|
sp_condition(C_STRING_WITH_LEN("TOO_MANY_ROWS"), &cond_too_many_rows)
|
||||||
};
|
};
|
||||||
|
@ -129,6 +129,10 @@ public:
|
|||||||
|
|
||||||
class sp_condition_value : public Sql_alloc
|
class sp_condition_value : public Sql_alloc
|
||||||
{
|
{
|
||||||
|
void init_sql_state()
|
||||||
|
{
|
||||||
|
sql_state[0]= '\0';
|
||||||
|
}
|
||||||
public:
|
public:
|
||||||
enum enum_type
|
enum enum_type
|
||||||
{
|
{
|
||||||
@ -153,11 +157,21 @@ public:
|
|||||||
:Sql_alloc(),
|
:Sql_alloc(),
|
||||||
type(ERROR_CODE),
|
type(ERROR_CODE),
|
||||||
mysqlerr(_mysqlerr)
|
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)
|
sp_condition_value(const char *_sql_state)
|
||||||
:Sql_alloc(),
|
:Sql_alloc(),
|
||||||
type(SQLSTATE)
|
type(SQLSTATE),
|
||||||
|
mysqlerr(0)
|
||||||
{
|
{
|
||||||
memcpy(sql_state, _sql_state, SQLSTATE_LENGTH);
|
memcpy(sql_state, _sql_state, SQLSTATE_LENGTH);
|
||||||
sql_state[SQLSTATE_LENGTH]= 0;
|
sql_state[SQLSTATE_LENGTH]= 0;
|
||||||
@ -165,9 +179,11 @@ public:
|
|||||||
|
|
||||||
sp_condition_value(enum_type _type)
|
sp_condition_value(enum_type _type)
|
||||||
:Sql_alloc(),
|
:Sql_alloc(),
|
||||||
type(_type)
|
type(_type),
|
||||||
|
mysqlerr(0)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(type != ERROR_CODE && type != SQLSTATE);
|
DBUG_ASSERT(type != ERROR_CODE && type != SQLSTATE);
|
||||||
|
init_sql_state();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if two instances of sp_condition_value are equal or not.
|
/// 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.
|
/// @return true if the instances are equal, false otherwise.
|
||||||
bool equals(const sp_condition_value *cv) const;
|
bool equals(const sp_condition_value *cv) const;
|
||||||
|
|
||||||
|
bool has_sql_state() const { return sql_state[0] != '\0'; }
|
||||||
};
|
};
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -30,6 +30,7 @@
|
|||||||
#include "sp.h"
|
#include "sp.h"
|
||||||
#include "sql_select.h"
|
#include "sql_select.h"
|
||||||
#include "sql_cte.h"
|
#include "sql_cte.h"
|
||||||
|
#include "sql_signal.h"
|
||||||
|
|
||||||
|
|
||||||
void LEX::parse_error()
|
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
|
#ifdef MYSQL_SERVER
|
||||||
uint binlog_unsafe_map[256];
|
uint binlog_unsafe_map[256];
|
||||||
|
|
||||||
|
@ -3197,6 +3197,9 @@ public:
|
|||||||
bool sp_for_loop_index_and_bounds(THD *thd, const Lex_for_loop_st &loop);
|
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 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
|
// Check if "KEY IF NOT EXISTS name" used outside of ALTER context
|
||||||
bool check_add_key(DDL_options_st ddl)
|
bool check_add_key(DDL_options_st ddl)
|
||||||
{
|
{
|
||||||
|
@ -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.
|
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;
|
sqlstate= m_cond->sql_state;
|
||||||
cond->set_sqlstate(sqlstate);
|
cond->set_sqlstate(sqlstate);
|
||||||
}
|
}
|
||||||
@ -117,19 +117,25 @@ void Sql_cmd_common_signal::eval_defaults(THD *thd, Sql_condition *cond)
|
|||||||
{
|
{
|
||||||
/* SQLSTATE class "01": warning. */
|
/* SQLSTATE class "01": warning. */
|
||||||
assign_defaults(cond, set_defaults,
|
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'))
|
else if ((sqlstate[0] == '0') && (sqlstate[1] == '2'))
|
||||||
{
|
{
|
||||||
/* SQLSTATE class "02": not found. */
|
/* SQLSTATE class "02": not found. */
|
||||||
assign_defaults(cond, set_defaults,
|
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
|
else
|
||||||
{
|
{
|
||||||
/* other SQLSTATE classes : error. */
|
/* other SQLSTATE classes : error. */
|
||||||
assign_defaults(cond, set_defaults,
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1362,6 +1362,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||||||
%token QUARTER_SYM
|
%token QUARTER_SYM
|
||||||
%token QUERY_SYM
|
%token QUERY_SYM
|
||||||
%token QUICK
|
%token QUICK
|
||||||
|
%token RAISE_SYM /* Oracle-PLSQL-R */
|
||||||
%token RANGE_SYM /* SQL-2003-R */
|
%token RANGE_SYM /* SQL-2003-R */
|
||||||
%token RANK_SYM
|
%token RANK_SYM
|
||||||
%token RAW /* Oracle */
|
%token RAW /* Oracle */
|
||||||
@ -3124,13 +3125,7 @@ sp_hcond:
|
|||||||
signal_stmt:
|
signal_stmt:
|
||||||
SIGNAL_SYM signal_value opt_set_signal_information
|
SIGNAL_SYM signal_value opt_set_signal_information
|
||||||
{
|
{
|
||||||
LEX *lex= thd->lex;
|
if (Lex->add_signal_statement(thd, $2))
|
||||||
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)
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -3251,14 +3246,7 @@ signal_condition_information_item_name:
|
|||||||
resignal_stmt:
|
resignal_stmt:
|
||||||
RESIGNAL_SYM opt_signal_value opt_set_signal_information
|
RESIGNAL_SYM opt_signal_value opt_set_signal_information
|
||||||
{
|
{
|
||||||
LEX *lex= thd->lex;
|
if (Lex->add_resignal_statement(thd, $2))
|
||||||
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)
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -14449,6 +14437,7 @@ keyword_sp:
|
|||||||
| QUARTER_SYM {}
|
| QUARTER_SYM {}
|
||||||
| QUERY_SYM {}
|
| QUERY_SYM {}
|
||||||
| QUICK {}
|
| QUICK {}
|
||||||
|
| RAISE_SYM {}
|
||||||
| RAW {}
|
| RAW {}
|
||||||
| READ_ONLY_SYM {}
|
| READ_ONLY_SYM {}
|
||||||
| REBUILD_SYM {}
|
| REBUILD_SYM {}
|
||||||
|
@ -741,6 +741,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||||||
%token QUARTER_SYM
|
%token QUARTER_SYM
|
||||||
%token QUERY_SYM
|
%token QUERY_SYM
|
||||||
%token QUICK
|
%token QUICK
|
||||||
|
%token RAISE_SYM /* Oracle-PLSQL-R */
|
||||||
%token RANGE_SYM /* SQL-2003-R */
|
%token RANGE_SYM /* SQL-2003-R */
|
||||||
%token RANK_SYM
|
%token RANK_SYM
|
||||||
%token RAW /* Oracle */
|
%token RAW /* Oracle */
|
||||||
@ -1311,7 +1312,7 @@ END_OF_INPUT
|
|||||||
%type <num> index_hint_clause normal_join inner_join
|
%type <num> index_hint_clause normal_join inner_join
|
||||||
%type <filetype> data_or_xml
|
%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 <diag_condition_item_name> signal_condition_information_item_name
|
||||||
|
|
||||||
%type <trg_execution_order> trigger_follows_precedes_clause;
|
%type <trg_execution_order> trigger_follows_precedes_clause;
|
||||||
@ -1460,6 +1461,7 @@ statement:
|
|||||||
| preload
|
| preload
|
||||||
| prepare
|
| prepare
|
||||||
| purge
|
| purge
|
||||||
|
| raise_stmt
|
||||||
| release
|
| release
|
||||||
| rename
|
| rename
|
||||||
| repair
|
| 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_stmt:
|
||||||
SIGNAL_SYM signal_value opt_set_signal_information
|
SIGNAL_SYM signal_value opt_set_signal_information
|
||||||
{
|
{
|
||||||
LEX *lex= thd->lex;
|
if (Lex->add_signal_statement(thd, $2))
|
||||||
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)
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
@ -2572,10 +2582,10 @@ signal_value:
|
|||||||
/* SIGNAL foo cannot be used outside of stored programs */
|
/* SIGNAL foo cannot be used outside of stored programs */
|
||||||
if (lex->spcont == NULL)
|
if (lex->spcont == NULL)
|
||||||
my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), $1.str));
|
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)
|
if (cond == NULL)
|
||||||
my_yyabort_error((ER_SP_COND_MISMATCH, MYF(0), $1.str));
|
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)));
|
my_yyabort_error((ER_SIGNAL_BAD_CONDITION_TYPE, MYF(0)));
|
||||||
$$= cond;
|
$$= cond;
|
||||||
}
|
}
|
||||||
@ -2679,14 +2689,7 @@ signal_condition_information_item_name:
|
|||||||
resignal_stmt:
|
resignal_stmt:
|
||||||
RESIGNAL_SYM opt_signal_value opt_set_signal_information
|
RESIGNAL_SYM opt_signal_value opt_set_signal_information
|
||||||
{
|
{
|
||||||
LEX *lex= thd->lex;
|
if (Lex->add_resignal_statement(thd, $2))
|
||||||
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)
|
|
||||||
MYSQL_YYABORT;
|
MYSQL_YYABORT;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user