mirror of
https://github.com/MariaDB/server.git
synced 2025-07-29 05:21:33 +03:00
Added IF EXISTS to DROP PROCEDURE|FUNCTION.
Changed another unecessary use of Item_string into LEX_STRING (in sp_pcontext). Docs/sp-implemented.txt: Added IF EXISTS to DROP PROCEDURE|FUNCTION mysql-test/r/sp-error.result: Added IF EXISTS to DROP PROCEDURE|FUNCTION mysql-test/t/sp-error.test: Added IF EXISTS to DROP PROCEDURE|FUNCTION sql/sp_pcontext.cc: Changed another unecessary use of Item_string into LEX_STRING. sql/sp_pcontext.h: Changed another unecessary use of Item_string into LEX_STRING. sql/sql_parse.cc: Added IF EXISTS to DROP PROCEDURE|FUNCTION sql/sql_yacc.yy: Added IF EXISTS to DROP PROCEDURE|FUNCTION
This commit is contained in:
@ -35,7 +35,7 @@ List of what's implemented:
|
|||||||
Is parsed, but a no-op (as there are no characteristics implemented yet).
|
Is parsed, but a no-op (as there are no characteristics implemented yet).
|
||||||
CASCADE/RESTRICT is not implemented (and CASCADE probably will not be).
|
CASCADE/RESTRICT is not implemented (and CASCADE probably will not be).
|
||||||
|
|
||||||
- DROP PROCEDURE|FUNCTION name
|
- DROP PROCEDURE|FUNCTION [IF EXISTS] name
|
||||||
CASCADE/RESTRICT is not implemented (and CASCADE probably will not be).
|
CASCADE/RESTRICT is not implemented (and CASCADE probably will not be).
|
||||||
|
|
||||||
- CALL name (args)
|
- CALL name (args)
|
||||||
|
@ -25,6 +25,9 @@ drop function foo;
|
|||||||
FUNCTION foo does not exist
|
FUNCTION foo does not exist
|
||||||
call foo();
|
call foo();
|
||||||
PROCEDURE foo does not exist
|
PROCEDURE foo does not exist
|
||||||
|
drop procedure if exists foo;
|
||||||
|
Warnings:
|
||||||
|
Warning 1256 PROCEDURE foo does not exist
|
||||||
create procedure foo()
|
create procedure foo()
|
||||||
foo: loop
|
foo: loop
|
||||||
leave bar;
|
leave bar;
|
||||||
|
@ -48,6 +48,7 @@ drop procedure foo|
|
|||||||
drop function foo|
|
drop function foo|
|
||||||
--error 1256
|
--error 1256
|
||||||
call foo()|
|
call foo()|
|
||||||
|
drop procedure if exists foo|
|
||||||
|
|
||||||
# LEAVE/ITERATE with no match
|
# LEAVE/ITERATE with no match
|
||||||
--error 1259
|
--error 1259
|
||||||
|
@ -65,13 +65,12 @@ sp_pcontext::find_pvar(LEX_STRING *name)
|
|||||||
|
|
||||||
while (i-- > 0)
|
while (i-- > 0)
|
||||||
{
|
{
|
||||||
uint len= m_pvar[i].name->const_string()->length();
|
uint len= (m_pvar[i].name.length > name->length ?
|
||||||
|
m_pvar[i].name.length : name->length);
|
||||||
|
|
||||||
if (name->length > len)
|
|
||||||
len= name->length;
|
|
||||||
if (my_strncasecmp(system_charset_info,
|
if (my_strncasecmp(system_charset_info,
|
||||||
name->str,
|
name->str,
|
||||||
m_pvar[i].name->const_string()->ptr(),
|
m_pvar[i].name.str,
|
||||||
len) == 0)
|
len) == 0)
|
||||||
{
|
{
|
||||||
return m_pvar + i;
|
return m_pvar + i;
|
||||||
@ -90,8 +89,8 @@ sp_pcontext::push(LEX_STRING *name, enum enum_field_types type,
|
|||||||
{
|
{
|
||||||
if (m_i == m_framesize)
|
if (m_i == m_framesize)
|
||||||
m_framesize += 1;
|
m_framesize += 1;
|
||||||
m_pvar[m_i].name= new Item_string(name->str, name->length,
|
m_pvar[m_i].name.str= name->str;
|
||||||
default_charset_info);
|
m_pvar[m_i].name.length= name->length,
|
||||||
m_pvar[m_i].type= type;
|
m_pvar[m_i].type= type;
|
||||||
m_pvar[m_i].mode= mode;
|
m_pvar[m_i].mode= mode;
|
||||||
m_pvar[m_i].offset= m_i;
|
m_pvar[m_i].offset= m_i;
|
||||||
|
@ -31,7 +31,7 @@ typedef enum
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Item_string *name;
|
LEX_STRING name;
|
||||||
enum enum_field_types type;
|
enum enum_field_types type;
|
||||||
sp_param_mode_t mode;
|
sp_param_mode_t mode;
|
||||||
uint offset; // Offset in current frame
|
uint offset; // Offset in current frame
|
||||||
|
@ -3101,6 +3101,15 @@ mysql_execute_command(THD *thd)
|
|||||||
send_ok(thd);
|
send_ok(thd);
|
||||||
break;
|
break;
|
||||||
case SP_KEY_NOT_FOUND:
|
case SP_KEY_NOT_FOUND:
|
||||||
|
if (lex->drop_if_exists)
|
||||||
|
{
|
||||||
|
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||||
|
ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST),
|
||||||
|
SP_COM_STRING(lex), lex->udf.name.str);
|
||||||
|
res= 0;
|
||||||
|
send_ok(thd);
|
||||||
|
break;
|
||||||
|
}
|
||||||
net_printf(thd, ER_SP_DOES_NOT_EXIST, SP_COM_STRING(lex),
|
net_printf(thd, ER_SP_DOES_NOT_EXIST, SP_COM_STRING(lex),
|
||||||
lex->udf.name.str);
|
lex->udf.name.str);
|
||||||
goto error;
|
goto error;
|
||||||
|
@ -3699,17 +3699,19 @@ drop:
|
|||||||
lex->drop_if_exists=$3;
|
lex->drop_if_exists=$3;
|
||||||
lex->name=$4.str;
|
lex->name=$4.str;
|
||||||
}
|
}
|
||||||
| DROP FUNCTION_SYM IDENT_sys opt_restrict
|
| DROP FUNCTION_SYM if_exists IDENT_sys opt_restrict
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
LEX *lex=Lex;
|
||||||
lex->sql_command = SQLCOM_DROP_FUNCTION;
|
lex->sql_command = SQLCOM_DROP_FUNCTION;
|
||||||
lex->udf.name= $3;
|
lex->drop_if_exists= $3;
|
||||||
|
lex->udf.name= $4;
|
||||||
}
|
}
|
||||||
| DROP PROCEDURE ident opt_restrict
|
| DROP PROCEDURE if_exists IDENT_sys opt_restrict
|
||||||
{
|
{
|
||||||
LEX *lex=Lex;
|
LEX *lex=Lex;
|
||||||
lex->sql_command = SQLCOM_DROP_PROCEDURE;
|
lex->sql_command = SQLCOM_DROP_PROCEDURE;
|
||||||
lex->udf.name= $3;
|
lex->drop_if_exists= $3;
|
||||||
|
lex->udf.name= $4;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user