mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-12089 sql_mode=ORACLE: Understand optional routine name after the END keyword
This commit is contained in:
@ -2152,6 +2152,81 @@ END' at line 1
|
|||||||
# End of MDEV-10577 sql_mode=ORACLE: %TYPE in variable declarations
|
# End of MDEV-10577 sql_mode=ORACLE: %TYPE in variable declarations
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
# MDEV-12089 sql_mode=ORACLE: Understand optional routine name after the END keyword
|
||||||
|
#
|
||||||
|
CREATE FUNCTION f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END f1;
|
||||||
|
$$
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION test.f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test.f1;
|
||||||
|
$$
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
CREATE FUNCTION test.f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test2.f1;
|
||||||
|
$$
|
||||||
|
ERROR HY000: END identifier 'test2.f1' does not match 'test.f1'
|
||||||
|
CREATE FUNCTION test.f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test.f2;
|
||||||
|
$$
|
||||||
|
ERROR HY000: END identifier 'test.f2' does not match 'test.f1'
|
||||||
|
CREATE FUNCTION f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test.f2;
|
||||||
|
$$
|
||||||
|
ERROR HY000: END identifier 'test.f2' does not match 'test.f1'
|
||||||
|
CREATE FUNCTION f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test2.f1;
|
||||||
|
$$
|
||||||
|
ERROR HY000: END identifier 'test2.f1' does not match 'test.f1'
|
||||||
|
CREATE PROCEDURE p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END p1;
|
||||||
|
$$
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
CREATE PROCEDURE test.p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test.p1;
|
||||||
|
$$
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
CREATE PROCEDURE test.p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test2.p1;
|
||||||
|
$$
|
||||||
|
ERROR HY000: END identifier 'test2.p1' does not match 'test.p1'
|
||||||
|
CREATE PROCEDURE test.p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test.p2;
|
||||||
|
$$
|
||||||
|
ERROR HY000: END identifier 'test.p2' does not match 'test.p1'
|
||||||
|
CREATE PROCEDURE p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test.p2;
|
||||||
|
$$
|
||||||
|
ERROR HY000: END identifier 'test.p2' does not match 'test.p1'
|
||||||
|
CREATE PROCEDURE p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test2.p1;
|
||||||
|
$$
|
||||||
|
ERROR HY000: END identifier 'test2.p1' does not match 'test.p1'
|
||||||
|
#
|
||||||
# MDEV-12107 sql_mode=ORACLE: Inside routines the CALL keywoard is optional
|
# MDEV-12107 sql_mode=ORACLE: Inside routines the CALL keywoard is optional
|
||||||
#
|
#
|
||||||
CREATE OR REPLACE PROCEDURE p1(a INT) AS
|
CREATE OR REPLACE PROCEDURE p1(a INT) AS
|
||||||
|
@ -1973,6 +1973,119 @@ DELIMITER ;$$
|
|||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-12089 sql_mode=ORACLE: Understand optional routine name after the END keyword
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE FUNCTION f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END f1;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE FUNCTION test.f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test.f1;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
--error ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
CREATE FUNCTION test.f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test2.f1;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
--error ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
CREATE FUNCTION test.f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test.f2;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
--error ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
CREATE FUNCTION f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test.f2;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
--error ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
CREATE FUNCTION f1 RETURN INT AS
|
||||||
|
BEGIN
|
||||||
|
RETURN 10;
|
||||||
|
END test2.f1;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE PROCEDURE p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END p1;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
CREATE PROCEDURE test.p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test.p1;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
DROP PROCEDURE p1;
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
--error ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
CREATE PROCEDURE test.p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test2.p1;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
--error ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
CREATE PROCEDURE test.p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test.p2;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
--error ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
CREATE PROCEDURE p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test.p2;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
|
DELIMITER $$;
|
||||||
|
--error ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
CREATE PROCEDURE p1 AS
|
||||||
|
BEGIN
|
||||||
|
NULL;
|
||||||
|
END test2.p1;
|
||||||
|
$$
|
||||||
|
DELIMITER ;$$
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-12107 sql_mode=ORACLE: Inside routines the CALL keywoard is optional
|
--echo # MDEV-12107 sql_mode=ORACLE: Inside routines the CALL keywoard is optional
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -7464,3 +7464,5 @@ ER_UNKNOWN_STRUCTURED_VARIABLE
|
|||||||
eng "Unknown structured system variable or ROW routine variable '%-.*s'"
|
eng "Unknown structured system variable or ROW routine variable '%-.*s'"
|
||||||
ER_ROW_VARIABLE_DOES_NOT_HAVE_FIELD
|
ER_ROW_VARIABLE_DOES_NOT_HAVE_FIELD
|
||||||
eng "Row variable '%-.192s' does not have a field '%-.192s'"
|
eng "Row variable '%-.192s' does not have a field '%-.192s'"
|
||||||
|
ER_END_IDENTIFIER_DOES_NOT_MATCH
|
||||||
|
eng "END identifier '%-.192s' does not match '%-.192s'"
|
||||||
|
@ -5916,6 +5916,21 @@ public:
|
|||||||
m_name.length= name_length;
|
m_name.length= name_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool eq(const Database_qualified_name *other) const
|
||||||
|
{
|
||||||
|
CHARSET_INFO *cs= lower_case_table_names ?
|
||||||
|
&my_charset_utf8_general_ci :
|
||||||
|
&my_charset_utf8_bin;
|
||||||
|
return
|
||||||
|
m_db.length == other->m_db.length &&
|
||||||
|
m_name.length == other->m_name.length &&
|
||||||
|
!my_strnncoll(cs,
|
||||||
|
(const uchar *) m_db.str, m_db.length,
|
||||||
|
(const uchar *) other->m_db.str, other->m_db.length) &&
|
||||||
|
!my_strnncoll(cs,
|
||||||
|
(const uchar *) m_name.str, m_name.length,
|
||||||
|
(const uchar *) other->m_name.str, other->m_name.length);
|
||||||
|
}
|
||||||
// Export db and name as a qualified name string: 'db.name'
|
// Export db and name as a qualified name string: 'db.name'
|
||||||
size_t make_qname(char *dst, size_t dstlen) const
|
size_t make_qname(char *dst, size_t dstlen) const
|
||||||
{
|
{
|
||||||
|
@ -1315,6 +1315,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
|
|||||||
opt_serial_attribute opt_serial_attribute_list serial_attribute
|
opt_serial_attribute opt_serial_attribute_list serial_attribute
|
||||||
explainable_command
|
explainable_command
|
||||||
set_assign
|
set_assign
|
||||||
|
sf_tail_standalone
|
||||||
|
sp_tail_standalone
|
||||||
END_OF_INPUT
|
END_OF_INPUT
|
||||||
|
|
||||||
%type <NONE> call sp_proc_stmts sp_proc_stmts1 sp_proc_stmt
|
%type <NONE> call sp_proc_stmts sp_proc_stmts1 sp_proc_stmt
|
||||||
@ -1342,7 +1344,7 @@ END_OF_INPUT
|
|||||||
%type <sp_instr_addr> sp_instr_addr
|
%type <sp_instr_addr> sp_instr_addr
|
||||||
%type <sp_cursor_name_and_offset> sp_cursor_name_and_offset
|
%type <sp_cursor_name_and_offset> sp_cursor_name_and_offset
|
||||||
%type <num> opt_exception_clause exception_handlers
|
%type <num> opt_exception_clause exception_handlers
|
||||||
%type <spname> sp_name
|
%type <spname> sp_name opt_sp_name
|
||||||
%type <spvar> sp_param_name sp_param_name_and_type
|
%type <spvar> sp_param_name sp_param_name_and_type
|
||||||
%type <for_loop> sp_for_loop_index_and_bounds
|
%type <for_loop> sp_for_loop_index_and_bounds
|
||||||
%type <for_loop_bounds> sp_for_loop_bounds
|
%type <for_loop_bounds> sp_for_loop_bounds
|
||||||
@ -2219,6 +2221,11 @@ sp_name:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
opt_sp_name:
|
||||||
|
/* Empty */ { $$= NULL; }
|
||||||
|
| sp_name { $$= $1; }
|
||||||
|
;
|
||||||
|
|
||||||
sp_a_chistics:
|
sp_a_chistics:
|
||||||
/* Empty */ {}
|
/* Empty */ {}
|
||||||
| sp_a_chistics sp_chistic {}
|
| sp_a_chistics sp_chistic {}
|
||||||
@ -16352,16 +16359,16 @@ view_or_trigger_or_sp_or_event:
|
|||||||
definer_tail:
|
definer_tail:
|
||||||
view_tail
|
view_tail
|
||||||
| trigger_tail
|
| trigger_tail
|
||||||
| sp_tail
|
| sp_tail_standalone
|
||||||
| sf_tail
|
| sf_tail_standalone
|
||||||
| event_tail
|
| event_tail
|
||||||
;
|
;
|
||||||
|
|
||||||
no_definer_tail:
|
no_definer_tail:
|
||||||
view_tail
|
view_tail
|
||||||
| trigger_tail
|
| trigger_tail
|
||||||
| sp_tail
|
| sp_tail_standalone
|
||||||
| sf_tail
|
| sf_tail_standalone
|
||||||
| udf_tail
|
| udf_tail
|
||||||
| event_tail
|
| event_tail
|
||||||
;
|
;
|
||||||
@ -16713,6 +16720,26 @@ sp_tail:
|
|||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
sf_tail_standalone:
|
||||||
|
sf_tail opt_sp_name
|
||||||
|
{
|
||||||
|
if ($2 && !$2->eq(Lex->sphead))
|
||||||
|
my_yyabort_error((ER_END_IDENTIFIER_DOES_NOT_MATCH, MYF(0),
|
||||||
|
ErrConvDQName($2).ptr(),
|
||||||
|
ErrConvDQName(Lex->sphead).ptr()));
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
sp_tail_standalone:
|
||||||
|
sp_tail opt_sp_name
|
||||||
|
{
|
||||||
|
if ($2 && !$2->eq(Lex->sphead))
|
||||||
|
my_yyabort_error((ER_END_IDENTIFIER_DOES_NOT_MATCH, MYF(0),
|
||||||
|
ErrConvDQName($2).ptr(),
|
||||||
|
ErrConvDQName(Lex->sphead).ptr()));
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
sp_tail_is:
|
sp_tail_is:
|
||||||
IS
|
IS
|
||||||
| AS
|
| AS
|
||||||
|
Reference in New Issue
Block a user