Обсуждение: trouble with to_char('L')
Hi, my database has UTF8 encoding and Finnish locale, the client_encoding and the console is set to WIN1252. I created a table with a single NUMERIC(5,2) column and inserted a few values. Running a query 'SELECT to_char(money, '999D99L') FROM table' through psql gives the following error message: ERROR: invalid byte sequence for encoding "UTF8": 0x80 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". The graphical Query tool returns a set of empty rows. The query works ok without the 'L'. Thanks in advance, Mikko
Mikko wrote: > my database has UTF8 encoding and Finnish locale, the client_encoding > and the console is set to WIN1252. I created a table with a single > NUMERIC(5,2) column and inserted a few values. Running a query 'SELECT > to_char(money, '999D99L') FROM table' through psql gives the following > error message: > > ERROR: invalid byte sequence for encoding "UTF8": 0x80 > HINT: This error can also happen if the byte sequence does not match > the encoding expected by the server, which is controlled by > "client_encoding". > > The graphical Query tool returns a set of empty rows. The query works > ok without the 'L'. That is strange. What is your psql version? What is the output of the following commands: SHOW server_version; SHOW server_encoding; SHOW client_encoding; SHOW lc_numeric; SHOW lc_monetary; SELECT to_char(3.1415::numeric(5,2), '999D99L'); Yours, Laurenz Albe
psql (PostgreSQL) 8.3.7 server_version 8.3.7 server_encoding UTF8 client_encoding win1252 lc_numeric Finnish, Finland lc_monetary Finnish, Finland testdb=# SELECT to_char(3.1415::numeric(5,2), '999D99L'); ERROR: invalid byte sequence for encoding "UTF8": 0x80 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". If connected to postgres database the query returns 3,14. Mikko
Mikko escribió: > psql (PostgreSQL) 8.3.7 > > server_version 8.3.7 > server_encoding UTF8 > client_encoding win1252 > lc_numeric Finnish, Finland > lc_monetary Finnish, Finland > > testdb=# SELECT to_char(3.1415::numeric(5,2), '999D99L'); > > ERROR: invalid byte sequence for encoding "UTF8": 0x80 > HINT: This error can also happen if the byte sequence does not match > the encoding expected by the server, which is controlled by > "client_encoding". FWIW 0x80 is the Euro symbol in Win1252 according to http://en.wikipedia.org/wiki/Windows-1252 Maybe the problem here is that the chosen locales are not UTF8. Does it work if you set lc_numeric and lc_monetary to "Finnish_Finland.65001" instead? Those should match the server_encoding. -- Alvaro Herrera http://www.CommandPrompt.com/ PostgreSQL Replication, Consulting, Custom Development, 24x7 support
On Tue, Apr 21, 2009 at 8:13 PM, Alvaro Herrera <alvherre@commandprompt.com> wrote: > Maybe the problem here is that the chosen locales are not UTF8. Does it > work if you set lc_numeric and lc_monetary to "Finnish_Finland.65001" > instead? Those should match the server_encoding. alter database testdb set lc_monetary(or numeric) to 'Finnish_Finland.65001' returns: ERROR: invalid value for parameter "lc_monetary": "Finnish_Finland.65001" However, I noticed that both lc_collate and lc_ctype are set to Finnish_Finland.1252 by the installer. Should I have just run initdb with --locale fi_FI.UTF8 at the very start? The to_char('L') works fine with a database with win1252 encoding. Mikko
Mikko escribió: > On Tue, Apr 21, 2009 at 8:13 PM, Alvaro Herrera > <alvherre@commandprompt.com> wrote: > > Maybe the problem here is that the chosen locales are not UTF8. Does it > > work if you set lc_numeric and lc_monetary to "Finnish_Finland.65001" > > instead? Those should match the server_encoding. > > alter database testdb set lc_monetary(or numeric) to > 'Finnish_Finland.65001' returns: > ERROR: invalid value for parameter "lc_monetary": "Finnish_Finland.65001" Ouch ... I thought that was the way that Windows designated UTF8 locales, but maybe I am wrong. > However, I noticed that both lc_collate and lc_ctype are set to > Finnish_Finland.1252 by the installer. Should I have just run initdb > with --locale fi_FI.UTF8 at the very start? The to_char('L') works > fine with a database with win1252 encoding. Hmm, it should have disallowed the creation of an UTF8 database then. Maybe that part is what is broken here. -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc.
On Wed, Apr 22, 2009 at 2:13 AM, Alvaro Herrera <alvherre@commandprompt.com> wrote: > Ouch ... I thought that was the way that Windows designated UTF8 > locales, but maybe I am wrong. Ok, now I found out that Windows doesn't support locales with encoding using more than two bytes per character and initdb falls back to 1252. http://msdn.microsoft.com/en-us/library/x99tb11d.aspx I guess I'll have to manage with win1252 encoded dbs for the moment. Thanks for the answers! Mikko
Mikko escribió: > On Wed, Apr 22, 2009 at 2:13 AM, Alvaro Herrera > <alvherre@commandprompt.com> wrote: > > Ouch ... I thought that was the way that Windows designated UTF8 > > locales, but maybe I am wrong. > > Ok, now I found out that Windows doesn't support locales with encoding > using more than two bytes per character and initdb falls back to 1252. > > http://msdn.microsoft.com/en-us/library/x99tb11d.aspx Hmm. Does this imply that we shouldn't allow UTF8 database on Windows at all? -- Alvaro Herrera http://www.CommandPrompt.com/ The PostgreSQL Company - Command Prompt, Inc.
Alvaro Herrera <alvherre@commandprompt.com> writes: > Does this imply that we shouldn't allow UTF8 database on Windows at all? That would be pretty unfortunate :-( I think what this suggests is that there probably needs to be some encoding conversion logic near the places we examine localeconv() output. regards, tom lane
Tom Lane wrote: > Alvaro Herrera <alvherre@commandprompt.com> writes: >> Does this imply that we shouldn't allow UTF8 database on Windows at all? > > That would be pretty unfortunate :-( > > I think what this suggests is that there probably needs to be some > encoding conversion logic near the places we examine localeconv() > output. Attached is a patch to the current CVS. It uses a similar way like LC_TIME stuff does. regards, Hiroshi Inoue Index: pg_locale.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/pg_locale.c,v retrieving revision 1.49 diff -c -c -r1.49 pg_locale.c *** pg_locale.c 1 Apr 2009 09:17:32 -0000 1.49 --- pg_locale.c 22 Apr 2009 21:08:33 -0000 *************** *** 386,391 **** --- 386,449 ---- free(s->positive_sign); } + #ifdef WIN32 + #define MAX_BYTES_PER_CHARACTER 4 + static char *dbstr_win32(bool matchenc, const char *str) + { + int encoding = GetDatabaseEncoding(); + bool is_ascii = true; + size_t len, ilen, wclen, dstlen; + wchar_t *wbuf; + char *dst, *ibuf; + + if (matchenc) + return strdup(str); + /* Is the str an ascii string ? */ + for (ibuf = str; *ibuf; ibuf++) + { + if (!isascii(*ibuf)) + { + is_ascii = false; + break; + } + } + /* Simply returns the strdup()ed ascii string */ + if (is_ascii) + return strdup(str); + + ilen = strlen(str) + 1; + wclen = ilen * sizeof(wchar_t); + wbuf = (wchar_t *) palloc(wclen); + len = mbstowcs(wbuf, str, ilen); + if (len == -1) + elog(ERROR, + "could not convert string to Wide characters:error %lu", GetLastError()); + + dstlen = len * MAX_BYTES_PER_CHARACTER + 1; + dst = malloc(dstlen); + + len = WideCharToMultiByte(CP_UTF8, 0, wbuf, len, dst, dstlen, NULL, NULL); + pfree(wbuf); + if (len == 0) + elog(ERROR, + "could not convert string to UTF-8:error %lu", GetLastError()); + + dst[len] = '\0'; + if (encoding != PG_UTF8) + { + char *convstr = pg_do_encoding_conversion(dst, len, PG_UTF8, encoding); + if (dst != convstr) + { + strlcpy(dst, convstr, dstlen); + pfree(convstr); + } + } + + return dst; + } + + #define strdup(str) dbstr_win32(is_encoding_match, str) + #endif /* WIN32 */ /* * Return the POSIX lconv struct (contains number/money formatting *************** *** 398,403 **** --- 456,466 ---- struct lconv *extlconv; char *save_lc_monetary; char *save_lc_numeric; + #ifdef WIN32 + char *save_lc_ctype = NULL; + bool lc_ctype_change = false, is_encoding_match; + #endif /* WIN32 */ + /* Did we do it already? */ if (CurrentLocaleConvValid) *************** *** 413,418 **** --- 476,492 ---- if (save_lc_numeric) save_lc_numeric = pstrdup(save_lc_numeric); + #ifdef WIN32 + save_lc_ctype = setlocale(LC_CTYPE, NULL); + if (save_lc_ctype && stricmp(locale_monetary, save_lc_ctype) != 0) + { + lc_ctype_change = true; + save_lc_ctype = pstrdup(save_lc_ctype); + setlocale(LC_CTYPE, locale_monetary); + } + is_encoding_match = (pg_get_encoding_from_locale(locale_monetary) == GetDatabaseEncoding()); + #endif + setlocale(LC_MONETARY, locale_monetary); setlocale(LC_NUMERIC, locale_numeric); *************** *** 437,442 **** --- 511,524 ---- CurrentLocaleConv.n_sign_posn = extlconv->n_sign_posn; /* Try to restore internal settings */ + #ifdef WIN32 + #undef strdup + if (lc_ctype_change) + { + setlocale(LC_CTYPE, save_lc_ctype); + pfree(save_lc_ctype); + } + #endif /* WIN32 */ if (save_lc_monetary) { setlocale(LC_MONETARY, save_lc_monetary);
Where are we on this issue? --------------------------------------------------------------------------- Hiroshi Inoue wrote: > Tom Lane wrote: > > Alvaro Herrera <alvherre@commandprompt.com> writes: > >> Does this imply that we shouldn't allow UTF8 database on Windows at all? > > > > That would be pretty unfortunate :-( > > > > I think what this suggests is that there probably needs to be some > > encoding conversion logic near the places we examine localeconv() > > output. > > Attached is a patch to the current CVS. > It uses a similar way like LC_TIME stuff does. > > regards, > Hiroshi Inoue > Index: pg_locale.c > =================================================================== > RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/pg_locale.c,v > retrieving revision 1.49 > diff -c -c -r1.49 pg_locale.c > *** pg_locale.c 1 Apr 2009 09:17:32 -0000 1.49 > --- pg_locale.c 22 Apr 2009 21:08:33 -0000 > *************** > *** 386,391 **** > --- 386,449 ---- > free(s->positive_sign); > } > > + #ifdef WIN32 > + #define MAX_BYTES_PER_CHARACTER 4 > + static char *dbstr_win32(bool matchenc, const char *str) > + { > + int encoding = GetDatabaseEncoding(); > + bool is_ascii = true; > + size_t len, ilen, wclen, dstlen; > + wchar_t *wbuf; > + char *dst, *ibuf; > + > + if (matchenc) > + return strdup(str); > + /* Is the str an ascii string ? */ > + for (ibuf = str; *ibuf; ibuf++) > + { > + if (!isascii(*ibuf)) > + { > + is_ascii = false; > + break; > + } > + } > + /* Simply returns the strdup()ed ascii string */ > + if (is_ascii) > + return strdup(str); > + > + ilen = strlen(str) + 1; > + wclen = ilen * sizeof(wchar_t); > + wbuf = (wchar_t *) palloc(wclen); > + len = mbstowcs(wbuf, str, ilen); > + if (len == -1) > + elog(ERROR, > + "could not convert string to Wide characters:error %lu", GetLastError()); > + > + dstlen = len * MAX_BYTES_PER_CHARACTER + 1; > + dst = malloc(dstlen); > + > + len = WideCharToMultiByte(CP_UTF8, 0, wbuf, len, dst, dstlen, NULL, NULL); > + pfree(wbuf); > + if (len == 0) > + elog(ERROR, > + "could not convert string to UTF-8:error %lu", GetLastError()); > + > + dst[len] = '\0'; > + if (encoding != PG_UTF8) > + { > + char *convstr = pg_do_encoding_conversion(dst, len, PG_UTF8, encoding); > + if (dst != convstr) > + { > + strlcpy(dst, convstr, dstlen); > + pfree(convstr); > + } > + } > + > + return dst; > + } > + > + #define strdup(str) dbstr_win32(is_encoding_match, str) > + #endif /* WIN32 */ > > /* > * Return the POSIX lconv struct (contains number/money formatting > *************** > *** 398,403 **** > --- 456,466 ---- > struct lconv *extlconv; > char *save_lc_monetary; > char *save_lc_numeric; > + #ifdef WIN32 > + char *save_lc_ctype = NULL; > + bool lc_ctype_change = false, is_encoding_match; > + #endif /* WIN32 */ > + > > /* Did we do it already? */ > if (CurrentLocaleConvValid) > *************** > *** 413,418 **** > --- 476,492 ---- > if (save_lc_numeric) > save_lc_numeric = pstrdup(save_lc_numeric); > > + #ifdef WIN32 > + save_lc_ctype = setlocale(LC_CTYPE, NULL); > + if (save_lc_ctype && stricmp(locale_monetary, save_lc_ctype) != 0) > + { > + lc_ctype_change = true; > + save_lc_ctype = pstrdup(save_lc_ctype); > + setlocale(LC_CTYPE, locale_monetary); > + } > + is_encoding_match = (pg_get_encoding_from_locale(locale_monetary) == GetDatabaseEncoding()); > + #endif > + > setlocale(LC_MONETARY, locale_monetary); > setlocale(LC_NUMERIC, locale_numeric); > > *************** > *** 437,442 **** > --- 511,524 ---- > CurrentLocaleConv.n_sign_posn = extlconv->n_sign_posn; > > /* Try to restore internal settings */ > + #ifdef WIN32 > + #undef strdup > + if (lc_ctype_change) > + { > + setlocale(LC_CTYPE, save_lc_ctype); > + pfree(save_lc_ctype); > + } > + #endif /* WIN32 */ > if (save_lc_monetary) > { > setlocale(LC_MONETARY, save_lc_monetary); > > > -- > Sent via pgsql-general mailing list (pgsql-general@postgresql.org) > To make changes to your subscription: > http://www.postgresql.org/mailpref/pgsql-general -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com PG East: http://www.enterprisedb.com/community/nav-pg-east-2010.do + If your life is a hard drive, Christ can be your backup. +
Bruce Momjian <bruce@momjian.us> writes: > Where are we on this issue? According to my files, I complained about the extreme ugliness of the patch (redefining strdup for pete's sake) and the fact that it did not actually do things anything like the LC_TIME code as was claimed. Hiroshi rejected those criticisms. I don't know where we are, but I don't want to see this patch applied in this form. regards, tom lane
Tom Lane wrote: > Bruce Momjian <bruce@momjian.us> writes: > > Where are we on this issue? > > According to my files, I complained about the extreme ugliness of the > patch (redefining strdup for pete's sake) and the fact that it did not > actually do things anything like the LC_TIME code as was claimed. > Hiroshi rejected those criticisms. I don't know where we are, but > I don't want to see this patch applied in this form. Right, but you are saying it is still an open issue, which says we should look at it. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com PG East: http://www.enterprisedb.com/community/nav-pg-east-2010.do + If your life is a hard drive, Christ can be your backup. +
Bruce Momjian <bruce@momjian.us> writes: > Right, but you are saying it is still an open issue, which says we > should look at it. Sure. Maybe put it on TODO? regards, tom lane
Tom Lane wrote: > Bruce Momjian <bruce@momjian.us> writes: > > Right, but you are saying it is still an open issue, which says we > > should look at it. > > Sure. Maybe put it on TODO? OK, TODO is: Fix locale-aware handling (e.g. monetary) for specific server/client encoding combinations * http://archives.postgresql.org/pgsql-general/2009-04/msg00799.php If someone wants to work on it, go ahead. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com PG East: http://www.enterprisedb.com/community/nav-pg-east-2010.do + If your life is a hard drive, Christ can be your backup. +
Bruce Momjian wrote: > Where are we on this issue? Oops I forgot it completely. I have a little improved version and would post it tonight. regards, Hiroshi Inoue > > --------------------------------------------------------------------------- > > Hiroshi Inoue wrote: >> Tom Lane wrote: >>> Alvaro Herrera <alvherre@commandprompt.com> writes: >>>> Does this imply that we shouldn't allow UTF8 database on Windows at all? >>> That would be pretty unfortunate :-( >>> >>> I think what this suggests is that there probably needs to be some >>> encoding conversion logic near the places we examine localeconv() >>> output. >> Attached is a patch to the current CVS. >> It uses a similar way like LC_TIME stuff does. >> >> regards, >> Hiroshi Inoue
Hiroshi Inoue wrote: > Bruce Momjian wrote: > > Where are we on this issue? > > Oops I forgot it completely. > I have a little improved version and would post it tonight. Ah, very good. Thanks. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com PG East: http://www.enterprisedb.com/community/nav-pg-east-2010.do + If your life is a hard drive, Christ can be your backup. +
Bruce Momjian wrote: > Hiroshi Inoue wrote: >> Bruce Momjian wrote: >>> Where are we on this issue? >> Oops I forgot it completely. >> I have a little improved version and would post it tonight. > > Ah, very good. Thanks. Attached is an improved version. regards, Hiroshi Inoue ? formatting.patch ? pg_locale.patch ? pg_locale_20081221.patch ? pg_locale_20090120.patch ? pg_locale_20090422.patch ? pg_locale_20090423.patch ? pg_locale_20090427.patch ? pg_locale_20090608.patch ? pg_locale_20090901.patch ? pg_locale_with_debug.c Index: pg_locale.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/backend/utils/adt/pg_locale.c,v retrieving revision 1.51 diff -c -c -r1.51 pg_locale.c *** pg_locale.c 2 Jan 2010 16:57:54 -0000 1.51 --- pg_locale.c 26 Feb 2010 22:43:52 -0000 *************** *** 386,391 **** --- 386,449 ---- free(s->positive_sign); } + #ifdef WIN32 + static char *db_strdup(const char *item, const char *str) + { + int encoding = GetDatabaseEncoding(); + size_t wchars, ilen, wclen, dstlen; + int utflen, bytes_per_char; + wchar_t *wbuf; + char *dst; + + if (!str[0]) + return strdup(str); + ilen = strlen(str) + 1; + wclen = ilen * sizeof(wchar_t); + wbuf = (wchar_t *) palloc(wclen); + wchars = mbstowcs(wbuf, str, ilen); + if (wchars == (size_t) -1) + elog(ERROR, + "could not convert string to Wide characters:error %lu", GetLastError()); + + bytes_per_char = pg_encoding_max_length(PG_UTF8); + if (pg_encoding_max_length(encoding) > bytes_per_char) + bytes_per_char = pg_encoding_max_length(encoding); + dstlen = wchars * bytes_per_char + 1; + dst = malloc(dstlen); + if (dst == NULL) + elog(ERROR, "could not allocate a destination buffer"); + + utflen = WideCharToMultiByte(CP_UTF8, 0, wbuf, wchars, dst, dstlen, NULL, NULL); + if (utflen == 0) + elog(ERROR, + "could not convert string %04x to UTF-8:error %lu", wbuf[0], GetLastError()); + pfree(wbuf); + + dst[utflen] = '\0'; + if (encoding != PG_UTF8) + { + PG_TRY(); + { + char *convstr = pg_do_encoding_conversion(dst, utflen, PG_UTF8, encoding); + if (dst != convstr) + { + strlcpy(dst, convstr, dstlen); + pfree(convstr); + } + } + PG_CATCH(); + { + FlushErrorState(); + dst[0] = '\0'; + } + PG_END_TRY(); + } + + return dst; + } + #else + static char *db_strdup(const char *item, const char *str) {return strdup(str);} + #endif /* WIN32 */ /* * Return the POSIX lconv struct (contains number/money formatting *************** *** 398,403 **** --- 456,463 ---- struct lconv *extlconv; char *save_lc_monetary; char *save_lc_numeric; + bool change_lc_ctype = false, is_same_locale = true; + char *save_lc_ctype = NULL; /* Did we do it already? */ if (CurrentLocaleConvValid) *************** *** 413,422 **** if (save_lc_numeric) save_lc_numeric = pstrdup(save_lc_numeric); setlocale(LC_MONETARY, locale_monetary); ! setlocale(LC_NUMERIC, locale_numeric); ! /* Get formatting information */ extlconv = localeconv(); /* --- 473,496 ---- if (save_lc_numeric) save_lc_numeric = pstrdup(save_lc_numeric); + #ifdef WIN32 + is_same_locale = (stricmp(locale_monetary, locale_numeric) == 0); + save_lc_ctype = setlocale(LC_CTYPE, NULL); + if (!is_same_locale || save_lc_ctype == NULL || stricmp(locale_monetary, save_lc_ctype) != 0) + change_lc_ctype = true; + if (change_lc_ctype && save_lc_ctype) + save_lc_ctype = pstrdup(save_lc_ctype); + else + save_lc_ctype = NULL; + #endif + + if (change_lc_ctype) + setlocale(LC_CTYPE, locale_monetary); setlocale(LC_MONETARY, locale_monetary); ! if (is_same_locale) ! setlocale(LC_NUMERIC, locale_numeric); ! /* Get formatting information for LC_MONETARY( and LC_NUMERIC when they are the same) */ extlconv = localeconv(); /* *************** *** 424,442 **** * 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 */ if (save_lc_monetary) { setlocale(LC_MONETARY, save_lc_monetary); --- 498,528 ---- * localeconv()'s results. */ CurrentLocaleConv = *extlconv; ! CurrentLocaleConv.currency_symbol = db_strdup("currency_symbol", extlconv->currency_symbol); ! CurrentLocaleConv.int_curr_symbol = db_strdup("int_curr_symbol", extlconv->int_curr_symbol); ! CurrentLocaleConv.mon_decimal_point = db_strdup("mon_decimal_point", extlconv->mon_decimal_point); CurrentLocaleConv.mon_grouping = strdup(extlconv->mon_grouping); ! CurrentLocaleConv.mon_thousands_sep = db_strdup("mon_thousands_sep", extlconv->mon_thousands_sep); ! CurrentLocaleConv.negative_sign = db_strdup("nagative_sign", extlconv->negative_sign); ! CurrentLocaleConv.positive_sign = db_strdup("positive_sign", extlconv->positive_sign); CurrentLocaleConv.n_sign_posn = extlconv->n_sign_posn; + if (!is_same_locale) + { + setlocale(LC_CTYPE, locale_numeric); + setlocale(LC_NUMERIC, locale_numeric); + /* Get formatting information for LC_NUMERIC */ + extlconv = localeconv(); + } + CurrentLocaleConv.decimal_point = db_strdup("decimal_point", extlconv->decimal_point); + CurrentLocaleConv.grouping = strdup(extlconv->grouping); + CurrentLocaleConv.thousands_sep = db_strdup("thousands_sep", extlconv->thousands_sep); /* Try to restore internal settings */ + if (save_lc_ctype) + { + setlocale(LC_CTYPE, save_lc_ctype); + pfree(save_lc_ctype); + } if (save_lc_monetary) { setlocale(LC_MONETARY, save_lc_monetary);
Hiroshi Inoue wrote: > Bruce Momjian wrote: > > Hiroshi Inoue wrote: > >> Bruce Momjian wrote: > >>> Where are we on this issue? > >> Oops I forgot it completely. > >> I have a little improved version and would post it tonight. > > > > Ah, very good. Thanks. > > Attached is an improved version. FYI, I am working on this patch now and will post an updated version. -- Bruce Momjian <bruce@momjian.us> http://momjian.us EnterpriseDB http://enterprisedb.com PG East: http://www.enterprisedb.com/community/nav-pg-east-2010.do