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);
|
create table t2 (a int);
|
||||||
drop function if exists f1;
|
drop function if exists f1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 FUNCTION f1 does not exist
|
Note 1305 FUNCTION test.f1 does not exist
|
||||||
drop function if exists f2;
|
drop function if exists f2;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 FUNCTION f2 does not exist
|
Note 1305 FUNCTION test.f2 does not exist
|
||||||
create function f1() returns int
|
create function f1() returns int
|
||||||
begin
|
begin
|
||||||
insert into t1 (a) values (1);
|
insert into t1 (a) values (1);
|
||||||
|
@ -1231,7 +1231,7 @@ Warnings:
|
|||||||
Note 1051 Unknown table 'test'
|
Note 1051 Unknown table 'test'
|
||||||
drop function if exists test_function;
|
drop function if exists test_function;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 FUNCTION test_function does not exist
|
Note 1305 FUNCTION test.test_function does not exist
|
||||||
drop view if exists v1;
|
drop view if exists v1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1051 Unknown table 'test.v1'
|
Note 1051 Unknown table 'test.v1'
|
||||||
|
@ -2181,7 +2181,7 @@ drop procedure peter_p1 $$
|
|||||||
drop procedure peter_p2 $$
|
drop procedure peter_p2 $$
|
||||||
drop procedure if exists peter_p3 $$
|
drop procedure if exists peter_p3 $$
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE peter_p3 does not exist
|
Note 1305 PROCEDURE test.peter_p3 does not exist
|
||||||
create procedure peter_p3()
|
create procedure peter_p3()
|
||||||
begin
|
begin
|
||||||
declare continue handler for sqlexception
|
declare continue handler for sqlexception
|
||||||
|
@ -46,7 +46,7 @@ call foo()|
|
|||||||
ERROR 42000: PROCEDURE test.foo does not exist
|
ERROR 42000: PROCEDURE test.foo does not exist
|
||||||
drop procedure if exists foo|
|
drop procedure if exists foo|
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE foo does not exist
|
Note 1305 PROCEDURE test.foo does not exist
|
||||||
show create procedure foo|
|
show create procedure foo|
|
||||||
ERROR 42000: PROCEDURE foo does not exist
|
ERROR 42000: PROCEDURE foo does not exist
|
||||||
show create function foo|
|
show create function foo|
|
||||||
@ -1028,7 +1028,7 @@ drop table t1|
|
|||||||
drop function bug_13627_f|
|
drop function bug_13627_f|
|
||||||
drop function if exists bug12329;
|
drop function if exists bug12329;
|
||||||
Warnings:
|
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 t1 as select 1 a;
|
||||||
create table t2 as select 1 a;
|
create table t2 as select 1 a;
|
||||||
create function bug12329() returns int return (select a from t1);
|
create function bug12329() returns int return (select a from t1);
|
||||||
|
@ -394,10 +394,10 @@ CASE expression tests.
|
|||||||
|
|
||||||
DROP PROCEDURE IF EXISTS p1;
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE p1 does not exist
|
Note 1305 PROCEDURE test.p1 does not exist
|
||||||
DROP PROCEDURE IF EXISTS p2;
|
DROP PROCEDURE IF EXISTS p2;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE p2 does not exist
|
Note 1305 PROCEDURE test.p2 does not exist
|
||||||
DROP TABLE IF EXISTS t1;
|
DROP TABLE IF EXISTS t1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1051 Unknown table 't1'
|
Note 1051 Unknown table 't1'
|
||||||
|
@ -2695,10 +2695,10 @@ delete from t3|
|
|||||||
insert into t3 values(1)|
|
insert into t3 values(1)|
|
||||||
drop procedure if exists bug7992_1|
|
drop procedure if exists bug7992_1|
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE bug7992_1 does not exist
|
Note 1305 PROCEDURE test.bug7992_1 does not exist
|
||||||
drop procedure if exists bug7992_2|
|
drop procedure if exists bug7992_2|
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE bug7992_2 does not exist
|
Note 1305 PROCEDURE test.bug7992_2 does not exist
|
||||||
create procedure bug7992_1()
|
create procedure bug7992_1()
|
||||||
begin
|
begin
|
||||||
declare i int;
|
declare i int;
|
||||||
|
@ -21,11 +21,11 @@ end|
|
|||||||
call bug4902_2()|
|
call bug4902_2()|
|
||||||
show warnings|
|
show warnings|
|
||||||
Level Code Message
|
Level Code Message
|
||||||
Note 1305 PROCEDURE bug4902_2 does not exist
|
Note 1305 PROCEDURE test.bug4902_2 does not exist
|
||||||
call bug4902_2()|
|
call bug4902_2()|
|
||||||
show warnings|
|
show warnings|
|
||||||
Level Code Message
|
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 procedure bug4902_2|
|
||||||
drop table if exists t1|
|
drop table if exists t1|
|
||||||
create table t1 (
|
create table t1 (
|
||||||
|
@ -1183,7 +1183,7 @@ drop table t1;
|
|||||||
create table t1 (col1 tinyint);
|
create table t1 (col1 tinyint);
|
||||||
drop procedure if exists t1;
|
drop procedure if exists t1;
|
||||||
Warnings:
|
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
|
create procedure t1 () begin declare exit handler for sqlexception
|
||||||
select'a'; insert into t1 values (200); end;|
|
select'a'; insert into t1 values (200); end;|
|
||||||
call t1();
|
call t1();
|
||||||
|
@ -392,6 +392,52 @@ a
|
|||||||
4
|
4
|
||||||
DROP FUNCTION sequence;
|
DROP FUNCTION sequence;
|
||||||
DROP TABLE t1,t2;
|
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
|
# 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;
|
CREATE OR REPLACE VIEW v1 AS SELECT * from t1;
|
||||||
DROP PROCEDURE IF EXISTS p1;
|
DROP PROCEDURE IF EXISTS p1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE p1 does not exist
|
Note 1305 PROCEDURE test.p1 does not exist
|
||||||
CREATE PROCEDURE p1 ( )
|
CREATE PROCEDURE p1 ( )
|
||||||
BEGIN
|
BEGIN
|
||||||
DO (SELECT @next := IFNULL(max(bug_table_seq),0) + 1 FROM v1);
|
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' );
|
INSERT INTO t3 VALUES ( 'a`', 'a`', '1000-01-1' );
|
||||||
DROP PROCEDURE IF EXISTS sp1;
|
DROP PROCEDURE IF EXISTS sp1;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE sp1 does not exist
|
Note 1305 PROCEDURE test.sp1 does not exist
|
||||||
DROP PROCEDURE IF EXISTS sp2;
|
DROP PROCEDURE IF EXISTS sp2;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE sp2 does not exist
|
Note 1305 PROCEDURE test.sp2 does not exist
|
||||||
DROP PROCEDURE IF EXISTS sp3;
|
DROP PROCEDURE IF EXISTS sp3;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE sp3 does not exist
|
Note 1305 PROCEDURE test.sp3 does not exist
|
||||||
CREATE PROCEDURE sp1()
|
CREATE PROCEDURE sp1()
|
||||||
BEGIN
|
BEGIN
|
||||||
DECLARE x NUMERIC ZEROFILL;
|
DECLARE x NUMERIC ZEROFILL;
|
||||||
|
@ -66,7 +66,7 @@ SET GLOBAL max_prepared_stmt_count=3;
|
|||||||
** Creating procedure **
|
** Creating procedure **
|
||||||
DROP PROCEDURE IF EXISTS sp_checkstmts;
|
DROP PROCEDURE IF EXISTS sp_checkstmts;
|
||||||
Warnings:
|
Warnings:
|
||||||
Note 1305 PROCEDURE sp_checkstmts does not exist
|
Note 1305 PROCEDURE test.sp_checkstmts does not exist
|
||||||
CREATE PROCEDURE sp_checkstmts ()
|
CREATE PROCEDURE sp_checkstmts ()
|
||||||
BEGIN
|
BEGIN
|
||||||
PREPARE newstmt from "SELECT * FROM information_schema.CHARACTER_SETS C";
|
PREPARE newstmt from "SELECT * FROM information_schema.CHARACTER_SETS C";
|
||||||
|
@ -436,6 +436,75 @@ SELECT * FROM t2 WHERE a = sequence();
|
|||||||
DROP FUNCTION sequence;
|
DROP FUNCTION sequence;
|
||||||
DROP TABLE t1,t2;
|
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 #
|
||||||
--echo # Bug#46259: 5.0.83 -> 5.1.36, query doesn't work
|
--echo # Bug#46259: 5.0.83 -> 5.1.36, query doesn't work
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -4132,6 +4132,47 @@ create_sp_error:
|
|||||||
case SQLCOM_DROP_PROCEDURE:
|
case SQLCOM_DROP_PROCEDURE:
|
||||||
case SQLCOM_DROP_FUNCTION:
|
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 sp_result;
|
||||||
int type= (lex->sql_command == SQLCOM_DROP_PROCEDURE ?
|
int type= (lex->sql_command == SQLCOM_DROP_PROCEDURE ?
|
||||||
TYPE_ENUM_PROCEDURE : TYPE_ENUM_FUNCTION);
|
TYPE_ENUM_PROCEDURE : TYPE_ENUM_FUNCTION);
|
||||||
@ -4178,34 +4219,6 @@ create_sp_error:
|
|||||||
}
|
}
|
||||||
#endif
|
#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;
|
res= sp_result;
|
||||||
switch (sp_result) {
|
switch (sp_result) {
|
||||||
case SP_OK:
|
case SP_OK:
|
||||||
@ -4217,7 +4230,7 @@ create_sp_error:
|
|||||||
res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
|
res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
|
||||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_NOTE,
|
||||||
ER_SP_DOES_NOT_EXIST, ER(ER_SP_DOES_NOT_EXIST),
|
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)
|
if (!res)
|
||||||
my_ok(thd);
|
my_ok(thd);
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user