]> granicus.if.org Git - postgresql/commitdiff
Fix line end mishandling in pg_upgrade on Windows.
authorAndrew Dunstan <andrew@dunslane.net>
Wed, 5 Sep 2012 21:49:09 +0000 (17:49 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Wed, 5 Sep 2012 21:49:09 +0000 (17:49 -0400)
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

index aba95f44c95525083b41bac0f724aa7c5323e276..746ad757d67e32b1584cc6092c2879b74cec1f98 100644 (file)
@@ -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;