From: Date: May 27 2009 3:16pm Subject: bzr commit into mysql-5.1-bugteam branch (azundris:2912) Bug#34861 List-Archive: http://lists.mysql.com/commits/75052 X-Bug: 34861 Message-Id: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4088019488369718978==" --===============4088019488369718978== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///misc/mysql/forest/34861k/51-34861k/ based on revid:bjorn.munch@stripped 2912 Tatiana A. Nurnberg 2009-05-27 Bug#34861: mysqldump with --tab gives weird output for triggers. mysqldump --tab still dumped triggers to stdout rather than to individual tables. We now append triggers to the .sql file for the corresponding table. --events and --routines correspond to a database rather than a table and will still go to stdout with --tab unless redirected with --result-file (-r). @ client/mysqldump.c Extend open_sql_file_for_table() so we can open-append. Change dump_triggers_for_table() so it will append its output to the table's .sql-file when --tab is used. @ mysql-test/r/mysqldump.result Show that when using --tab, triggers now end up in the .sql file with the corresponding table (after that table), while --routines and --events go to stdout or --result-file. @ mysql-test/t/mysqldump.test Show that when using --tab, triggers now end up in the .sql file with the corresponding table (after that table), while --routines and --events go to stdout or --result-file. modified: client/mysqldump.c mysql-test/r/mysqldump.result mysql-test/t/mysqldump.test === modified file 'client/mysqldump.c' --- a/client/mysqldump.c 2009-05-07 17:51:55 +0000 +++ b/client/mysqldump.c 2009-05-27 13:16:21 +0000 @@ -1397,18 +1397,19 @@ static char *cover_definer_clause_in_sp( SYNOPSIS open_sql_file_for_table name name of the table or view + flags flags (as per "man 2 open") RETURN VALUES 0 Failed to open file > 0 Handle of the open file */ -static FILE* open_sql_file_for_table(const char* table) +static FILE* open_sql_file_for_table(const char* table, int flags) { FILE* res; char filename[FN_REFLEN], tmp_path[FN_REFLEN]; convert_dirname(tmp_path,path,NullS); res= my_fopen(fn_format(filename, table, tmp_path, ".sql", 4), - O_WRONLY, MYF(MY_WME)); + flags, MYF(MY_WME)); return res; } @@ -2290,7 +2291,7 @@ static uint get_table_structure(char *ta if (path) { - if (!(sql_file= open_sql_file_for_table(table))) + if (!(sql_file= open_sql_file_for_table(table, O_WRONLY))) DBUG_RETURN(0); write_header(sql_file, db); @@ -2501,7 +2502,7 @@ static uint get_table_structure(char *ta { if (path) { - if (!(sql_file= open_sql_file_for_table(table))) + if (!(sql_file= open_sql_file_for_table(table, O_WRONLY))) DBUG_RETURN(0); write_header(sql_file, db); } @@ -2725,12 +2726,10 @@ continue_xml: DBUG_RETURN((uint) num_fields); } /* get_table_structure */ -static void dump_trigger_old(MYSQL_RES *show_triggers_rs, +static void dump_trigger_old(FILE *sql_file, MYSQL_RES *show_triggers_rs, MYSQL_ROW *show_trigger_row, const char *table_name) { - FILE *sql_file= md_result_file; - char quoted_table_name_buf[NAME_LEN * 2 + 3]; char *quoted_table_name= quote_name(table_name, quoted_table_name_buf, 1); @@ -2796,11 +2795,10 @@ static void dump_trigger_old(MYSQL_RES * DBUG_VOID_RETURN; } -static int dump_trigger(MYSQL_RES *show_create_trigger_rs, +static int dump_trigger(FILE *sql_file, MYSQL_RES *show_create_trigger_rs, const char *db_name, const char *db_cl_name) { - FILE *sql_file= md_result_file; MYSQL_ROW row; int db_cl_altered= FALSE; @@ -2864,22 +2862,28 @@ static int dump_triggers_for_table(char uint old_opt_compatible_mode= opt_compatible_mode; MYSQL_RES *show_triggers_rs; MYSQL_ROW row; + FILE *sql_file= md_result_file; char db_cl_name[MY_CS_NAME_SIZE]; + int ret= TRUE; DBUG_ENTER("dump_triggers_for_table"); DBUG_PRINT("enter", ("db: %s, table_name: %s", db_name, table_name)); + if (path && !(sql_file= open_sql_file_for_table(table_name, + O_WRONLY | O_APPEND))) + DBUG_RETURN(1); + /* Do not use ANSI_QUOTES on triggers in dump */ opt_compatible_mode&= ~MASK_ANSI_QUOTES; /* Get database collation. */ if (switch_character_set_results(mysql, "binary")) - DBUG_RETURN(TRUE); + goto done; if (fetch_db_collation(db_name, db_cl_name, sizeof (db_cl_name))) - DBUG_RETURN(TRUE); + goto done; /* Get list of triggers. */ @@ -2888,7 +2892,7 @@ static int dump_triggers_for_table(char quote_for_like(table_name, name_buff)); if (mysql_query_with_error_report(mysql, &show_triggers_rs, query_buff)) - DBUG_RETURN(TRUE); + goto done; /* Dump triggers. */ @@ -2909,17 +2913,15 @@ static int dump_triggers_for_table(char provide all the necessary information to restore trigger properly. */ - dump_trigger_old(show_triggers_rs, &row, table_name); + dump_trigger_old(sql_file, show_triggers_rs, &row, table_name); } else { MYSQL_RES *show_create_trigger_rs= mysql_store_result(mysql); if (!show_create_trigger_rs || - dump_trigger(show_create_trigger_rs, db_name, db_cl_name)) - { - DBUG_RETURN(TRUE); - } + dump_trigger(sql_file, show_create_trigger_rs, db_name, db_cl_name)) + goto done; mysql_free_result(show_create_trigger_rs); } @@ -2929,7 +2931,7 @@ static int dump_triggers_for_table(char mysql_free_result(show_triggers_rs); if (switch_character_set_results(mysql, default_charset)) - DBUG_RETURN(TRUE); + goto done; /* make sure to set back opt_compatible mode to @@ -2937,7 +2939,13 @@ static int dump_triggers_for_table(char */ opt_compatible_mode=old_opt_compatible_mode; - DBUG_RETURN(FALSE); + ret= FALSE; + +done: + if (path) + my_fclose(sql_file, MYF(0)); + + DBUG_RETURN(ret); } static void add_load_option(DYNAMIC_STRING *str, const char *option, @@ -4782,7 +4790,7 @@ static my_bool get_view_structure(char * /* If requested, open separate .sql file for this view */ if (path) { - if (!(sql_file= open_sql_file_for_table(table))) + if (!(sql_file= open_sql_file_for_table(table, O_WRONLY))) DBUG_RETURN(1); write_header(sql_file, db); === modified file 'mysql-test/r/mysqldump.result' --- a/mysql-test/r/mysqldump.result 2009-04-21 10:25:04 +0000 +++ b/mysql-test/r/mysqldump.result 2009-05-27 13:16:21 +0000 @@ -4226,6 +4226,57 @@ DROP DATABASE mysqldump_test_db; # -- End of test case for Bug#32538. SET @@GLOBAL.CONCURRENT_INSERT = @OLD_CONCURRENT_INSERT; + +Bug #34861 - mysqldump with --tab gives weird output for triggers. + +CREATE TABLE t1 (f1 INT); +CREATE TRIGGER tr1 BEFORE UPDATE ON t1 FOR EACH ROW SET @f1 = 1; +CREATE PROCEDURE pr1 () SELECT "Meow"; +CREATE EVENT ev1 ON SCHEDULE AT '2030-01-01 00:00:00' DO SELECT "Meow"; + +SHOW TRIGGERS; +Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation +tr1 UPDATE t1 SET @f1 = 1 BEFORE NULL root@localhost latin1 latin1_swedish_ci latin1_swedish_ci +SHOW EVENTS; +Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation +test ev1 root@localhost SYSTEM ONE TIME 2030-01-01 00:00:00 NULL NULL NULL NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci +SELECT name,body FROM mysql.proc WHERE NAME = 'pr1'; +name body +pr1 SELECT "Meow" + +dump table; if anything goes to stdout, it ends up here: --------------- + +drop everything +DROP EVENT ev1; +DROP TRIGGER tr1; +DROP TABLE t1; +DROP PROCEDURE pr1; + +reload table; this should restore table and trigger +SHOW TRIGGERS; +Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation +tr1 UPDATE t1 SET @f1 = 1 BEFORE NULL root@localhost latin1 latin1_swedish_ci latin1_swedish_ci +SHOW EVENTS; +Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation +SELECT name,body FROM mysql.proc WHERE NAME = 'pr1'; +name body + +reload db; this should restore routines and events +SHOW TRIGGERS; +Trigger Event Table Statement Timing Created sql_mode Definer character_set_client collation_connection Database Collation +tr1 UPDATE t1 SET @f1 = 1 BEFORE NULL root@localhost latin1 latin1_swedish_ci latin1_swedish_ci +SHOW EVENTS; +Db Name Definer Time zone Type Execute at Interval value Interval field Starts Ends Status Originator character_set_client collation_connection Database Collation +test ev1 root@localhost SYSTEM ONE TIME 2030-01-01 00:00:00 NULL NULL NULL NULL ENABLED 1 latin1 latin1_swedish_ci latin1_swedish_ci +SELECT name,body FROM mysql.proc WHERE NAME = 'pr1'; +name body +pr1 SELECT "Meow" + +cleanup +DROP EVENT IF EXISTS ev1; +DROP PROCEDURE IF EXISTS pr1; +DROP TRIGGER IF EXISTS tr1; +DROP TABLE IF EXISTS t1; # # End of 5.1 tests # === modified file 'mysql-test/t/mysqldump.test' --- a/mysql-test/t/mysqldump.test 2009-05-22 15:24:45 +0000 +++ b/mysql-test/t/mysqldump.test 2009-05-27 13:16:21 +0000 @@ -1955,6 +1955,59 @@ SET @@GLOBAL.CONCURRENT_INSERT = @OLD_CO ########################################################################### +--echo +--echo Bug #34861 - mysqldump with --tab gives weird output for triggers. +--echo + +CREATE TABLE t1 (f1 INT); +CREATE TRIGGER tr1 BEFORE UPDATE ON t1 FOR EACH ROW SET @f1 = 1; +CREATE PROCEDURE pr1 () SELECT "Meow"; +CREATE EVENT ev1 ON SCHEDULE AT '2030-01-01 00:00:00' DO SELECT "Meow"; + +--echo +SHOW TRIGGERS; +SHOW EVENTS; +SELECT name,body FROM mysql.proc WHERE NAME = 'pr1'; + +--echo +--echo dump table; if anything goes to stdout, it ends up here: --------------- +--exec $MYSQL_DUMP --compact --routines --triggers --events --result-file=$MYSQLTEST_VARDIR/tmp/test_34861.sql --tab=$MYSQLTEST_VARDIR/tmp/ test + +--echo +--echo drop everything +DROP EVENT ev1; +DROP TRIGGER tr1; +DROP TABLE t1; +DROP PROCEDURE pr1; + +--echo +--echo reload table; this should restore table and trigger +--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/t1.sql +SHOW TRIGGERS; +SHOW EVENTS; +SELECT name,body FROM mysql.proc WHERE NAME = 'pr1'; + +--echo +--echo reload db; this should restore routines and events +--exec $MYSQL test < $MYSQLTEST_VARDIR/tmp/test_34861.sql +SHOW TRIGGERS; +SHOW EVENTS; +SELECT name,body FROM mysql.proc WHERE NAME = 'pr1'; + +--echo +--echo cleanup +--remove_file $MYSQLTEST_VARDIR/tmp/t1.txt +--remove_file $MYSQLTEST_VARDIR/tmp/t1.sql +--remove_file $MYSQLTEST_VARDIR/tmp/test_34861.sql +--disable_warnings +DROP EVENT IF EXISTS ev1; +DROP PROCEDURE IF EXISTS pr1; +DROP TRIGGER IF EXISTS tr1; +DROP TABLE IF EXISTS t1; +--enable_warnings + +########################################################################### + --echo # --echo # End of 5.1 tests --echo # --===============4088019488369718978== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/azundris@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: azundris@stripped # target_branch: file:///misc/mysql/forest/34861k/51-34861k/ # testament_sha1: eb7de402376a81a54a5f32b34c30e80e3116114d # timestamp: 2009-05-27 15:16:26 +0200 # base_revision_id: bjorn.munch@stripped\ # zitq9aysxy5zgf5r # # Begin bundle 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 --===============4088019488369718978==--