aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoah Misch <noah@leadboat.com>2015-08-14 20:23:09 -0400
committerNoah Misch <noah@leadboat.com>2015-08-14 20:23:09 -0400
commit43adc7a7147da2404bd4df0d8a93ca3bd3a8adc6 (patch)
treee3aad391f11029918fc9e83d6f82c74353aa35fa
parent845405a7d8dc79f498fe77e3aeeb02ef841b0196 (diff)
downloadpostgresql-43adc7a7147da2404bd4df0d8a93ca3bd3a8adc6.tar.gz
postgresql-43adc7a7147da2404bd4df0d8a93ca3bd3a8adc6.zip
Restore old pgwin32_message_to_UTF16() behavior outside transactions.
Commit 49c817eab78c6f0ce8c3bf46766b73d6cf3190b7 replaced with a hard error the dubious pg_do_encoding_conversion() behavior when outside a transaction. Reintroduce the historic soft failure locally within pgwin32_message_to_UTF16(). This fixes errors when writing messages in less-common encodings to the Windows event log or console. Back-patch to 9.4, where the aforementioned commit first appeared. Per bug #13427 from Dmitri Bourlatchkov.
-rw-r--r--src/backend/utils/mb/mbutils.c24
1 files changed, 17 insertions, 7 deletions
diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c
index 1e9a004b0d7..2a8271ab072 100644
--- a/src/backend/utils/mb/mbutils.c
+++ b/src/backend/utils/mb/mbutils.c
@@ -1063,7 +1063,8 @@ pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)
/*
* Use MultiByteToWideChar directly if there is a corresponding codepage,
- * or double conversion through UTF8 if not.
+ * or double conversion through UTF8 if not. Double conversion is needed,
+ * for example, in an ENCODING=LATIN8, LC_CTYPE=C database.
*/
if (codepage != 0)
{
@@ -1075,12 +1076,21 @@ pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)
{
char *utf8;
- utf8 = (char *) pg_do_encoding_conversion((unsigned char *) str,
- len,
- GetMessageEncoding(),
- PG_UTF8);
- if (utf8 != str)
- len = strlen(utf8);
+ /*
+ * XXX pg_do_encoding_conversion() requires a transaction. In the
+ * absence of one, hope for the input to be valid UTF8.
+ */
+ if (IsTransactionState())
+ {
+ utf8 = (char *) pg_do_encoding_conversion((unsigned char *) str,
+ len,
+ GetMessageEncoding(),
+ PG_UTF8);
+ if (utf8 != str)
+ len = strlen(utf8);
+ }
+ else
+ utf8 = (char *) str;
utf16 = (WCHAR *) palloc(sizeof(WCHAR) * (len + 1));
dstlen = MultiByteToWideChar(CP_UTF8, 0, utf8, len, utf16, len);