From 3d35522f9dd91fb3166a18329d689b26a169e112 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 14 Jul 2006 12:50:00 +0200 Subject: [PATCH 1/3] Bug#21014: Segmentation fault of mysqldump on view mysqldump did not select the correct database before trying to dump views from it. this resulted in an empty result set, which in turn startled mysql-dump into a core-dump. this only happened for views, not for tables, and was only visible with multiple databases that weren't by sheer luck in the order mysqldump required, anyway. this fixes by selecting the correct database before dumping views; it also catches the empty set-condition if it should occur for other reasons. client/mysqldump.c: Bug#21014: Segmentation fault of mysqldump on view failsafe: if "select ... from information_schema.views" returns an empty set, don't deref NULL; throw an error instead. fix: select the correct database not only before dumping tables, but before dumping views, as well. mysql-test/r/mysqldump.result: Bug#21014: Segmentation fault of mysqldump on view show that mysqldump selects the correct database before trying to dump views from it. mysql-test/t/mysqldump.test: Bug#21014: Segmentation fault of mysqldump on view show that mysqldump selects the correct database before trying to dump views from it. --- client/mysqldump.c | 11 +++++++++-- mysql-test/r/mysqldump.result | 30 ++++++++++++++++++++++++++++++ mysql-test/t/mysqldump.test | 19 +++++++++++++++++++ 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index 53cb06be6f3..9469815bfaf 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -2781,6 +2781,12 @@ static my_bool dump_all_views_in_db(char *database) uint numrows; char table_buff[NAME_LEN*2+3]; + if (mysql_select_db(sock, database)) + { + DB_error(sock, "when selecting the database"); + return 1; + } + if (opt_xml) print_xml_tag1(md_result_file, "", "database name=", database, "\n"); if (lock_tables) @@ -3436,12 +3442,13 @@ static my_bool get_view_structure(char *table, char* db) mysql_free_result(table_res); /* Get the result from "select ... information_schema" */ - if (!(table_res= mysql_store_result(sock))) + if (!(table_res= mysql_store_result(sock)) || + !(row= mysql_fetch_row(table_res))) { safe_exit(EX_MYSQLERR); DBUG_RETURN(1); } - row= mysql_fetch_row(table_res); + lengths= mysql_fetch_lengths(table_res); /* diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index f9714e067e6..6bc60164e9b 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -2844,3 +2844,33 @@ DROP TABLE IF EXISTS `v1`; drop view v1; drop table t1; drop database mysqldump_test_db; +create database mysqldump_tables; +use mysqldump_tables; +create table basetable ( id serial, tag varchar(64) ); +create database mysqldump_views; +use mysqldump_views; +create view nasishnasifu as select mysqldump_tables.basetable.id from +mysqldump_tables.basetable; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_tables` /*!40100 DEFAULT CHARACTER SET latin1 */; + +USE `mysqldump_tables`; +CREATE TABLE `basetable` ( + `id` bigint(20) unsigned NOT NULL auto_increment, + `tag` varchar(64) default NULL, + UNIQUE KEY `id` (`id`) +) ENGINE=MyISAM DEFAULT CHARSET=latin1; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_views` /*!40100 DEFAULT CHARACTER SET latin1 */; + +USE `mysqldump_views`; +/*!50001 CREATE TABLE `nasishnasifu` ( + `id` bigint(20) unsigned +) */; +/*!50001 CREATE ALGORITHM=UNDEFINED */ +/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ +/*!50001 VIEW `mysqldump_views`.`nasishnasifu` AS select `mysqldump_tables`.`basetable`.`id` AS `id` from `mysqldump_tables`.`basetable` */; +drop view nasishnasifu; +drop database mysqldump_views; +drop table mysqldump_tables.basetable; +drop database mysqldump_tables; diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 7e4fedb297d..575b9c98120 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -1195,6 +1195,7 @@ drop table t1; --exec $MYSQL_DUMP --force -N --compact --skip-comments test --echo } mysqldump drop view v1; + # BUG#17201 Spurious 'DROP DATABASE' in output, # also confusion between tables and views. # Example code from Markus Popp @@ -1211,3 +1212,21 @@ insert into t1 values (0815); drop view v1; drop table t1; drop database mysqldump_test_db; + +# Bug21014 Segmentation fault of mysqldump on view + +create database mysqldump_tables; +use mysqldump_tables; +create table basetable ( id serial, tag varchar(64) ); + +create database mysqldump_views; +use mysqldump_views; +create view nasishnasifu as select mysqldump_tables.basetable.id from +mysqldump_tables.basetable; + +--exec $MYSQL_DUMP --skip-comments --compact --databases mysqldump_tables mysqldump_views; + +drop view nasishnasifu; +drop database mysqldump_views; +drop table mysqldump_tables.basetable; +drop database mysqldump_tables; From 674636e7255cf8df2fd3eb650df6a956f188be74 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 17 Jul 2006 18:07:08 -0400 Subject: [PATCH 2/3] Bug# 20221- Dumping of multiple databases containing view(s) yields maleformed dumps. client/mysqldump.c: When dumping more than one database, make sure that the proper database is selected before restoring that database's views. Replaced hard-coded database name length with appropiate token. mysql-test/r/mysqldump.result: Added new result and corrected results for existing test cases. mysql-test/t/mysqldump.test: Added new case for dumping and restoring multiple databases each containing a view. --- client/mysqldump.c | 17 ++++++++++++--- mysql-test/r/mysqldump.result | 39 +++++++++++++++++++++++++++++++++++ mysql-test/t/mysqldump.test | 38 ++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index 9469815bfaf..13e2b80c0b2 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -2637,7 +2637,7 @@ static int init_dumping(char *database) /* length of table name * 2 (if name contains quotes), 2 quotes and 0 */ - char quoted_database_buf[64*2+3]; + char quoted_database_buf[NAME_LEN*2+3]; char *qdatabase= quote_name(database,quoted_database_buf,opt_quoted); if (opt_comments) { @@ -2786,7 +2786,18 @@ static my_bool dump_all_views_in_db(char *database) DB_error(sock, "when selecting the database"); return 1; } - + if (opt_databases || opt_alldbs) + { + char quoted_database_buf[NAME_LEN*2+3]; + char *qdatabase= quote_name(database,quoted_database_buf,opt_quoted); + if (opt_comments) + { + fprintf(md_result_file,"\n--\n-- Current Database: %s\n--\n", qdatabase); + check_io(md_result_file); + } + fprintf(md_result_file,"\nUSE %s;\n", qdatabase); + check_io(md_result_file); + } if (opt_xml) print_xml_tag1(md_result_file, "", "database name=", database, "\n"); if (lock_tables) @@ -3239,7 +3250,7 @@ static char *primary_key_fields(const char *table_name) MYSQL_RES *res = NULL; MYSQL_ROW row; /* SHOW KEYS FROM + table name * 2 (escaped) + 2 quotes + \0 */ - char show_keys_buff[15 + 64 * 2 + 3]; + char show_keys_buff[15 + NAME_LEN * 2 + 3]; uint result_length = 0; char *result = 0; diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index 6bc60164e9b..99a651c954e 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -2503,6 +2503,8 @@ DROP TABLE IF EXISTS `v2`; `b` varchar(32), `c` varchar(32) ) */; + +USE `test`; /*!50001 DROP TABLE IF EXISTS `v0`*/; /*!50001 DROP VIEW IF EXISTS `v0`*/; /*!50001 CREATE ALGORITHM=UNDEFINED */ @@ -2826,6 +2828,8 @@ DROP TABLE IF EXISTS `v1`; /*!50001 CREATE TABLE `v1` ( `id` int(11) ) */; + +USE `mysqldump_test_db`; /*!50001 DROP TABLE IF EXISTS `v1`*/; /*!50001 DROP VIEW IF EXISTS `v1`*/; /*!50001 CREATE ALGORITHM=UNDEFINED */ @@ -2867,6 +2871,10 @@ USE `mysqldump_views`; /*!50001 CREATE TABLE `nasishnasifu` ( `id` bigint(20) unsigned ) */; + +USE `mysqldump_tables`; + +USE `mysqldump_views`; /*!50001 CREATE ALGORITHM=UNDEFINED */ /*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */ /*!50001 VIEW `mysqldump_views`.`nasishnasifu` AS select `mysqldump_tables`.`basetable`.`id` AS `id` from `mysqldump_tables`.`basetable` */; @@ -2874,3 +2882,34 @@ drop view nasishnasifu; drop database mysqldump_views; drop table mysqldump_tables.basetable; drop database mysqldump_tables; +create database mysqldump_dba; +use mysqldump_dba; +create table t1 (f1 int, f2 int); +insert into t1 values (1,1); +create view v1 as select f1, f2 from t1; +create database mysqldump_dbb; +use mysqldump_dbb; +create table t1 (f1 int, f2 int); +insert into t1 values (2,2); +create view v1 as select f1, f2 from t1; +drop view v1; +drop table t1; +drop database mysqldump_dbb; +use mysqldump_dba; +drop view v1; +drop table t1; +drop database mysqldump_dba; +select * from mysqldump_dba.v1; +f1 f2 +1 1 +select * from mysqldump_dbb.v1; +f1 f2 +2 2 +use mysqldump_dba; +drop view v1; +drop table t1; +drop database mysqldump_dba; +use mysqldump_dbb; +drop view v1; +drop table t1; +drop database mysqldump_dbb; diff --git a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test index 575b9c98120..a4961dda7b6 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -1230,3 +1230,41 @@ drop view nasishnasifu; drop database mysqldump_views; drop table mysqldump_tables.basetable; drop database mysqldump_tables; + +# Bug20221 Dumping of multiple databases containing view(s) yields maleformed dumps + +create database mysqldump_dba; +use mysqldump_dba; +create table t1 (f1 int, f2 int); +insert into t1 values (1,1); +create view v1 as select f1, f2 from t1; + +create database mysqldump_dbb; +use mysqldump_dbb; +create table t1 (f1 int, f2 int); +insert into t1 values (2,2); +create view v1 as select f1, f2 from t1; + +--exec $MYSQL_DUMP --skip-comments --add-drop-database --databases mysqldump_dba mysqldump_dbb > $MYSQLTEST_VARDIR/tmp/bug20221_backup; + +drop view v1; +drop table t1; +drop database mysqldump_dbb; +use mysqldump_dba; +drop view v1; +drop table t1; +drop database mysqldump_dba; + +--exec $MYSQL < $MYSQLTEST_VARDIR/tmp/bug20221_backup; + +select * from mysqldump_dba.v1; +select * from mysqldump_dbb.v1; + +use mysqldump_dba; +drop view v1; +drop table t1; +drop database mysqldump_dba; +use mysqldump_dbb; +drop view v1; +drop table t1; +drop database mysqldump_dbb; From 846a99dcd7830bf03e708edb5d669bb2dc3f45bb Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 19 Jul 2006 16:50:55 +0200 Subject: [PATCH 3/3] manual merge, part 2/2 mysql-test/r/mysqldump.result: manual mergies, part 2/2 --- mysql-test/r/mysqldump.result | 1 - 1 file changed, 1 deletion(-) diff --git a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result index 9abc83b2239..ff745021efb 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -2818,7 +2818,6 @@ create database mysqldump_views; use mysqldump_views; create view nasishnasifu as select mysqldump_tables.basetable.id from mysqldump_tables.basetable; - CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_tables` /*!40100 DEFAULT CHARACTER SET latin1 */; USE `mysqldump_tables`;