| Bug #88878 | mysqldump poorly outputs gtid purged | ||
|---|---|---|---|
| Submitted: | 12 Dec 2017 15:01 | Modified: | 13 Dec 2017 9:43 |
| Reporter: | Trey Raymond | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: mysqldump Command-line Client | Severity: | S3 (Non-critical) |
| Version: | 5.7.20 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
[12 Dec 2017 15:01]
Trey Raymond
[12 Dec 2017 15:19]
Trey Raymond
It looks like the code was originally going to output them on one line, but the entire FOR loop gets skipped, as mysql_num_rows will always be 1. The bug here is that it expects each line to be a new row, when in fact it's a string with newlines in a single row. without the loop running, the line fprintf(md_result_file,"%s';\n", (char*)gtid_set[0]); outputs the whole value, newlines and all.
[12 Dec 2017 15:24]
Trey Raymond
this should work:
static my_bool add_set_gtid_purged(MYSQL *mysql_con)
{
MYSQL_RES *gtid_purged_res;
MYSQL_ROW gtid_set;
ulonglong num_sets, idx;
/* query to get the GTID_EXECUTED */
if (mysql_query_with_error_report(mysql_con, >id_purged_res,
"SELECT replace(@@GLOBAL.GTID_EXECUTED,'\n','')"))
return TRUE;
/* Proceed only if gtid_purged_res is non empty */
if ((num_sets= mysql_num_rows(gtid_purged_res)) > 0)
{
if (opt_comments)
fprintf(md_result_file,
"\n--\n-- GTID state at the beginning of the backup \n--\n\n");
fprintf(md_result_file,"SET @@GLOBAL.GTID_PURGED='");
gtid_set= mysql_fetch_row(gtid_purged_res);
/* close the SET expression */
fprintf(md_result_file,"%s';\n", (char*)gtid_set[0]);
}
mysql_free_result(gtid_purged_res);
return FALSE; /*success */
}
[12 Dec 2017 15:26]
Trey Raymond
changing to s3 as the code existing is not actually working, so it's a bug, not a feature req
[13 Dec 2017 9:43]
MySQL Verification Team
Hello Trey Raymond, Thank you for the report and feedback. Thanks, Umesh
