From 699a0ef7bbd7fa563097ad88b73bc3d439e26dc8 Mon Sep 17 00:00:00 2001
From: Magnus Hagander <magnus@hagander.net>
Date: Tue, 16 Oct 2007 11:30:16 +0000
Subject: [PATCH] Re-allow UTF8 encodings on win32. Since UTF8 is converted to
 UTF16 before being used, all (valid) locales will work for this.

---
 src/backend/commands/dbcommands.c | 11 +++++++++--
 src/bin/initdb/initdb.c           | 14 ++++++++++++--
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c
index ec0d02be6b6..3090ae0af43 100644
--- a/src/backend/commands/dbcommands.c
+++ b/src/backend/commands/dbcommands.c
@@ -13,7 +13,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.201 2007/10/13 20:18:41 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.202 2007/10/16 11:30:16 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -258,7 +258,7 @@ createdb(const CreatedbStmt *stmt)
 
 	/*
 	 * Check whether encoding matches server locale settings.  We allow
-	 * mismatch in two cases:
+	 * mismatch in three cases:
 	 *
 	 * 1. ctype_encoding = SQL_ASCII, which means either that the locale
 	 * is C/POSIX which works with any encoding, or that we couldn't determine
@@ -268,12 +268,19 @@ createdb(const CreatedbStmt *stmt)
 	 * This is risky but we have historically allowed it --- notably, the
 	 * regression tests require it.
 	 *
+	 * 3. selected encoding is UTF8 and platform is win32. This is because
+	 * UTF8 is a pseudo codepage that is supported in all locales since
+	 * it's converted to UTF16 before being used.
+	 *
 	 * Note: if you change this policy, fix initdb to match.
 	 */
 	ctype_encoding = pg_get_encoding_from_locale(NULL);
 
 	if (!(ctype_encoding == encoding ||
 		  ctype_encoding == PG_SQL_ASCII ||
+#ifdef WIN32
+		  encoding == PG_UTF8 ||
+#endif
 		  (encoding == PG_SQL_ASCII && superuser())))
 		ereport(ERROR,
 				(errmsg("encoding %s does not match server's locale %s",
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index 4da9fde1b57..410aa218f60 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -42,7 +42,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  * Portions taken from FreeBSD.
  *
- * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.146 2007/10/16 09:09:11 petere Exp $
+ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.147 2007/10/16 11:30:16 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2840,7 +2840,17 @@ main(int argc, char *argv[])
 		/* We allow selection of SQL_ASCII --- see notes in createdb() */
 		if (!(ctype_enc == user_enc ||
 			  ctype_enc == PG_SQL_ASCII ||
-			  user_enc == PG_SQL_ASCII))
+			  user_enc == PG_SQL_ASCII
+#ifdef WIN32			  
+			/*
+			 * On win32, if the encoding chosen is UTF8, all locales are OK 
+			 * (assuming the actual locale name passed the checks above). This
+			 * is because UTF8 is a pseudo-codepage, that we convert to UTF16
+			 * before doing any operations on, and UTF16 supports all locales.
+			 */
+			|| user_enc == PG_UTF8
+#endif
+			  ))
 		{
 			fprintf(stderr, _("%s: encoding mismatch\n"), progname);
 			fprintf(stderr,
-- 
GitLab