postgres.git / summary / log / commit / refs

commit    26f4fc01849b23d0541722d7cfdbd08739f81e1c
Author:   Andrew Dunstan <andrew@dunslane.net>
Date:     Wed Sep 05 21:49:09 2012 +0000
First released in: 9.3.0, 9.0.10, 9.1.6, 9.2.0

    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.


contrib/pg_upgrade/dump.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contrib/pg_upgrade/dump.c b/contrib/pg_upgrade/dump.c index aba95f44c95..746ad757d67 100644 --- a/contrib/pg_upgrade/dump.c +++ b/contrib/pg_upgrade/dump.c @@ -22,7 +22,7 @@ generate_old_dump(void) */ exec_prog(true, SYSTEMQUOTE "\"%s/pg_dumpall\" --port %d --username \"%s\" " - "--schema-only --binary-upgrade > \"%s/" ALL_DUMP_FILE "\"" + "--schema-only --binary-upgrade -f \"%s/" ALL_DUMP_FILE "\"" SYSTEMQUOTE, new_cluster.bindir, old_cluster.port, os_info.user, os_info.cwd); check_ok(); } @@ -54,14 +54,19 @@ split_old_dump(void) char filename[MAXPGPATH]; bool suppressed_username = false; + /* + * Open all files in binary mode to avoid line end translation on Windows, + * both for input and output. + */ + snprintf(filename, sizeof(filename), "%s/%s", os_info.cwd, ALL_DUMP_FILE); - if ((all_dump = fopen(filename, "r")) == NULL) + if ((all_dump = fopen(filename, PG_BINARY_R)) == NULL) pg_log(PG_FATAL, "Cannot open dump file %s\n", filename); snprintf(filename, sizeof(filename), "%s/%s", os_info.cwd, GLOBALS_DUMP_FILE); - if ((globals_dump = fopen(filename, "w")) == NULL) + if ((globals_dump = fopen(filename, PG_BINARY_W)) == NULL) pg_log(PG_FATAL, "Cannot write to dump file %s\n", filename); snprintf(filename, sizeof(filename), "%s/%s", os_info.cwd, DB_DUMP_FILE); - if ((db_dump = fopen(filename, "w")) == NULL) + if ((db_dump = fopen(filename, PG_BINARY_W)) == NULL) pg_log(PG_FATAL, "Cannot write to dump file %s\n", filename); current_output = globals_dump; [parent: 5ee0f03727eb]