MySQL Lists are EOL. Please join:

List:Commits« Previous MessageNext Message »
From:Chad MILLER Date:May 15 2008 11:13pm
Subject:bk commit into 5.0 tree (cmiller:1.2624) BUG#36570
View as plain text  
Below is the list of changes that have just been committed into a local
5.0 repository of cmiller.  When cmiller does a push these changes
will be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2008-05-15 19:13:24-04:00, cmiller@stripped +8 -0
  Bug#36570: Parse error of CREATE PROCEDURE stmt with comments on \
  	slave
  
  The stored-routine code took the contents of the (lowest) parser
  and copied it directly to the binlog, which causes problems if there
  is a special case of interpretation at the parser level -- which 
  there is, in the "/*!VER */" comments.  The trailing "*/" caused
  errors on the slave, naturally.
  
  Now, since by that point we have /properly/ created parse-tree (as 
  the rest of the server should do!) for the stored-routine CREATE, we
  can construct a perfect statement from that information, instead of
  writing uncertain information from an unknown parser state.  
  Fortunately, there's already a function nearby that does exactly 
  that.
  ---
  Update for Bug#36570.  Qualify routine names with db name when
  writing to the binlog ONLY if the source text is qualified.

  mysql-test/r/binlog_innodb.result@stripped, 2008-05-15 19:13:22-04:00, cmiller@stripped +1 -1
    Offsets changed due to quoting.
    ---
    New offset to account for db-qualified names.

  mysql-test/r/ctype_cp932_binlog.result@stripped, 2008-05-15 19:13:22-04:00, cmiller@stripped +4 -4
    Offsets changed due to quoting.
    ---
    Qualify routine names with DB.  Offsets change also.

  mysql-test/r/mysqlbinlog.result@stripped, 2008-05-15 19:13:22-04:00, cmiller@stripped +1 -1
    Case changed in result due to interpretation of data instead of 
    literal recitation.
    ---
    Qualify procedure name with db.

  mysql-test/r/rpl_sp.result@stripped, 2008-05-15 19:13:22-04:00, cmiller@stripped +67 -32
    Offsets changed due to quoting.  Added tests.
    ---
    Qualify routine names with DB if qualified in query.  Offsets change also.

  mysql-test/t/rpl_sp.test@stripped, 2008-05-15 19:13:22-04:00, cmiller@stripped +44 -0
    Add version-limiting quotes to exercise bug#36570.  Test that 
    backtick-quoted identifiers and labels work also.
    ---
    Use different db to show qualification works.  Qualify routine names
    with DB if qualified in query.

  sql/sp.cc@stripped, 2008-05-15 19:13:22-04:00, cmiller@stripped +39 -23
    In create_string, we may not have a sp_name parameter yet, so
    instead pass the char* and length of the only member we'd get out
    of it.
    
    Having done that, we can use the same function to write the 
    CREATE (FUNC|TRIG|PROC) statement to the binlog as we always used
    to display the statement to the user.
    ---
    Make the db name part of the CREATE string if it is specified.
    
    Specify it in part of writing to the binlog when creating a new
    routine.

  sql/sp_head.cc@stripped, 2008-05-15 19:13:22-04:00, cmiller@stripped +4 -0
    Set the sp_head m_explicit_name member as the sp_name member is set.  
    We can not peek at this later, as the sp_name is gone by then.

  sql/sp_head.h@stripped, 2008-05-15 19:13:22-04:00, cmiller@stripped +1 -0
    Add a member to track whether the name is qualified with the 
    database.

diff -Nrup a/mysql-test/r/binlog_innodb.result b/mysql-test/r/binlog_innodb.result
--- a/mysql-test/r/binlog_innodb.result	2008-02-19 10:27:17 -05:00
+++ b/mysql-test/r/binlog_innodb.result	2008-05-15 19:13:22 -04:00
@@ -34,6 +34,6 @@ END|
 INSERT INTO t2 VALUES (2),(10+bug23333());
 SHOW MASTER STATUS;
 File	Position	Binlog_Do_DB	Binlog_Ignore_DB
-#	184136		
+#	184141		
 DROP FUNCTION bug23333;
 DROP TABLE t1, t2;
