Commit 6a9811b5 authored by iggy@recycle.(none)'s avatar iggy@recycle.(none)

Merge bk-internal.mysql.com:/home/bk/mysql-5.0-maint

into  recycle.(none):/src/bug23491/my50-bug23491
parents f4176443 bbc38df0
...@@ -687,7 +687,7 @@ Warnings: ...@@ -687,7 +687,7 @@ Warnings:
Warning 1356 View 'test.v2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them Warning 1356 View 'test.v2' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
show create table v3; show create table v3;
View Create View View Create View
v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `test`.`sub1`(1) AS `c` v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `sub1`(1) AS `c`
Warnings: Warnings:
Warning 1356 View 'test.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them Warning 1356 View 'test.v3' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
drop view v2; drop view v2;
......
...@@ -3260,5 +3260,28 @@ UNLOCK TABLES; ...@@ -3260,5 +3260,28 @@ UNLOCK TABLES;
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
# #
# Bug #23491: MySQLDump prefix function call in a view by database name
#
create database bug23491_original;
create database bug23491_restore;
use bug23491_original;
create table t1 (c1 int);
create view v1 as select * from t1;
create procedure p1() select 1;
create function f1() returns int return 1;
create view v2 as select f1();
create function f2() returns int return f1();
create view v3 as select bug23491_original.f1();
use bug23491_restore;
show create view bug23491_restore.v2;
View Create View
v2 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v2` AS select `f1`() AS `f1()`
show create view bug23491_restore.v3;
View Create View
v3 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v3` AS select `bug23491_original`.`f1`() AS `bug23491_original.f1()`
drop database bug23491_original;
drop database bug23491_restore;
use test;
#
# End of 5.0 tests # End of 5.0 tests
# #
...@@ -187,7 +187,7 @@ Pos Instruction ...@@ -187,7 +187,7 @@ Pos Instruction
32 set v_dig@4 (v_dig@4 + 1) 32 set v_dig@4 (v_dig@4 + 1)
33 stmt 4 "update sudoku_work set dig = v_dig wh..." 33 stmt 4 "update sudoku_work set dig = v_dig wh..."
34 set v_tcounter@6 (v_tcounter@6 + 1) 34 set v_tcounter@6 (v_tcounter@6 + 1)
35 jump_if_not 37(37) (not(`test`.`sudoku_digit_ok`(v_row@7,v_col@8,v_dig@4))) 35 jump_if_not 37(37) (not(`sudoku_digit_ok`(v_row@7,v_col@8,v_dig@4)))
36 jump 15 36 jump 15
37 set v_i@3 (v_i@3 + 1) 37 set v_i@3 (v_i@3 + 1)
38 jump 15 38 jump 15
......
...@@ -159,7 +159,7 @@ EXPLAIN EXTENDED SELECT myfunc_int(fn(MIN(b))) as c FROM t1 GROUP BY a; ...@@ -159,7 +159,7 @@ EXPLAIN EXTENDED SELECT myfunc_int(fn(MIN(b))) as c FROM t1 GROUP BY a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort
Warnings: Warnings:
Note 1003 select myfunc_int(`test`.`fn`(min(`test`.`t1`.`b`)) AS `fn(MIN(b))`) AS `c` from `test`.`t1` group by `test`.`t1`.`a` Note 1003 select myfunc_int(`fn`(min(`test`.`t1`.`b`)) AS `fn(MIN(b))`) AS `c` from `test`.`t1` group by `test`.`t1`.`a`
EXPLAIN EXTENDED SELECT myfunc_int(test.fn(MIN(b))) as c FROM t1 GROUP BY a; EXPLAIN EXTENDED SELECT myfunc_int(test.fn(MIN(b))) as c FROM t1 GROUP BY a;
id select_type table type possible_keys key key_len ref rows Extra id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort 1 SIMPLE t1 ALL NULL NULL NULL NULL 2 Using temporary; Using filesort
......
...@@ -1463,6 +1463,38 @@ CREATE TABLE t1 (a int) ENGINE=merge UNION=(t2, t3); ...@@ -1463,6 +1463,38 @@ CREATE TABLE t1 (a int) ENGINE=merge UNION=(t2, t3);
--exec $MYSQL_DUMP --skip-comments -c test --exec $MYSQL_DUMP --skip-comments -c test
DROP TABLE t1, t2, t3; DROP TABLE t1, t2, t3;
--echo #
--echo # Bug #23491: MySQLDump prefix function call in a view by database name
--echo #
# Setup
create database bug23491_original;
create database bug23491_restore;
use bug23491_original;
create table t1 (c1 int);
create view v1 as select * from t1;
create procedure p1() select 1;
create function f1() returns int return 1;
create view v2 as select f1();
create function f2() returns int return f1();
create view v3 as select bug23491_original.f1();
# Backup.
--exec $MYSQL_DUMP --skip-comments -uroot --opt --routines bug23491_original > $MYSQLTEST_VARDIR/tmp/bug23491_backup.sql;
# Restore.
--exec $MYSQL bug23491_restore < $MYSQLTEST_VARDIR/tmp/bug23491_backup.sql;
# Verify
use bug23491_restore;
show create view bug23491_restore.v2;
show create view bug23491_restore.v3;
# Cleanup
drop database bug23491_original;
drop database bug23491_restore;
use test;
--echo # --echo #
--echo # End of 5.0 tests --echo # End of 5.0 tests
--echo # --echo #
...@@ -5035,7 +5035,7 @@ Item_func_sp::func_name() const ...@@ -5035,7 +5035,7 @@ Item_func_sp::func_name() const
{ {
THD *thd= current_thd; THD *thd= current_thd;
/* Calculate length to avoid reallocation of string for sure */ /* Calculate length to avoid reallocation of string for sure */
uint len= ((m_name->m_db.length + uint len= ((m_name->m_explicit_name ? m_name->m_db.length : 0 +
m_name->m_name.length)*2 + //characters*quoting m_name->m_name.length)*2 + //characters*quoting
2 + // ` and ` 2 + // ` and `
1 + // . 1 + // .
...@@ -5045,8 +5045,11 @@ Item_func_sp::func_name() const ...@@ -5045,8 +5045,11 @@ Item_func_sp::func_name() const
system_charset_info); system_charset_info);
qname.length(0); qname.length(0);
append_identifier(thd, &qname, m_name->m_db.str, m_name->m_db.length); if (m_name->m_explicit_name)
qname.append('.'); {
append_identifier(thd, &qname, m_name->m_db.str, m_name->m_db.length);
qname.append('.');
}
append_identifier(thd, &qname, m_name->m_name.str, m_name->m_name.length); append_identifier(thd, &qname, m_name->m_name.str, m_name->m_name.length);
return qname.ptr(); return qname.ptr();
} }
......
...@@ -1068,7 +1068,7 @@ sp_exist_routines(THD *thd, TABLE_LIST *routines, bool any, bool no_error) ...@@ -1068,7 +1068,7 @@ sp_exist_routines(THD *thd, TABLE_LIST *routines, bool any, bool no_error)
lex_name.length= strlen(routine->table_name); lex_name.length= strlen(routine->table_name);
lex_db.str= thd->strmake(routine->db, lex_db.length); lex_db.str= thd->strmake(routine->db, lex_db.length);
lex_name.str= thd->strmake(routine->table_name, lex_name.length); lex_name.str= thd->strmake(routine->table_name, lex_name.length);
name= new sp_name(lex_db, lex_name); name= new sp_name(lex_db, lex_name, true);
name->init_qname(thd); name->init_qname(thd);
sp_object_found= sp_find_routine(thd, TYPE_ENUM_PROCEDURE, name, sp_object_found= sp_find_routine(thd, TYPE_ENUM_PROCEDURE, name,
&thd->sp_proc_cache, FALSE) != NULL || &thd->sp_proc_cache, FALSE) != NULL ||
......
...@@ -59,9 +59,10 @@ public: ...@@ -59,9 +59,10 @@ public:
calling set_routine_type(). calling set_routine_type().
*/ */
LEX_STRING m_sroutines_key; LEX_STRING m_sroutines_key;
bool m_explicit_name; /**< Prepend the db name? */
sp_name(LEX_STRING db, LEX_STRING name) sp_name(LEX_STRING db, LEX_STRING name, bool use_explicit_name)
: m_db(db), m_name(name) : m_db(db), m_name(name), m_explicit_name(use_explicit_name)
{ {
m_qname.str= m_sroutines_key.str= 0; m_qname.str= m_sroutines_key.str= 0;
m_qname.length= m_sroutines_key.length= 0; m_qname.length= m_sroutines_key.length= 0;
...@@ -79,6 +80,7 @@ public: ...@@ -79,6 +80,7 @@ public:
m_name.length= m_qname.length= key_len - 1; m_name.length= m_qname.length= key_len - 1;
m_db.str= 0; m_db.str= 0;
m_db.length= 0; m_db.length= 0;
m_explicit_name= false;
} }
// Init. the qualified name from the db and name. // Init. the qualified name from the db and name.
......
...@@ -1577,7 +1577,7 @@ sp_name: ...@@ -1577,7 +1577,7 @@ sp_name:
my_error(ER_SP_WRONG_NAME, MYF(0), $3.str); my_error(ER_SP_WRONG_NAME, MYF(0), $3.str);
MYSQL_YYABORT; MYSQL_YYABORT;
} }
$$= new sp_name($1, $3); $$= new sp_name($1, $3, true);
$$->init_qname(YYTHD); $$->init_qname(YYTHD);
} }
| ident | ident
...@@ -1591,7 +1591,7 @@ sp_name: ...@@ -1591,7 +1591,7 @@ sp_name:
} }
if (thd->copy_db_to(&db.str, &db.length)) if (thd->copy_db_to(&db.str, &db.length))
MYSQL_YYABORT; MYSQL_YYABORT;
$$= new sp_name(db, $1); $$= new sp_name(db, $1, false);
if ($$) if ($$)
$$->init_qname(YYTHD); $$->init_qname(YYTHD);
} }
...@@ -5041,7 +5041,7 @@ simple_expr: ...@@ -5041,7 +5041,7 @@ simple_expr:
| ident '.' ident '(' opt_expr_list ')' | ident '.' ident '(' opt_expr_list ')'
{ {
LEX *lex= Lex; LEX *lex= Lex;
sp_name *name= new sp_name($1, $3); sp_name *name= new sp_name($1, $3, true);
name->init_qname(YYTHD); name->init_qname(YYTHD);
sp_add_used_routine(lex, YYTHD, name, TYPE_ENUM_FUNCTION); sp_add_used_routine(lex, YYTHD, name, TYPE_ENUM_FUNCTION);
...@@ -5156,7 +5156,7 @@ simple_expr: ...@@ -5156,7 +5156,7 @@ simple_expr:
LEX_STRING db; LEX_STRING db;
if (thd->copy_db_to(&db.str, &db.length)) if (thd->copy_db_to(&db.str, &db.length))
MYSQL_YYABORT; MYSQL_YYABORT;
sp_name *name= new sp_name(db, $1); sp_name *name= new sp_name(db, $1, false);
if (name) if (name)
name->init_qname(thd); name->init_qname(thd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment