From 49b527ab648cfbcf30528b4bcfce113f1ab4e335 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 20 Nov 2007 17:03:56 -0700 Subject: [PATCH] Bug #25146: Some warnings/errors not shown when using --show-warnings In several cases, an error when processing the query would cause mysql to return to the top level without printing warnings. Fix is to always print any available warnings before returning to the top level. client/mysql.cc: In com_go(), ensure that warnings are printed even if an error occurred when processing the query. Before this patch, an error in several places would return to the top level without printing associated warnings. Attempt to avoid printing the warning, though, if it's a duplicate of mysql_error() for the connection handle. mysql-test/r/mysql.result: Add test for bug 25146 mysql-test/t/mysql.test: Add test for bug 25146 --- client/mysql.cc | 52 ++++++++++++++++++++++----------------- mysql-test/r/mysql.result | 7 ++++++ mysql-test/t/mysql.test | 18 ++++++++++++++ 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/client/mysql.cc b/client/mysql.cc index 1dd33593b83..a44774cdeb8 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -2126,33 +2126,26 @@ com_go(String *buffer,char *line __attribute__((unused))) } #endif - if (error) - { - executing_query= 0; - buffer->length(0); // Remove query on error - return error; - } - error=0; buffer->length(0); + if (error) + goto end; + do { if (quick) { if (!(result=mysql_use_result(&mysql)) && mysql_field_count(&mysql)) { - executing_query= 0; - return put_error(&mysql); + error= put_error(&mysql); + goto end; } } else { error= mysql_store_result_for_lazy(&result); if (error) - { - executing_query= 0; - return error; - } + goto end; } if (verbose >= 3 || !opt_silent) @@ -2229,12 +2222,10 @@ com_go(String *buffer,char *line __attribute__((unused))) if (err >= 1) error= put_error(&mysql); +end: + if (show_warnings == 1 && warnings >= 1) /* Show warnings if any */ - { - init_pager(); print_warnings(); - end_pager(); - } if (!error && !status.batch && (mysql.server_status & SERVER_STATUS_DB_DROPPED)) @@ -2658,6 +2649,9 @@ static void print_warnings() MYSQL_RES *result; MYSQL_ROW cur; my_ulonglong num_rows; + + /* Save current error before calling "show warnings" */ + uint error= mysql_errno(&mysql); /* Get the warnings */ query= "show warnings"; @@ -2666,16 +2660,28 @@ static void print_warnings() /* Bail out when no warnings */ if (!(num_rows= mysql_num_rows(result))) - { - mysql_free_result(result); - return; - } + goto end; + + cur= mysql_fetch_row(result); + + /* + Don't print a duplicate of the current error. It is possible for SHOW + WARNINGS to return multiple errors with the same code, but different + messages. To be safe, skip printing the duplicate only if it is the only + warning. + */ + if (!cur || num_rows == 1 && error == (uint) strtoul(cur[1], NULL, 10)) + goto end; /* Print the warnings */ - while ((cur= mysql_fetch_row(result))) + init_pager(); + do { tee_fprintf(PAGER, "%s (Code %s): %s\n", cur[0], cur[1], cur[2]); - } + } while ((cur= mysql_fetch_row(result))); + end_pager(); + +end: mysql_free_result(result); } diff --git a/mysql-test/r/mysql.result b/mysql-test/r/mysql.result index 4e39fb28454..9a920f3e196 100644 --- a/mysql-test/r/mysql.result +++ b/mysql-test/r/mysql.result @@ -180,3 +180,10 @@ ERROR at line 1: DELIMITER cannot contain a backslash character 1 End of 5.0 tests WARNING: --server-arg option not supported in this configuration. +Warning (Code 1286): Unknown table engine 'nonexistent' +Warning (Code 1266): Using storage engine MyISAM for table 't2' +Warning (Code 1286): Unknown table engine 'nonexistent' +Warning (Code 1266): Using storage engine MyISAM for table 't2' +Error (Code 1050): Table 't2' already exists +drop tables t1, t2; +End of tests diff --git a/mysql-test/t/mysql.test b/mysql-test/t/mysql.test index 3ee04f32640..31cca441da8 100644 --- a/mysql-test/t/mysql.test +++ b/mysql-test/t/mysql.test @@ -290,3 +290,21 @@ remove_file $MYSQLTEST_VARDIR/tmp/bug21412.sql; --disable_query_log --exec $MYSQL --server-arg=no-defaults test -e "quit" --enable_query_log + +# +# Bug #25146: Some warnings/errors not shown when using --show-warnings +# + +# This one should succeed with no warnings +--exec $MYSQL --show-warnings test -e "create table t1 (id int)" + +# This should succeed, with warnings about conversion from nonexistent engine +--exec $MYSQL --show-warnings test -e "create table t2 (id int) engine=nonexistent" + +# This should fail, with warnings as well +--error 1 +--exec $MYSQL --show-warnings test -e "create table t2 (id int) engine=nonexistent" + +drop tables t1, t2; + +--echo End of tests