Bug #36570 | Parse error of CREATE PROCEDURE stmt with comments on slave | ||
---|---|---|---|
Submitted: | 7 May 2008 16:36 | Modified: | 24 May 2008 17:39 |
Reporter: | Sven Sandberg | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Replication | Severity: | S3 (Non-critical) |
Version: | 5.0.60 | OS: | Any |
Assigned to: | Chad MILLER | CPU Architecture: | Any |
Tags: | comments, create function, create procedure, parse error, replication, syntax error |
[7 May 2008 16:36]
Sven Sandberg
[7 May 2008 18:39]
Valeriy Kravchuk
Thank you for a bug report. Verified just as described with 5.0.60: C:\Program Files\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot test -P3308 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.0.60-enterprise-gpl-nt-log MySQL Enterprise Server (GPL) Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> delimiter // mysql> /*!50001 create procedure p1() */ -> begin -> insert into t1 values (1); -> end// ERROR 1304 (42000): PROCEDURE p1 already exists mysql> drop procedure p1// Query OK, 0 rows affected (0.03 sec) mysql> /*!50001 create procedure p1() */ -> begin -> insert into t1 values (1); -> end// Query OK, 0 rows affected (0.02 sec) mysql> delimiter ; mysql> exit Bye C:\Program Files\MySQL\MySQL Server 5.0\bin>mysqlbinlog.exe ..\data\toshiba-user -bin.000002 /*!40019 SET @@session.max_insert_delayed_threads=0*/; /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER /*!*/; # at 4 #080507 21:34:33 server id 1 end_log_pos 98 Start: binlog v 4, server v 5.0. 60-enterprise-gpl-nt-log created 080507 21:34:33 at startup # Warning: this binlog was not closed properly. Most probably mysqld crashed wri ting it. ROLLBACK/*!*/; # at 98 #080507 21:35:05 server id 1 end_log_pos 178 Query thread_id=1 exec_tim e=0 error_code=0 use test/*!*/; SET TIMESTAMP=1210185305/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=1, @@session.uniq ue_checks=1/*!*/; SET @@session.sql_mode=1344274432/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@sessio n.collation_server=33/*!*/; drop procedure p1 /*!*/; # at 178 #080507 21:35:10 server id 1 end_log_pos 338 Query thread_id=1 exec_tim e=0 error_code=0 SET TIMESTAMP=1210185310/*!*/; CREATE DEFINER=`root`@`localhost` procedure p1() */ begin insert into t1 values (1); end /*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
[13 May 2008 12:38]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/46650 ChangeSet@1.2624, 2008-05-13 08:37:27-04:00, cmiller@zippy.cornsilk.net +6 -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.
[14 May 2008 23:24]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/46714 ChangeSet@1.2624, 2008-05-14 19:23:54-04:00, cmiller@zippy.cornsilk.net +6 -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.
[15 May 2008 20:48]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/46749 ChangeSet@1.2625, 2008-05-15 16:48:29-04:00, cmiller@zippy.cornsilk.net +5 -0 Update for Bug#36570. Qualify routine names with db name when writing to the binlog.
[15 May 2008 23:09]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/46754 ChangeSet@1.2625, 2008-05-15 19:09:37-04:00, cmiller@zippy.cornsilk.net +5 -0 Update for Bug#36570. Qualify routine names with db name when writing to the binlog ONLY if the source text is qualified.
[15 May 2008 23:13]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/46755 ChangeSet@1.2624, 2008-05-15 19:13:24-04:00, cmiller@zippy.cornsilk.net +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.
[19 May 2008 8:24]
Bugs System
Pushed into 5.0.64
[19 May 2008 8:25]
Bugs System
Pushed into 5.1.25-rc
[19 May 2008 12:51]
Jon Stephens
How does this differ from Bug#32575, which appears to be the same issue?
[19 May 2008 13:14]
Sven Sandberg
Jon, it's the same issue for another command. The present bug is about CREATE PROCEDURE and CREATE FUNCTION. BUG#32575 is about CREATE VIEW. You can probably merge them to the same changelog entry.
[22 May 2008 9:51]
Bugs System
Pushed into 6.0.6-alpha
[24 May 2008 17:39]
Jon Stephens
Documented in the 6.0.64, 5.1.25, and 6.0.6 changelogs as follows: CREATE PROCEDURE and CREATE FUNCTION statements containing extended comments were not written to the binary log correctly, causing parse errors on the slave. Note: While this issue appears related to Bug#32575, it didn't have the same fix, and the fixes were applied in different versions, hence the separate changelog entries.
[28 Jul 2008 13:50]
Bugs System
Pushed into 5.0.64 (revid:sp1r-cmiller@zippy.cornsilk.net-20080516214807-22967) (pib:2) (Retry automatic marking, to ensure nothing is missed. cm01)
[28 Jul 2008 16:55]
Bugs System
Pushed into 5.1.25-rc (revid:sp1r-cmiller@zippy.cornsilk.net-20080516213737-27229) (version source revid:sp1r-cmiller@zippy.cornsilk.net-20080516213737-27229) (pib:3)