summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/sp-error.result23
-rw-r--r--mysql-test/t/sp-error.test23
-rw-r--r--sql/sp.cc2
-rw-r--r--sql/sp_head.cc12
-rw-r--r--sql/sql_yacc.yy19
5 files changed, 70 insertions, 9 deletions
diff --git a/mysql-test/r/sp-error.result b/mysql-test/r/sp-error.result
index 6b36b3bb2bf..6426e078894 100644
--- a/mysql-test/r/sp-error.result
+++ b/mysql-test/r/sp-error.result
@@ -1,4 +1,27 @@
delete from mysql.proc;
+create function .f1() returns int return 1;
+create procedure .p1() select 1, database();
+create procedure p1() select 2, database();
+alter procedure .p1 sql security invoker;
+select .f1();
+.f1()
+1
+call .p1();
+1 database()
+1 test
+call p1();
+2 database()
+2 test
+select f1();
+ERROR 42000: FUNCTION test.f1 does not exist
+select db,name,type,security_type from mysql.proc;
+db name type security_type
+ f1 FUNCTION DEFINER
+ p1 PROCEDURE INVOKER
+test p1 PROCEDURE DEFINER
+drop function .f1;
+drop procedure .p1;
+drop procedure p1;
create procedure syntaxerror(t int)|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
create procedure syntaxerror(t int)|
diff --git a/mysql-test/t/sp-error.test b/mysql-test/t/sp-error.test
index f8abab0e7e3..d946ba7afbc 100644
--- a/mysql-test/t/sp-error.test
+++ b/mysql-test/t/sp-error.test
@@ -5,6 +5,29 @@
# Make sure we don't have any procedures left.
delete from mysql.proc;
+# A test "global" procedures, i.e. not belonging to any database.
+create function .f1() returns int return 1;
+create procedure .p1() select 1, database();
+create procedure p1() select 2, database();
+
+alter procedure .p1 sql security invoker;
+
+# This is ok:
+select .f1();
+call .p1();
+call p1();
+
+# This is not ok:
+--error 1304
+select f1();
+
+select db,name,type,security_type from mysql.proc;
+
+drop function .f1;
+drop procedure .p1;
+drop procedure p1;
+
+
delimiter |;
# This should give three syntax errors (sometimes crashed; bug #643)
diff --git a/sql/sp.cc b/sql/sp.cc
index 41d07bb9d40..6475b64eb18 100644
--- a/sql/sp.cc
+++ b/sql/sp.cc
@@ -1054,6 +1054,8 @@ sp_use_new_db(THD *thd, char *newdb, char *olddb, uint olddblen,
DBUG_ENTER("sp_use_new_db");
DBUG_PRINT("enter", ("newdb: %s", newdb));
+ if (! newdb)
+ newdb= (char *)"";
if (thd->db && thd->db[0])
{
if (my_strcasecmp(system_charset_info, thd->db, newdb) == 0)
diff --git a/sql/sp_head.cc b/sql/sp_head.cc
index 4bb06fd8172..5222f8e6fbe 100644
--- a/sql/sp_head.cc
+++ b/sql/sp_head.cc
@@ -296,16 +296,11 @@ sp_head::init_strings(THD *thd, LEX *lex, sp_name *name)
name->m_db.length, name->m_db.str,
name->m_name.length, name->m_name.str));
/* We have to copy strings to get them into the right memroot */
+ m_db.length= name->m_db.length;
if (name->m_db.length == 0)
- {
- m_db.length= (thd->db ? strlen(thd->db) : 0);
- m_db.str= strmake_root(root, (thd->db ? thd->db : ""), m_db.length);
- }
+ m_db.str= NULL;
else
- {
- m_db.length= name->m_db.length;
m_db.str= strmake_root(root, name->m_db.str, name->m_db.length);
- }
m_name.length= name->m_name.length;
m_name.str= strmake_root(root, name->m_name.str, name->m_name.length);
@@ -453,7 +448,8 @@ sp_head::execute(THD *thd)
#endif
dbchanged= FALSE;
- if ((ret= sp_use_new_db(thd, m_db.str, olddb, sizeof(olddb), 0, &dbchanged)))
+ if (m_db.length &&
+ (ret= sp_use_new_db(thd, m_db.str, olddb, sizeof(olddb), 0, &dbchanged)))
goto done;
if ((ctx= thd->spcont))
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index ba3a36f2c34..17cc3b7d12c 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -1207,7 +1207,12 @@ create:
;
sp_name:
- IDENT_sys '.' IDENT_sys
+ '.' IDENT_sys
+ {
+ $$= new sp_name($2);
+ $$->init_qname(YYTHD);
+ }
+ | IDENT_sys '.' IDENT_sys
{
$$= new sp_name($1, $3);
$$->init_qname(YYTHD);
@@ -4312,6 +4317,18 @@ simple_expr:
{ $$= new Item_func_round($3,$5,1); }
| TRUE_SYM
{ $$= new Item_int((char*) "TRUE",1,1); }
+ | '.' ident '(' udf_expr_list ')'
+ {
+ LEX *lex= Lex;
+ sp_name *name= new sp_name($2);
+
+ name->init_qname(YYTHD);
+ sp_add_fun_to_lex(Lex, name);
+ if ($4)
+ $$= new Item_func_sp(name, *$4);
+ else
+ $$= new Item_func_sp(name);
+ }
| ident '.' ident '(' udf_expr_list ')'
{
LEX *lex= Lex;