Bug #44732 mysql client should printing warnings on stderr in batch mode
Submitted: 7 May 2009 23:34
Reporter: Jim Winstead Email Updates:
Status: Verified Impact on me:
None 
Category:MySQL Server: Command-line Clients Severity:S3 (Non-critical)
Version:5.1 OS:Any
Assigned to: Assigned Account
Triage: Triaged: D3 (Medium)

[7 May 2009 23:34] Jim Winstead
Description:
This report comes from Bug #21099.

The mysql command-line client, when --show-warnings is enabled, prints the warnings to stdout, even in batch mode. They should be printed to stderr, instead.

How to repeat:
mysql < dump.sql > /dev/null

Suggested fix:
print_warnings() should print to stderr instead of stdout.
[18 May 2010 20:43] Hartmut Holzgraefe
proposed patch:

--- mysql-5.1.46/client/mysql.cc	2010-04-06 16:03:48.000000000 +0200
+++ mysql-5.1.46-bug44732/client/mysql.cc	2010-05-18 21:41:41.000000000 +0200
@@ -3570,6 +3570,7 @@
   MYSQL_RES    *result;
   MYSQL_ROW    cur;
   my_ulonglong num_rows;
+  FILE         *out;
   
   /* Save current error before calling "show warnings" */
   uint error= mysql_errno(&mysql);
@@ -3595,12 +3596,18 @@
     goto end;
 
   /* Print the warnings */
-  init_pager();
+  if (status.batch) {
+    out = stderr;
+  } else {
+    init_pager();
+    out = PAGER;
+  }
   do
   {
-    tee_fprintf(PAGER, "%s (Code %s): %s\n", cur[0], cur[1], cur[2]);
+    tee_fprintf(out, "%s (Code %s): %s\n", cur[0], cur[1], cur[2]);
   } while ((cur= mysql_fetch_row(result)));
-  end_pager();
+  if (!status.batch)
+    end_pager();
 
 end:
   mysql_free_result(result);
[26 May 2010 23:03] Jim Winstead
the patch can be even simpler, since init_pager() etc won't actually do anything when status.batch is set.

=== modified file 'client/mysql.cc'
--- client/mysql.cc	2010-03-11 13:16:54 +0000
+++ client/mysql.cc	2010-05-25 22:01:48 +0000
@@ -3598,7 +3598,9 @@ static void print_warnings()
   init_pager();
   do
   {
-    tee_fprintf(PAGER, "%s (Code %s): %s\n", cur[0], cur[1], cur[2]);
+    /* In batch mode, we print warnings to stderr instead of stdout. */
+    tee_fprintf(status.batch ? stderr : PAGER,
+                "%s (Code %s): %s\n", cur[0], cur[1], cur[2]);
   } while ((cur= mysql_fetch_row(result)));
   end_pager();