diff -cprN head/src/backend/utils/adt/pg_locale.c work/src/backend/utils/adt/pg_locale.c *** head/src/backend/utils/adt/pg_locale.c 2010-03-01 10:46:55.122677000 +0900 --- work/src/backend/utils/adt/pg_locale.c 2010-03-18 12:31:47.094400713 +0900 *************** static char lc_monetary_envbuf[LC_ENV_BU *** 92,97 **** --- 92,99 ---- static char lc_numeric_envbuf[LC_ENV_BUFSIZE]; static char lc_time_envbuf[LC_ENV_BUFSIZE]; + static char *db_encoding_strdup(const char *str); + #if defined(WIN32) && defined(LC_MESSAGES) static char *IsoLocaleName(const char *); /* MSVC specific */ #endif *************** free_struct_lconv(struct lconv * s) *** 386,391 **** --- 388,413 ---- free(s->positive_sign); } + /* + * Converts strings encoded in the platform-dependent encoding to the database + * encoding and returns malloc'ed buffer. + */ + static char * + db_encoding_strdup(const char *str) + { + char *pstr; + char *mstr; + + /* convert the string to the database encoding */ + pstr = (char *) pg_do_encoding_conversion( + (unsigned char *) str, strlen(str), + GetPlatformEncoding(), GetDatabaseEncoding()); + mstr = strdup(pstr); + if (pstr != str) + pfree(pstr); + + return mstr; + } /* * Return the POSIX lconv struct (contains number/money formatting *************** PGLC_localeconv(void) *** 424,439 **** * localeconv()'s results. */ CurrentLocaleConv = *extlconv; ! CurrentLocaleConv.currency_symbol = strdup(extlconv->currency_symbol); ! CurrentLocaleConv.decimal_point = strdup(extlconv->decimal_point); ! CurrentLocaleConv.grouping = strdup(extlconv->grouping); ! CurrentLocaleConv.thousands_sep = strdup(extlconv->thousands_sep); ! CurrentLocaleConv.int_curr_symbol = strdup(extlconv->int_curr_symbol); ! CurrentLocaleConv.mon_decimal_point = strdup(extlconv->mon_decimal_point); ! CurrentLocaleConv.mon_grouping = strdup(extlconv->mon_grouping); ! CurrentLocaleConv.mon_thousands_sep = strdup(extlconv->mon_thousands_sep); ! CurrentLocaleConv.negative_sign = strdup(extlconv->negative_sign); ! CurrentLocaleConv.positive_sign = strdup(extlconv->positive_sign); CurrentLocaleConv.n_sign_posn = extlconv->n_sign_posn; /* Try to restore internal settings */ --- 446,461 ---- * localeconv()'s results. */ CurrentLocaleConv = *extlconv; ! CurrentLocaleConv.currency_symbol = db_encoding_strdup(extlconv->currency_symbol); ! CurrentLocaleConv.decimal_point = db_encoding_strdup(extlconv->decimal_point); ! CurrentLocaleConv.grouping = db_encoding_strdup(extlconv->grouping); ! CurrentLocaleConv.thousands_sep = db_encoding_strdup(extlconv->thousands_sep); ! CurrentLocaleConv.int_curr_symbol = db_encoding_strdup(extlconv->int_curr_symbol); ! CurrentLocaleConv.mon_decimal_point = db_encoding_strdup(extlconv->mon_decimal_point); ! CurrentLocaleConv.mon_grouping = db_encoding_strdup(extlconv->mon_grouping); ! CurrentLocaleConv.mon_thousands_sep = db_encoding_strdup(extlconv->mon_thousands_sep); ! CurrentLocaleConv.negative_sign = db_encoding_strdup(extlconv->negative_sign); ! CurrentLocaleConv.positive_sign = db_encoding_strdup(extlconv->positive_sign); CurrentLocaleConv.n_sign_posn = extlconv->n_sign_posn; /* Try to restore internal settings */ diff -cprN head/src/port/chklocale.c work/src/port/chklocale.c *** head/src/port/chklocale.c 2010-02-26 11:29:55.507518000 +0900 --- work/src/port/chklocale.c 2010-03-18 12:31:47.191403027 +0900 *************** static const struct encoding_match encod *** 182,187 **** --- 182,188 ---- {PG_SHIFT_JIS_2004, "SJIS_2004"}, {PG_SQL_ASCII, "US-ASCII"}, + {PG_SQL_ASCII, "ANSI_X3.4-1968"}, {PG_SQL_ASCII, NULL} /* end marker */ };