diff -Nrup a/mysql-test/r/ctype_cp932_binlog.result b/mysql-test/r/ctype_cp932_binlog.result
--- a/mysql-test/r/ctype_cp932_binlog.result	2008-02-19 10:27:17 -05:00
+++ b/mysql-test/r/ctype_cp932_binlog.result	2008-05-15 19:13:22 -04:00
@@ -34,12 +34,12 @@ Log_name	Pos	Event_type	Server_id	End_lo
 master-bin.000001	362	Query	1	528	use `test`; CREATE TABLE t4 (s1 CHAR(50) CHARACTER SET latin1,
 s2 CHAR(50) CHARACTER SET cp932,
 d DECIMAL(10,2))
-master-bin.000001	528	Query	1	776	use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE bug18293 (IN ins1 CHAR(50),
+master-bin.000001	528	Query	1	777	use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `bug18293`(IN ins1 CHAR(50),
 IN ins2 CHAR(50) CHARACTER SET cp932,
 IN ind DECIMAL(10,2))
 BEGIN
 INSERT INTO t4 VALUES (ins1, ins2, ind);
 END
-master-bin.000001	776	Query	1	987	use `test`; INSERT INTO t4 VALUES ( NAME_CONST('ins1',_latin1 0x466F6F2773206120426172),  NAME_CONST('ins2',_cp932 0xED40ED41ED42),  NAME_CONST('ind',47.93))
-master-bin.000001	987	Query	1	1076	use `test`; DROP PROCEDURE bug18293
-master-bin.000001	1076	Query	1	1155	use `test`; DROP TABLE t4
+master-bin.000001	777	Query	1	988	use `test`; INSERT INTO t4 VALUES ( NAME_CONST('ins1',_latin1 0x466F6F2773206120426172),  NAME_CONST('ins2',_cp932 0xED40ED41ED42),  NAME_CONST('ind',47.93))
+master-bin.000001	988	Query	1	1077	use `test`; DROP PROCEDURE bug18293
+master-bin.000001	1077	Query	1	1156	use `test`; DROP TABLE t4
diff -Nrup a/mysql-test/r/mysqlbinlog.result b/mysql-test/r/mysqlbinlog.result
--- a/mysql-test/r/mysqlbinlog.result	2008-02-01 11:26:16 -05:00
+++ b/mysql-test/r/mysqlbinlog.result	2008-05-15 19:13:22 -04:00
@@ -268,7 +268,7 @@ SET @@session.foreign_key_checks=1, @@se
 SET @@session.sql_mode=0/*!*/;
 /*!\C latin1 *//*!*/;
 SET @@session.character_set_client=8,@@session.collation_connection=8,@@session.collation_server=8/*!*/;
-CREATE DEFINER=`root`@`localhost` procedure p1()
+CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
 begin
 select 1;
 end
diff -Nrup a/mysql-test/r/rpl_sp.result b/mysql-test/r/rpl_sp.result
--- a/mysql-test/r/rpl_sp.result	2008-05-08 03:41:20 -04:00
+++ b/mysql-test/r/rpl_sp.result	2008-05-15 19:13:22 -04:00
@@ -386,7 +386,7 @@ Log_name	Pos	Event_type	Server_id	End_lo
 master-bin.000001	#	Query	1	#	drop database if exists mysqltest1
 master-bin.000001	#	Query	1	#	create database mysqltest1
 master-bin.000001	#	Query	1	#	use `mysqltest1`; create table t1 (a varchar(100))
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` procedure foo()
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`()
 begin
 declare b int;
 set b = 8;
@@ -396,20 +396,20 @@ end
 master-bin.000001	#	Query	1	#	use `mysqltest1`; insert into t1 values ( NAME_CONST('b',8))
 master-bin.000001	#	Query	1	#	use `mysqltest1`; insert into t1 values (unix_timestamp())
 master-bin.000001	#	Query	1	#	use `mysqltest1`; delete from t1
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` procedure foo2()
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `foo2`()
 select * from mysqltest1.t1
 master-bin.000001	#	Query	1	#	use `mysqltest1`; alter procedure foo2 contains sql
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop table t1
 master-bin.000001	#	Query	1	#	use `mysqltest1`; create table t1 (a int)
 master-bin.000001	#	Query	1	#	use `mysqltest1`; create table t2 like t1
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` procedure foo3()
-deterministic
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `foo3`()
+    DETERMINISTIC
 insert into t1 values (15)
 master-bin.000001	#	Query	1	#	use `mysqltest1`; grant CREATE ROUTINE, EXECUTE on mysqltest1.* to "zedjzlcsjhd"@127.0.0.1
 master-bin.000001	#	Query	1	#	use `mysqltest1`; grant SELECT on mysqltest1.t1 to "zedjzlcsjhd"@127.0.0.1
 master-bin.000001	#	Query	1	#	use `mysqltest1`; grant SELECT, INSERT on mysqltest1.t2 to "zedjzlcsjhd"@127.0.0.1
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`zedjzlcsjhd`@`127.0.0.1` procedure foo4()
-deterministic
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`zedjzlcsjhd`@`127.0.0.1` PROCEDURE `foo4`()
+    DETERMINISTIC
 begin
 insert into t2 values(3);
 insert into t1 values (5);
@@ -423,8 +423,8 @@ master-bin.000001	#	Query	1	#	use `mysql
 master-bin.000001	#	Query	1	#	use `mysqltest1`; delete from t2
 master-bin.000001	#	Query	1	#	use `mysqltest1`; alter table t2 add unique (a)
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop procedure foo4
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` procedure foo4()
-deterministic
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `foo4`()
+    DETERMINISTIC
 begin
 insert into t2 values(20),(20);
 end
@@ -433,9 +433,8 @@ master-bin.000001	#	Query	1	#	use `mysql
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop procedure foo
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop procedure foo2
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop procedure foo3
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function fn1(x int)
-returns int
-deterministic
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` FUNCTION `fn1`(x int) RETURNS int(11)
+    DETERMINISTIC
 begin
 insert into t1 values (x);
 return x+2;
@@ -444,32 +443,27 @@ master-bin.000001	#	Query	1	#	use `mysql
 master-bin.000001	#	Query	1	#	use `mysqltest1`; SELECT `mysqltest1`.`fn1`(20)
 master-bin.000001	#	Query	1	#	use `mysqltest1`; insert into t2 values(fn1(21))
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop function fn1
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function fn1()
-returns int
-no sql
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` FUNCTION `fn1`() RETURNS int(11)
+    NO SQL
 begin
 return unix_timestamp();
 end
 master-bin.000001	#	Query	1	#	use `mysqltest1`; delete from t1
 master-bin.000001	#	Query	1	#	use `mysqltest1`; insert into t1 values(fn1())
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`zedjzlcsjhd`@`127.0.0.1` function fn2()
-returns int
-no sql
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`zedjzlcsjhd`@`127.0.0.1` FUNCTION `fn2`() RETURNS int(11)
+    NO SQL
 begin
 return unix_timestamp();
 end
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function fn3()
-returns int
-not deterministic
-reads sql data
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` FUNCTION `fn3`() RETURNS int(11)
+    READS SQL DATA
 begin
 return 0;
 end
 master-bin.000001	#	Query	1	#	use `mysqltest1`; delete from t2
 master-bin.000001	#	Query	1	#	use `mysqltest1`; alter table t2 add unique (a)
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop function fn1
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` function fn1(x int)
-returns int
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` FUNCTION `fn1`(x int) RETURNS int(11)
 begin
 insert into t2 values(x),(x);
 return 10;
@@ -482,15 +476,15 @@ master-bin.000001	#	Query	1	#	use `mysql
 master-bin.000001	#	Query	1	#	use `mysqltest1`; delete from t1
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop trigger trg
 master-bin.000001	#	Query	1	#	use `mysqltest1`; insert into t1 values (1)
-master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` procedure foo()
-not deterministic
-reads sql data
+master-bin.000001	#	Query	1	#	use `mysqltest1`; CREATE DEFINER=`root`@`localhost` PROCEDURE `foo`()
+    READS SQL DATA
 select * from t1
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop procedure foo
 master-bin.000001	#	Query	1	#	use `mysqltest1`; drop function fn1
 master-bin.000001	#	Query	1	#	drop database mysqltest1
 master-bin.000001	#	Query	1	#	drop user "zedjzlcsjhd"@127.0.0.1
-master-bin.000001	#	Query	1	#	use `test`; CREATE DEFINER=`root`@`localhost` function f1() returns int reads sql data
+master-bin.000001	#	Query	1	#	use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION `f1`() RETURNS int(11)
+    READS SQL DATA
 begin
 declare var integer;
 declare c cursor for select a from v1;
@@ -506,12 +500,14 @@ master-bin.000001	#	Query	1	#	use `test`
 master-bin.000001	#	Query	1	#	use `test`; drop function f1
 master-bin.000001	#	Query	1	#	use `test`; DROP TABLE IF EXISTS t1
 master-bin.000001	#	Query	1	#	use `test`; CREATE TABLE t1(col VARCHAR(10))
-master-bin.000001	#	Query	1	#	use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE p1(arg VARCHAR(10))
+master-bin.000001	#	Query	1	#	use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`(arg VARCHAR(10))
 INSERT INTO t1 VALUES(arg)
 master-bin.000001	#	Query	1	#	use `test`; INSERT INTO t1 VALUES( NAME_CONST('arg',_latin1'test'))
 master-bin.000001	#	Query	1	#	use `test`; DROP PROCEDURE p1
-master-bin.000001	#	Query	1	#	use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE p1() SET @a = 1
-master-bin.000001	#	Query	1	#	use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION f1() RETURNS INT RETURN 0
+master-bin.000001	#	Query	1	#	use `test`; CREATE DEFINER=`root`@`localhost` PROCEDURE `p1`()
+SET @a = 1
+master-bin.000001	#	Query	1	#	use `test`; CREATE DEFINER=`root`@`localhost` FUNCTION `f1`() RETURNS int(11)
+RETURN 0
 master-bin.000001	#	Query	1	#	use `test`; DROP PROCEDURE p1
 master-bin.000001	#	Query	1	#	use `test`; DROP FUNCTION f1
 master-bin.000001	#	Query	1	#	use `test`; drop table t1
@@ -520,9 +516,10 @@ master-bin.000001	#	Query	1	#	drop datab
 master-bin.000001	#	Query	1	#	create database mysqltest
 master-bin.000001	#	Query	1	#	create database mysqltest2
 master-bin.000001	#	Query	1	#	use `mysqltest2`; create table t ( t integer )
-master-bin.000001	#	Query	1	#	use `mysqltest2`; CREATE DEFINER=`root`@`localhost` procedure mysqltest.test() begin end
+master-bin.000001	#	Query	1	#	use `mysqltest2`; CREATE DEFINER=`root`@`localhost` PROCEDURE `mysqltest`.`test`()
+begin end
 master-bin.000001	#	Query	1	#	use `mysqltest2`; insert into t values ( 1 )
-master-bin.000001	#	Query	1	#	use `mysqltest2`; CREATE DEFINER=`root`@`localhost` function f1 () returns int
+master-bin.000001	#	Query	1	#	use `mysqltest2`; CREATE DEFINER=`root`@`localhost` FUNCTION `f1`() RETURNS int(11)
 begin
 insert into t values (1);
 return 0;
@@ -532,3 +529,41 @@ set global log_bin_trust_function_creato
 set global log_bin_trust_function_creators=0;
 drop database mysqltest;
 drop database mysqltest2;
+use test;
+/*!50001 create procedure `mysqltestbug36570_p1`() */
+begin
+select 1;
+end|
+use mysql|
+create procedure test.` mysqltestbug36570_p2`(/*!50001 a int*/)`label`:
+begin
+select a;
+end|
+/*!50001 create function test.mysqltestbug36570_f1() */
+returns int
+/*!50001 deterministic */
+begin
+return 3;
+end|
+use test|
+show procedure status like '%mysqltestbug36570%';
+Db	Name	Type	Definer	Modified	Created	Security_type	Comment
+test	 mysqltestbug36570_p2	PROCEDURE	root@localhost	t	t	DEFINER	
+test	mysqltestbug36570_p1	PROCEDURE	root@localhost	t	t	DEFINER	
+show create procedure ` mysqltestbug36570_p2`;
+Procedure	sql_mode	Create Procedure
+ mysqltestbug36570_p2		CREATE DEFINER=`root`@`localhost` PROCEDURE ` mysqltestbug36570_p2`(/*!50001 a int*/)
+`label`:
+begin
+select a;
+end
+call ` mysqltestbug36570_p2`(42);
+a
+42
+show function status like '%mysqltestbug36570%';
+Db	Name	Type	Definer	Modified	Created	Security_type	Comment
+test	mysqltestbug36570_f1	FUNCTION	root@localhost	t	t	DEFINER	
+use test;
+drop procedure mysqltestbug36570_p1;
+drop procedure ` mysqltestbug36570_p2`;
+drop function mysqltestbug36570_f1;
diff -Nrup a/mysql-test/t/rpl_sp.test b/mysql-test/t/rpl_sp.test
--- a/mysql-test/t/rpl_sp.test	2008-01-31 06:17:25 -05:00
+++ b/mysql-test/t/rpl_sp.test	2008-05-15 19:13:22 -04:00
@@ -577,3 +577,47 @@ set global log_bin_trust_function_creato
 drop database mysqltest;
 drop database mysqltest2;
 sync_slave_with_master;
+
+#
+# Bug#36570: Parse error of CREATE PROCEDURE stmt with comments on slave
+#
+connection master;
+use test;
+delimiter |;
+
+/*!50001 create procedure `mysqltestbug36570_p1`() */
+begin
+	select 1;
+end|
+
+use mysql|
+create procedure test.` mysqltestbug36570_p2`(/*!50001 a int*/)`label`:
+begin
+	select a;
+end|
+
+/*!50001 create function test.mysqltestbug36570_f1() */
+	returns int
+	/*!50001 deterministic */
+begin
+	return 3;
+end|
+use test|
+
+delimiter ;|
+
+sync_slave_with_master;
+connection slave;
+--replace_column 5 t 6 t
+show procedure status like '%mysqltestbug36570%';
+show create procedure ` mysqltestbug36570_p2`;
+call ` mysqltestbug36570_p2`(42);
+
+--replace_column 5 t 6 t
+show function status like '%mysqltestbug36570%';
+
+connection master;
+use test;
+drop procedure mysqltestbug36570_p1;
+drop procedure ` mysqltestbug36570_p2`;
+drop function mysqltestbug36570_f1;
diff -Nrup a/sql/sp.cc b/sql/sp.cc
--- a/sql/sp.cc	2008-02-19 10:27:17 -05:00
+++ b/sql/sp.cc	2008-05-15 19:13:22 -04:00
@@ -25,7 +25,8 @@
 static bool
 create_string(THD *thd, String *buf,
 	      int sp_type,
-	      sp_name *name,
+	      const char *db, ulong dblen,
+	      const char *name, ulong namelen,
 	      const char *params, ulong paramslen,
 	      const char *returns, ulong returnslen,
 	      const char *body, ulong bodylen,
@@ -426,12 +427,13 @@ db_load_routine(THD *thd, int type, sp_n
    */
 
   if (!create_string(thd, &defstr,
-		     type,
-		     name,
-		     params, strlen(params),
-		     returns, strlen(returns),
-		     body, strlen(body),
-		     &chistics, &definer_user_name, &definer_host_name))
+                     type,
+                     NULL, 0,
+                     name->m_name.str, name->m_name.length,
+                     params, strlen(params),
+                     returns, strlen(returns),
+                     body, strlen(body),
+                     &chistics, &definer_user_name, &definer_host_name))
   {
     ret= SP_INTERNAL_ERROR;
     goto end;
@@ -518,6 +520,7 @@ db_create_routine(THD *thd, int type, sp
   DBUG_ENTER("db_create_routine");
   DBUG_PRINT("enter", ("type: %d name: %.*s",type,sp->m_name.length,
                        sp->m_name.str));
+  String retstr(64);
 
   if (!(table= open_proc_table_for_update(thd)))
     ret= SP_OPEN_TABLE_FAILED;
@@ -568,7 +571,6 @@ db_create_routine(THD *thd, int type, sp
       store(sp->m_params.str, sp->m_params.length, system_charset_info);
     if (sp->m_type == TYPE_ENUM_FUNCTION)
     {
-      String retstr(64);
       sp_returns_type(thd, retstr, sp);
       table->field[MYSQL_PROC_FIELD_RETURNS]->
 	store(retstr.ptr(), retstr.length(), system_charset_info);
@@ -625,13 +627,21 @@ db_create_routine(THD *thd, int type, sp
 
       String log_query;
       log_query.set_charset(system_charset_info);
-      log_query.append(STRING_WITH_LEN("CREATE "));
-      append_definer(thd, &log_query, &thd->lex->definer->user,
-                     &thd->lex->definer->host);
-      log_query.append(thd->lex->stmt_definition_begin,
-                       (char *)sp->m_body_begin -
-                       thd->lex->stmt_definition_begin +
-                       sp->m_body.length);
+
+      if (!create_string(thd, &log_query,
+                         sp->m_type,
+                         (sp->m_explicit_name ? sp->m_db.str : NULL), 
+                         (sp->m_explicit_name ? sp->m_db.length : 0), 
+                         sp->m_name.str, sp->m_name.length,
+                         sp->m_params.str, sp->m_params.length,
+                         retstr.c_ptr(), retstr.length(),
+                         sp->m_body.str, sp->m_body.length,
+                         sp->m_chistics, &(thd->lex->definer->user),
+                         &(thd->lex->definer->host)))
+      {
+        ret= SP_INTERNAL_ERROR;
+        goto done;
+      }
 
       /* Such a statement can always go directly to binlog, no trans cache */
       Query_log_event qinfo(thd, log_query.c_ptr(), log_query.length(), 0,
@@ -1797,17 +1807,18 @@ sp_cache_routines_and_add_tables_for_tri
  */
 static bool
 create_string(THD *thd, String *buf,
-	      int type,
-	      sp_name *name,
-	      const char *params, ulong paramslen,
-	      const char *returns, ulong returnslen,
-	      const char *body, ulong bodylen,
-	      st_sp_chistics *chistics,
+              int type,
+              const char *db, ulong dblen,
+              const char *name, ulong namelen,
+              const char *params, ulong paramslen,
+              const char *returns, ulong returnslen,
+              const char *body, ulong bodylen,
+              st_sp_chistics *chistics,
               const LEX_STRING *definer_user,
               const LEX_STRING *definer_host)
 {
   /* Make some room to begin with */
-  if (buf->alloc(100 + name->m_qname.length + paramslen + returnslen + bodylen +
+  if (buf->alloc(100 + dblen + 1 + namelen + paramslen + returnslen + bodylen +
 		 chistics->comment.length + 10 /* length of " DEFINER= "*/ +
                  USER_HOST_BUFF_SIZE))
     return FALSE;
@@ -1818,7 +1829,12 @@ create_string(THD *thd, String *buf,
     buf->append(STRING_WITH_LEN("FUNCTION "));
   else
     buf->append(STRING_WITH_LEN("PROCEDURE "));
-  append_identifier(thd, buf, name->m_name.str, name->m_name.length);
+  if (dblen > 0)
+  {
+    append_identifier(thd, buf, db, dblen);
+    buf->append('.');
+  }
+  append_identifier(thd, buf, name, namelen);
   buf->append('(');
   buf->append(params, paramslen);
   buf->append(')');
diff -Nrup a/sql/sp_head.cc b/sql/sp_head.cc
--- a/sql/sp_head.cc	2008-01-23 16:04:18 -05:00
+++ b/sql/sp_head.cc	2008-05-15 19:13:22 -04:00
@@ -522,6 +522,8 @@ sp_head::init(LEX *lex)
   m_qname.str= NULL;
   m_qname.length= 0;
 
+  m_explicit_name= false;
+
   m_db.str= NULL;
   m_db.length= 0;
 
@@ -563,6 +565,8 @@ sp_head::init_sp_name(THD *thd, sp_name 
   m_name.length= spname->m_name.length;
   m_name.str= strmake_root(thd->mem_root, spname->m_name.str,
                            spname->m_name.length);
+
+  m_explicit_name= spname->m_explicit_name;
 
   if (spname->m_qname.length == 0)
     spname->init_qname(thd);
diff -Nrup a/sql/sp_head.h b/sql/sp_head.h
--- a/sql/sp_head.h	2008-01-23 15:26:38 -05:00
+++ b/sql/sp_head.h	2008-05-15 19:13:22 -04:00
@@ -121,6 +121,7 @@ public:
   st_sp_chistics *m_chistics;
   ulong m_sql_mode;		// For SHOW CREATE and execution
   LEX_STRING m_qname;		// db.name
+  bool m_explicit_name;                /**< Prepend the db name? */
   /**
     Key representing routine in the set of stored routines used by statement.
     [routine_type]db.name\0
Thread
bk commit into 5.0 tree (cmiller:1.2624) BUG#36570Chad MILLER16 May
  • Re: bk commit into 5.0 tree (cmiller:1.2624) BUG#36570Davi Arnaut16 May