aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2012-09-05 17:41:43 -0400
committerAndrew Dunstan <andrew@dunslane.net>2012-09-05 17:41:43 -0400
commitea0b414a0d9caaad1b7f39acd57708895c4dd0f3 (patch)
treede13bb858415fa609eccd0de3547b0f8375fbf91
parent28ab4a5aabeec1db7e9d6fd14c26cc92ccb670a2 (diff)
downloadpostgresql-ea0b414a0d9caaad1b7f39acd57708895c4dd0f3.tar.gz
postgresql-ea0b414a0d9caaad1b7f39acd57708895c4dd0f3.zip
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.
-rw-r--r--contrib/pg_upgrade/dump.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/contrib/pg_upgrade/dump.c b/contrib/pg_upgrade/dump.c
index b905ab084d7..577ccac01f0 100644
--- a/contrib/pg_upgrade/dump.c
+++ b/contrib/pg_upgrade/dump.c
@@ -58,14 +58,20 @@ 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", ALL_DUMP_FILE);
- if ((all_dump = fopen(filename, "r")) == NULL)
+ if ((all_dump = fopen(filename, PG_BINARY_R)) == NULL)
pg_log(PG_FATAL, "Could not open dump file \"%s\": %s\n", filename, getErrorText(errno));
snprintf(filename, sizeof(filename), "%s", GLOBALS_DUMP_FILE);
- if ((globals_dump = fopen_priv(filename, "w")) == NULL)
+ if ((globals_dump = fopen_priv(filename, PG_BINARY_W)) == NULL)
pg_log(PG_FATAL, "Could not write to dump file \"%s\": %s\n", filename, getErrorText(errno));
snprintf(filename, sizeof(filename), "%s", DB_DUMP_FILE);
- if ((db_dump = fopen_priv(filename, "w")) == NULL)
+ if ((db_dump = fopen_priv(filename, PG_BINARY_W)) == NULL)
pg_log(PG_FATAL, "Could not write to dump file \"%s\": %s\n", filename, getErrorText(errno));
current_output = globals_dump;