Loading client/mysqldump.c +28 −2 Original line number Diff line number Diff line Loading @@ -975,6 +975,22 @@ static my_bool test_if_special_chars(const char *str) /* quote_name(name, buff, force) Quotes char string, taking into account compatible mode Args name Unquoted string containing that which will be quoted buff The buffer that contains the quoted value, also returned force Flag to make it ignore 'test_if_special_chars' Returns buff quoted string */ static char *quote_name(const char *name, char *buff, my_bool force) { char *to= buff; Loading Loading @@ -1782,14 +1798,19 @@ static uint get_table_structure(char *table, char *db, char *table_type, static void dump_triggers_for_table (char *table, char *db) { MYSQL_RES *result; MYSQL_ROW row; char *result_table; char name_buff[NAME_LEN*4+3], table_buff[NAME_LEN*2+3]; char query_buff[512]; uint old_opt_compatible_mode=opt_compatible_mode; FILE *sql_file = md_result_file; MYSQL_RES *result; MYSQL_ROW row; DBUG_ENTER("dump_triggers_for_table"); DBUG_PRINT("enter", ("db: %s, table: %s", db, table)); /* Do not use ANSI_QUOTES on triggers in dump */ opt_compatible_mode&= ~MASK_ANSI_QUOTES; result_table= quote_name(table, table_buff, 1); my_snprintf(query_buff, sizeof(query_buff), Loading Loading @@ -1822,6 +1843,11 @@ DELIMITER ;;\n"); "DELIMITER ;\n" "/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE */;\n"); mysql_free_result(result); /* make sure to set back opt_compatible mode to original value */ opt_compatible_mode=old_opt_compatible_mode; DBUG_VOID_RETURN; } Loading mysql-test/r/mysqldump.result +65 −0 Original line number Diff line number Diff line Loading @@ -2309,3 +2309,68 @@ UNLOCK TABLES; drop table t1; set global time_zone=default; set time_zone=default; DROP TABLE IF EXISTS `t1 test`; CREATE TABLE `t1 test` ( `a1` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `t2 test`; CREATE TABLE `t2 test` ( `a2` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TRIGGER `test trig` BEFORE INSERT ON `t1 test` FOR EACH ROW BEGIN INSERT INTO `t2 test` SET a2 = NEW.a1; END // INSERT INTO `t1 test` VALUES (1); INSERT INTO `t1 test` VALUES (2); INSERT INTO `t1 test` VALUES (3); SELECT * FROM `t2 test`; a2 1 2 3 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS "t1 test"; CREATE TABLE "t1 test" ( "a1" int(11) default NULL ); /*!40000 ALTER TABLE "t1 test" DISABLE KEYS */; LOCK TABLES "t1 test" WRITE; INSERT INTO "t1 test" VALUES (1),(2),(3); UNLOCK TABLES; /*!40000 ALTER TABLE "t1 test" ENABLE KEYS */; /*!50003 SET @OLD_SQL_MODE=@@SQL_MODE*/; DELIMITER ;; /*!50003 SET SESSION SQL_MODE="" */;; /*!50003 CREATE TRIGGER `test trig` BEFORE INSERT ON `t1 test` FOR EACH ROW BEGIN INSERT INTO `t2 test` SET a2 = NEW.a1; END */;; DELIMITER ; /*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE */; DROP TABLE IF EXISTS "t2 test"; CREATE TABLE "t2 test" ( "a2" int(11) default NULL ); /*!40000 ALTER TABLE "t2 test" DISABLE KEYS */; LOCK TABLES "t2 test" WRITE; INSERT INTO "t2 test" VALUES (1),(2),(3); UNLOCK TABLES; /*!40000 ALTER TABLE "t2 test" ENABLE KEYS */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; DROP TRIGGER `test trig`; DROP TABLE `t1 test`; DROP TABLE `t2 test`; mysql-test/t/mysqldump.test +34 −0 Original line number Diff line number Diff line Loading @@ -928,3 +928,37 @@ set global time_zone='Europe/Moscow'; drop table t1; set global time_zone=default; set time_zone=default; # # Test of fix to BUG 13146 - ansi quotes break loading of triggers # --disable_warnings DROP TABLE IF EXISTS `t1 test`; CREATE TABLE `t1 test` ( `a1` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `t2 test`; CREATE TABLE `t2 test` ( `a2` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; --enable_warnings DELIMITER //; CREATE TRIGGER `test trig` BEFORE INSERT ON `t1 test` FOR EACH ROW BEGIN INSERT INTO `t2 test` SET a2 = NEW.a1; END // DELIMITER ;// INSERT INTO `t1 test` VALUES (1); INSERT INTO `t1 test` VALUES (2); INSERT INTO `t1 test` VALUES (3); SELECT * FROM `t2 test`; # dump with compatible=ansi. Everything except triggers should be double # quoted --exec $MYSQL_DUMP --skip-comments --compatible=ansi --triggers test --disable_warnings DROP TRIGGER `test trig`; DROP TABLE `t1 test`; DROP TABLE `t2 test`; --enable_warnings Loading
client/mysqldump.c +28 −2 Original line number Diff line number Diff line Loading @@ -975,6 +975,22 @@ static my_bool test_if_special_chars(const char *str) /* quote_name(name, buff, force) Quotes char string, taking into account compatible mode Args name Unquoted string containing that which will be quoted buff The buffer that contains the quoted value, also returned force Flag to make it ignore 'test_if_special_chars' Returns buff quoted string */ static char *quote_name(const char *name, char *buff, my_bool force) { char *to= buff; Loading Loading @@ -1782,14 +1798,19 @@ static uint get_table_structure(char *table, char *db, char *table_type, static void dump_triggers_for_table (char *table, char *db) { MYSQL_RES *result; MYSQL_ROW row; char *result_table; char name_buff[NAME_LEN*4+3], table_buff[NAME_LEN*2+3]; char query_buff[512]; uint old_opt_compatible_mode=opt_compatible_mode; FILE *sql_file = md_result_file; MYSQL_RES *result; MYSQL_ROW row; DBUG_ENTER("dump_triggers_for_table"); DBUG_PRINT("enter", ("db: %s, table: %s", db, table)); /* Do not use ANSI_QUOTES on triggers in dump */ opt_compatible_mode&= ~MASK_ANSI_QUOTES; result_table= quote_name(table, table_buff, 1); my_snprintf(query_buff, sizeof(query_buff), Loading Loading @@ -1822,6 +1843,11 @@ DELIMITER ;;\n"); "DELIMITER ;\n" "/*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE */;\n"); mysql_free_result(result); /* make sure to set back opt_compatible mode to original value */ opt_compatible_mode=old_opt_compatible_mode; DBUG_VOID_RETURN; } Loading
mysql-test/r/mysqldump.result +65 −0 Original line number Diff line number Diff line Loading @@ -2309,3 +2309,68 @@ UNLOCK TABLES; drop table t1; set global time_zone=default; set time_zone=default; DROP TABLE IF EXISTS `t1 test`; CREATE TABLE `t1 test` ( `a1` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `t2 test`; CREATE TABLE `t2 test` ( `a2` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; CREATE TRIGGER `test trig` BEFORE INSERT ON `t1 test` FOR EACH ROW BEGIN INSERT INTO `t2 test` SET a2 = NEW.a1; END // INSERT INTO `t1 test` VALUES (1); INSERT INTO `t1 test` VALUES (2); INSERT INTO `t1 test` VALUES (3); SELECT * FROM `t2 test`; a2 1 2 3 /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ANSI' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; DROP TABLE IF EXISTS "t1 test"; CREATE TABLE "t1 test" ( "a1" int(11) default NULL ); /*!40000 ALTER TABLE "t1 test" DISABLE KEYS */; LOCK TABLES "t1 test" WRITE; INSERT INTO "t1 test" VALUES (1),(2),(3); UNLOCK TABLES; /*!40000 ALTER TABLE "t1 test" ENABLE KEYS */; /*!50003 SET @OLD_SQL_MODE=@@SQL_MODE*/; DELIMITER ;; /*!50003 SET SESSION SQL_MODE="" */;; /*!50003 CREATE TRIGGER `test trig` BEFORE INSERT ON `t1 test` FOR EACH ROW BEGIN INSERT INTO `t2 test` SET a2 = NEW.a1; END */;; DELIMITER ; /*!50003 SET SESSION SQL_MODE=@OLD_SQL_MODE */; DROP TABLE IF EXISTS "t2 test"; CREATE TABLE "t2 test" ( "a2" int(11) default NULL ); /*!40000 ALTER TABLE "t2 test" DISABLE KEYS */; LOCK TABLES "t2 test" WRITE; INSERT INTO "t2 test" VALUES (1),(2),(3); UNLOCK TABLES; /*!40000 ALTER TABLE "t2 test" ENABLE KEYS */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; DROP TRIGGER `test trig`; DROP TABLE `t1 test`; DROP TABLE `t2 test`;
mysql-test/t/mysqldump.test +34 −0 Original line number Diff line number Diff line Loading @@ -928,3 +928,37 @@ set global time_zone='Europe/Moscow'; drop table t1; set global time_zone=default; set time_zone=default; # # Test of fix to BUG 13146 - ansi quotes break loading of triggers # --disable_warnings DROP TABLE IF EXISTS `t1 test`; CREATE TABLE `t1 test` ( `a1` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; DROP TABLE IF EXISTS `t2 test`; CREATE TABLE `t2 test` ( `a2` int(11) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; --enable_warnings DELIMITER //; CREATE TRIGGER `test trig` BEFORE INSERT ON `t1 test` FOR EACH ROW BEGIN INSERT INTO `t2 test` SET a2 = NEW.a1; END // DELIMITER ;// INSERT INTO `t1 test` VALUES (1); INSERT INTO `t1 test` VALUES (2); INSERT INTO `t1 test` VALUES (3); SELECT * FROM `t2 test`; # dump with compatible=ansi. Everything except triggers should be double # quoted --exec $MYSQL_DUMP --skip-comments --compatible=ansi --triggers test --disable_warnings DROP TRIGGER `test trig`; DROP TABLE `t1 test`; DROP TABLE `t2 test`; --enable_warnings