Bug#31767 DROP FUNCTION name resolution
Backport to 5.5.99
This commit is contained in:
parent
1dd2f90faf
commit
e96932f49e
@ -61,10 +61,10 @@ create table t1 (a int unique);
|
||||
create table t2 (a int);
|
||||
drop function if exists f1;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION f1 does not exist
|
||||
Note 1305 FUNCTION test.f1 does not exist
|
||||
drop function if exists f2;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION f2 does not exist
|
||||
Note 1305 FUNCTION test.f2 does not exist
|
||||
create function f1() returns int
|
||||
begin
|
||||
insert into t1 (a) values (1);
|
||||
|
@ -1231,7 +1231,7 @@ Warnings:
|
||||
Note 1051 Unknown table 'test'
|
||||
drop function if exists test_function;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION test_function does not exist
|
||||
Note 1305 FUNCTION test.test_function does not exist
|
||||
drop view if exists v1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 'test.v1'
|
||||
|
@ -2181,7 +2181,7 @@ drop procedure peter_p1 $$
|
||||
drop procedure peter_p2 $$
|
||||
drop procedure if exists peter_p3 $$
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE peter_p3 does not exist
|
||||
Note 1305 PROCEDURE test.peter_p3 does not exist
|
||||
create procedure peter_p3()
|
||||
begin
|
||||
declare continue handler for sqlexception
|
||||
|
@ -46,7 +46,7 @@ call foo()|
|
||||
ERROR 42000: PROCEDURE test.foo does not exist
|
||||
drop procedure if exists foo|
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE foo does not exist
|
||||
Note 1305 PROCEDURE test.foo does not exist
|
||||
show create procedure foo|
|
||||
ERROR 42000: PROCEDURE foo does not exist
|
||||
show create function foo|
|
||||
@ -1028,7 +1028,7 @@ drop table t1|
|
||||
drop function bug_13627_f|
|
||||
drop function if exists bug12329;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION bug12329 does not exist
|
||||
Note 1305 FUNCTION test.bug12329 does not exist
|
||||
create table t1 as select 1 a;
|
||||
create table t2 as select 1 a;
|
||||
create function bug12329() returns int return (select a from t1);
|
||||
|
@ -394,10 +394,10 @@ CASE expression tests.
|
||||
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE p1 does not exist
|
||||
Note 1305 PROCEDURE test.p1 does not exist
|
||||
DROP PROCEDURE IF EXISTS p2;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE p2 does not exist
|
||||
Note 1305 PROCEDURE test.p2 does not exist
|
||||
DROP TABLE IF EXISTS t1;
|
||||
Warnings:
|
||||
Note 1051 Unknown table 't1'
|
||||
|
@ -2695,10 +2695,10 @@ delete from t3|
|
||||
insert into t3 values(1)|
|
||||
drop procedure if exists bug7992_1|
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE bug7992_1 does not exist
|
||||
Note 1305 PROCEDURE test.bug7992_1 does not exist
|
||||
drop procedure if exists bug7992_2|
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE bug7992_2 does not exist
|
||||
Note 1305 PROCEDURE test.bug7992_2 does not exist
|
||||
create procedure bug7992_1()
|
||||
begin
|
||||
declare i int;
|
||||
|
@ -21,11 +21,11 @@ end|
|
||||
call bug4902_2()|
|
||||
show warnings|
|
||||
Level Code Message
|
||||
Note 1305 PROCEDURE bug4902_2 does not exist
|
||||
Note 1305 PROCEDURE test.bug4902_2 does not exist
|
||||
call bug4902_2()|
|
||||
show warnings|
|
||||
Level Code Message
|
||||
Note 1305 PROCEDURE bug4902_2 does not exist
|
||||
Note 1305 PROCEDURE test.bug4902_2 does not exist
|
||||
drop procedure bug4902_2|
|
||||
drop table if exists t1|
|
||||
create table t1 (
|
||||
|
@ -1183,7 +1183,7 @@ drop table t1;
|
||||
create table t1 (col1 tinyint);
|
||||
drop procedure if exists t1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE t1 does not exist
|
||||
Note 1305 PROCEDURE test.t1 does not exist
|
||||
create procedure t1 () begin declare exit handler for sqlexception
|
||||
select'a'; insert into t1 values (200); end;|
|
||||
call t1();
|
||||
|
@ -392,6 +392,52 @@ a
|
||||
4
|
||||
DROP FUNCTION sequence;
|
||||
DROP TABLE t1,t2;
|
||||
drop function if exists test.metaphon;
|
||||
drop function if exists metaphon;
|
||||
CREATE FUNCTION metaphon RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
|
||||
select metaphon("Hello");
|
||||
metaphon("Hello")
|
||||
HL
|
||||
drop function if exists test.metaphon;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION test.metaphon does not exist
|
||||
select metaphon("Hello");
|
||||
metaphon("Hello")
|
||||
HL
|
||||
drop function metaphon;
|
||||
CREATE FUNCTION test.metaphon(a TEXT) RETURNS TEXT return "This is a SF";
|
||||
create database db_31767;
|
||||
use db_31767;
|
||||
CREATE FUNCTION metaphon RETURNS STRING SONAME "UDF_EXAMPLE_LIB";
|
||||
use test;
|
||||
select metaphon("Hello");
|
||||
metaphon("Hello")
|
||||
HL
|
||||
select test.metaphon("Hello");
|
||||
test.metaphon("Hello")
|
||||
This is a SF
|
||||
drop function metaphon;
|
||||
select metaphon("Hello");
|
||||
metaphon("Hello")
|
||||
This is a SF
|
||||
drop function metaphon;
|
||||
use db_31767;
|
||||
drop database db_31767;
|
||||
drop function if exists no_such_func;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION (UDF) no_such_func does not exist
|
||||
drop function no_such_func;
|
||||
ERROR 42000: FUNCTION (UDF) no_such_func does not exist
|
||||
drop function if exists test.no_such_func;
|
||||
Warnings:
|
||||
Note 1305 FUNCTION test.no_such_func does not exist
|
||||
drop function test.no_such_func;
|
||||
ERROR 42000: FUNCTION test.no_such_func does not exist
|
||||
drop procedure if exists no_such_proc;
|
||||
ERROR 3D000: No database selected
|
||||
drop procedure no_such_proc;
|
||||
ERROR 3D000: No database selected
|
||||
use test;
|
||||
#
|
||||
# Bug#46259: 5.0.83 -> 5.1.36, query doesn't work
|
||||
#
|
||||
|
@ -2086,7 +2086,7 @@ CREATE TABLE t1 ( bug_table_seq INTEGER NOT NULL);
|
||||
CREATE OR REPLACE VIEW v1 AS SELECT * from t1;
|
||||
DROP PROCEDURE IF EXISTS p1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE p1 does not exist
|
||||
Note 1305 PROCEDURE test.p1 does not exist
|
||||
CREATE PROCEDURE p1 ( )
|
||||
BEGIN
|
||||
DO (SELECT @next := IFNULL(max(bug_table_seq),0) + 1 FROM v1);
|
||||
|
@ -228,13 +228,13 @@ INSERT INTO t2 VALUES ( 'a`', 'a`' );
|
||||
INSERT INTO t3 VALUES ( 'a`', 'a`', '1000-01-1' );
|
||||
DROP PROCEDURE IF EXISTS sp1;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE sp1 does not exist
|
||||
Note 1305 PROCEDURE test.sp1 does not exist
|
||||
DROP PROCEDURE IF EXISTS sp2;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE sp2 does not exist
|
||||
Note 1305 PROCEDURE test.sp2 does not exist
|
||||
DROP PROCEDURE IF EXISTS sp3;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE sp3 does not exist
|
||||
Note 1305 PROCEDURE test.sp3 does not exist
|
||||
CREATE PROCEDURE sp1()
|
||||
BEGIN
|
||||
DECLARE x NUMERIC ZEROFILL;
|
||||
|
@ -66,7 +66,7 @@ SET GLOBAL max_prepared_stmt_count=3;
|
||||
** Creating procedure **
|
||||
DROP PROCEDURE IF EXISTS sp_checkstmts;
|
||||
Warnings:
|
||||
Note 1305 PROCEDURE sp_checkstmts does not exist
|
||||
Note 1305 PROCEDURE test.sp_checkstmts does not exist
|
||||
CREATE PROCEDURE sp_checkstmts ()
|
||||
BEGIN
|
||||
PREPARE newstmt from "SELECT * FROM information_schema.CHARACTER_SETS C";
|
||||
|
@ -436,6 +436,75 @@ SELECT * FROM t2 WHERE a = sequence();
|
||||
DROP FUNCTION sequence;
|
||||
DROP TABLE t1,t2;
|
||||
|
||||
#
|
||||
# Bug#31767 (DROP FUNCTION name resolution)
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop function if exists test.metaphon;
|
||||
drop function if exists metaphon;
|
||||
--enable_warnings
|
||||
|
||||
--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
|
||||
eval CREATE FUNCTION metaphon RETURNS STRING SONAME "$UDF_EXAMPLE_LIB";
|
||||
|
||||
select metaphon("Hello");
|
||||
|
||||
# The UDF should not be dropped
|
||||
drop function if exists test.metaphon;
|
||||
|
||||
select metaphon("Hello");
|
||||
|
||||
drop function metaphon;
|
||||
|
||||
CREATE FUNCTION test.metaphon(a TEXT) RETURNS TEXT return "This is a SF";
|
||||
|
||||
create database db_31767;
|
||||
use db_31767;
|
||||
|
||||
--replace_result $UDF_EXAMPLE_LIB UDF_EXAMPLE_LIB
|
||||
eval CREATE FUNCTION metaphon RETURNS STRING SONAME "$UDF_EXAMPLE_LIB";
|
||||
|
||||
use test;
|
||||
|
||||
# Uses the UDF
|
||||
select metaphon("Hello");
|
||||
|
||||
# Uses the SF
|
||||
select test.metaphon("Hello");
|
||||
|
||||
# Should drop the UDF, resolving the name the same way select does.
|
||||
drop function metaphon;
|
||||
|
||||
# Should call the SF
|
||||
select metaphon("Hello");
|
||||
|
||||
# Drop the SF
|
||||
drop function metaphon;
|
||||
|
||||
# Change the current database to none.
|
||||
use db_31767;
|
||||
drop database db_31767;
|
||||
|
||||
drop function if exists no_such_func;
|
||||
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
drop function no_such_func;
|
||||
|
||||
drop function if exists test.no_such_func;
|
||||
|
||||
--error ER_SP_DOES_NOT_EXIST
|
||||
drop function test.no_such_func;
|
||||
|
||||
--error ER_NO_DB_ERROR
|
||||
drop procedure if exists no_such_proc;
|
||||
|
||||
--error ER_NO_DB_ERROR
|
||||
drop procedure no_such_proc;
|
||||
|
||||
use test;
|
||||
|
||||
|
||||
--echo #
|
||||
--echo # Bug#46259: 5.0.83 -> 5.1.36, query doesn't work
|
||||
--echo #
|
||||
|
@ -4132,6 +4132,47 @@ create_sp_error:
|
||||
case SQLCOM_DROP_PROCEDURE:
|
||||
case SQLCOM_DROP_FUNCTION:
|
||||
{
|
||||
#ifdef HAVE_DLOPEN
|
||||
if (lex->sql_command == SQLCOM_DROP_FUNCTION &&
|
||||
! lex->spname->m_explicit_name)
|
||||
{
|
||||
/* DROP FUNCTION <non qualified name> */
|
||||
udf_func *udf = find_udf(lex->spname->m_name.str,
|
||||
lex->spname->m_name.length);
|
||||
if (udf)
|
||||
{
|
||||
if (check_access(thd, DELETE_ACL, "mysql", NULL, NULL, 1, 0))
|
||||
goto error;
|
||||
|
||||
if (!(res = mysql_drop_function(thd, &lex->spname->m_name)))
|
||||
{
|
||||
my_ok(thd);
|
||||
break;
|
||||
}
|
||||
my_error(ER_SP_DROP_FAILED, MYF(0),
|
||||
"FUNCTION (UDF)", lex->spname->m_name.str);
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (lex->spname->m_db.str == NULL)
|
||||
{
|
||||
if (lex->drop_if_exists)
|
||||
{
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||
ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST),
|
||||
"FUNCTION (UDF)", lex->spname->m_name.str);
|
||||
res= FALSE;
|
||||
my_ok(thd);
|
||||
break;
|
||||
}
|
||||
my_error(ER_SP_DOES_NOT_EXIST, MYF(0),
|
||||
"FUNCTION (UDF)", lex->spname->m_name.str);
|
||||
goto error;
|
||||
}
|
||||
/* Fall thought to test for a stored function */
|
||||
}
|
||||
#endif
|
||||
|
||||
int sp_result;
|
||||
int type= (lex->sql_command == SQLCOM_DROP_PROCEDURE ?
|
||||
TYPE_ENUM_PROCEDURE : TYPE_ENUM_FUNCTION);
|
||||
@ -4178,34 +4219,6 @@ create_sp_error:
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef HAVE_DLOPEN
|
||||
if (lex->sql_command == SQLCOM_DROP_FUNCTION)
|
||||
{
|
||||
udf_func *udf = find_udf(lex->spname->m_name.str,
|
||||
lex->spname->m_name.length);
|
||||
if (udf)
|
||||
{
|
||||
if (check_access(thd, DELETE_ACL, "mysql", NULL, NULL, 1, 0))
|
||||
goto error;
|
||||
|
||||
if (!(res = mysql_drop_function(thd, &lex->spname->m_name)))
|
||||
{
|
||||
my_ok(thd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (lex->spname->m_db.str)
|
||||
sp_result= SP_KEY_NOT_FOUND;
|
||||
else
|
||||
{
|
||||
my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), MYF(0));
|
||||
goto error;
|
||||
}
|
||||
}
|
||||
res= sp_result;
|
||||
switch (sp_result) {
|
||||
case SP_OK:
|
||||
@ -4217,7 +4230,7 @@ create_sp_error:
|
||||
res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||
ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST),
|
||||
SP_COM_STRING(lex), lex->spname->m_name.str);
|
||||
SP_COM_STRING(lex), lex->spname->m_qname.str);
|
||||
if (!res)
|
||||
my_ok(thd);
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user