Skip to content

Commit f7b13e4

Browse files
committed
Fix line end mishandling in pg_upgrade on Windows.
pg_upgrade opened the output from pg_dumpall in text mode and wrote the split files in text mode. This caused unwanted eating of intended carriage returns on input and production of spurious carriage returns on output. To avoid this, open all these files in binary mode. On non-Windows platforms, this change has no effect. Backpatch to 9.0. On 9.0 and 9.1, we also switch from redirecting pg_dumpall's output to using pg_dumpall's -f switch, for the same reason.
1 parent a05fa36 commit f7b13e4

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

contrib/pg_upgrade/dump.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ generate_old_dump(migratorContext *ctx)
2323
*/
2424
exec_prog(ctx, true,
2525
SYSTEMQUOTE "\"%s/pg_dumpall\" --port %d --username \"%s\" "
26-
"--schema-only --binary-upgrade > \"%s/" ALL_DUMP_FILE "\""
26+
"--schema-only --binary-upgrade -f \"%s/" ALL_DUMP_FILE "\""
2727
SYSTEMQUOTE, ctx->new.bindir, ctx->old.port, ctx->user, ctx->cwd);
2828
check_ok(ctx);
2929
}
@@ -55,14 +55,19 @@ split_old_dump(migratorContext *ctx)
5555
char filename[MAXPGPATH];
5656
bool suppressed_username = false;
5757

58+
/*
59+
* Open all files in binary mode to avoid line end translation on Windows,
60+
* both for input and output.
61+
*/
62+
5863
snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, ALL_DUMP_FILE);
59-
if ((all_dump = fopen(filename, "r")) == NULL)
64+
if ((all_dump = fopen(filename, PG_BINARY_R)) == NULL)
6065
pg_log(ctx, PG_FATAL, "Cannot open dump file %s\n", filename);
6166
snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, GLOBALS_DUMP_FILE);
62-
if ((globals_dump = fopen(filename, "w")) == NULL)
67+
if ((globals_dump = fopen(filename, PG_BINARY_W)) == NULL)
6368
pg_log(ctx, PG_FATAL, "Cannot write to dump file %s\n", filename);
6469
snprintf(filename, sizeof(filename), "%s/%s", ctx->cwd, DB_DUMP_FILE);
65-
if ((db_dump = fopen(filename, "w")) == NULL)
70+
if ((db_dump = fopen(filename, PG_BINARY_W)) == NULL)
6671
pg_log(ctx, PG_FATAL, "Cannot write to dump file %s\n", filename);
6772
current_output = globals_dump;
6873

0 commit comments

Comments
 (0)