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..dc5886107ed 100644 --- a/mysql-test/r/mysqldump.result +++ b/mysql-test/r/mysqldump.result @@ -2844,3 +2844,64 @@ 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; + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8 */; +/*!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' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_tables` /*!40100 DEFAULT CHARACTER SET latin1 */; + +USE `mysqldump_tables`; +DROP TABLE IF EXISTS `basetable`; +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; + + +/*!40000 ALTER TABLE `basetable` DISABLE KEYS */; +LOCK TABLES `basetable` WRITE; +UNLOCK TABLES; +/*!40000 ALTER TABLE `basetable` ENABLE KEYS */; + +CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysqldump_views` /*!40100 DEFAULT CHARACTER SET latin1 */; + +USE `mysqldump_views`; +DROP TABLE IF EXISTS `nasishnasifu`; +/*!50001 DROP VIEW IF EXISTS `nasishnasifu`*/; +/*!50001 CREATE TABLE `nasishnasifu` ( + `id` bigint(20) unsigned +) */; +/*!50001 DROP TABLE IF EXISTS `nasishnasifu`*/; +/*!50001 DROP VIEW IF EXISTS `nasishnasifu`*/; +/*!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` */; +/*!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 */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +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 4a355897adb..858d8910781 100644 --- a/mysql-test/t/mysqldump.test +++ b/mysql-test/t/mysqldump.test @@ -1194,6 +1194,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 @@ -1210,3 +1211,20 @@ 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 --databases mysqldump_tables mysqldump_views; + +drop view nasishnasifu; +drop database mysqldump_views; +drop table mysqldump_tables.basetable; +drop database mysqldump_tables;