Re: Missing rows with index scan when collation is not "C" (PostgreSQL 9.5) - Mailing list pgsql-bugs
Robert Haas <robertmhaas@gmail.com> writes: > I was a little worried that it was too much to hope for that all libc > vendors on earth would ship a strxfrm() implementation that was actually > consistent with strcoll(), and here we are. Indeed. To try to put some scope on the problem, I made an idiot little program that just generates some random UTF8 strings and sees whether strcoll and strxfrm sort them alike. Attached are that program, a even more idiot little shell script that runs it over all available UTF8 locales, and the results on my RHEL6 box. While de_DE seems to be the worst-broken locale, it's far from the only one. Please try this on as many platforms as you can get hold of ... regards, tom lane #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> #include <time.h> /* * Test: generate 1000 random UTF8 strings, sort them by strcoll, sanity- * check the sort result, sort them by strxfrm, sanity-check that result, * and compare the two sort orders. */ #define NSTRINGS 1000 #define MAXSTRLEN 20 #define MAXXFRMLEN (MAXSTRLEN * 5) typedef struct { char strval[MAXSTRLEN]; char xfrmval[MAXXFRMLEN]; int strsortpos; int xfrmsortpos; } OneString; /* qsort comparators */ static int strcoll_compare(const void *pa, const void *pb) { const OneString *a = (const OneString *) pa; const OneString *b = (const OneString *) pb; return strcoll(a->strval, b->strval); } static int strxfrm_compare(const void *pa, const void *pb) { const OneString *a = (const OneString *) pa; const OneString *b = (const OneString *) pb; return strcmp(a->xfrmval, b->xfrmval); } /* returns 1 if OK, 0 if inconsistency detected */ static int run_test_case(void) { int ok = 1; OneString data[NSTRINGS]; int i, j; /* Generate random UTF8 strings of length less than MAXSTRLEN bytes */ for (i = 0; i < NSTRINGS; i++) { char *p = data[i].strval; int len; len = 1 + (random() % (MAXSTRLEN - 1)); while (len > 0) { int c; /* Generate random printable char in ISO8859-1 range */ /* Bias towards producing a lot of spaces */ if ((random() % 16) < 3) c = ' '; else { do { c = random() & 0xFF; } while (!((c >= ' ' && c <= 127) || (c >= 0xA0 && c <= 0xFF))); } if (c <= 127) { *p++ = c; len--; } else { if (len < 2) break; /* Poor man's utf8-ification */ *p++ = 0xC0 + (c >> 6); len--; *p++ = 0x80 + (c & 0x3F); len--; } } *p = '\0'; /* strxfrm each string as we produce it */ if (strxfrm(data[i].xfrmval, data[i].strval, MAXXFRMLEN) >= MAXXFRMLEN) { fprintf(stderr, "strxfrm() result for %d-length string exceeded %d bytes\n", (int) strlen(data[i].strval), MAXXFRMLEN); exit(1); } #if 0 printf("%d %s\n", i, data[i].strval); #endif } /* Sort per strcoll(), and label, being careful in case some are equal */ qsort(data, NSTRINGS, sizeof(OneString), strcoll_compare); j = 0; for (i = 0; i < NSTRINGS; i++) { if (i > 0 && strcoll(data[i].strval, data[i-1].strval) != 0) j++; data[i].strsortpos = j; } /* Sanity-check: is each string <= those after it? */ for (i = 0; i < NSTRINGS; i++) { for (j = i + 1; j < NSTRINGS; j++) { if (strcoll(data[i].strval, data[j].strval) > 0) { fprintf(stdout, "strcoll sort inconsistency between positions %d and %d\n", i, j); ok = 0; } } } /* Sort per strxfrm(), and label, being careful in case some are equal */ qsort(data, NSTRINGS, sizeof(OneString), strxfrm_compare); j = 0; for (i = 0; i < NSTRINGS; i++) { if (i > 0 && strcmp(data[i].xfrmval, data[i-1].xfrmval) != 0) j++; data[i].xfrmsortpos = j; } /* Sanity-check: is each string <= those after it? */ for (i = 0; i < NSTRINGS; i++) { for (j = i + 1; j < NSTRINGS; j++) { if (strcmp(data[i].xfrmval, data[j].xfrmval) > 0) { fprintf(stdout, "strxfrm sort inconsistency between positions %d and %d\n", i, j); ok = 0; } } } /* Compare */ for (i = 0; i < NSTRINGS; i++) { if (data[i].strsortpos != data[i].xfrmsortpos) { fprintf(stdout, "inconsistency between strcoll (%d) and strxfrm (%d) orders\n", data[i].strsortpos, data[i].xfrmsortpos); ok = 0; } } return ok; } int main(int argc, char **argv) { const char *lc; int ntries; /* Absorb locale from environment, and report what we're using */ if (setlocale(LC_ALL, "") == NULL) { perror("setlocale(LC_ALL) failed"); exit(1); } lc = setlocale(LC_COLLATE, NULL); if (lc) { printf("Using LC_COLLATE = \"%s\"\n", lc); } else { perror("setlocale(LC_COLLATE) failed"); exit(1); } lc = setlocale(LC_CTYPE, NULL); if (lc) { printf("Using LC_CTYPE = \"%s\"\n", lc); } else { perror("setlocale(LC_CTYPE) failed"); exit(1); } /* Ensure new random() values on every run */ srandom((unsigned int) time(NULL)); /* argv[1] can be the max number of tries to run */ if (argc > 1) ntries = atoi(argv[1]); else ntries = 1; /* Run one test instance per loop */ while (ntries-- > 0) { if (!run_test_case()) exit(1); } return 0; } #! /bin/sh for LANG in `locale -a | grep -i 'utf.*8'` do export LANG if ./strcolltest 10 then echo $LANG good else echo $LANG BAD fi done Using LC_COLLATE = "aa_DJ.utf8" Using LC_CTYPE = "aa_DJ.utf8" aa_DJ.utf8 good Using LC_COLLATE = "aa_ER.utf8" Using LC_CTYPE = "aa_ER.utf8" aa_ER.utf8 good Using LC_COLLATE = "aa_ER.utf8@saaho" Using LC_CTYPE = "aa_ER.utf8@saaho" aa_ER.utf8@saaho good Using LC_COLLATE = "aa_ET.utf8" Using LC_CTYPE = "aa_ET.utf8" aa_ET.utf8 good Using LC_COLLATE = "af_ZA.utf8" Using LC_CTYPE = "af_ZA.utf8" af_ZA.utf8 good Using LC_COLLATE = "am_ET.utf8" Using LC_CTYPE = "am_ET.utf8" am_ET.utf8 good Using LC_COLLATE = "an_ES.utf8" Using LC_CTYPE = "an_ES.utf8" an_ES.utf8 good Using LC_COLLATE = "ar_AE.utf8" Using LC_CTYPE = "ar_AE.utf8" ar_AE.utf8 good Using LC_COLLATE = "ar_BH.utf8" Using LC_CTYPE = "ar_BH.utf8" ar_BH.utf8 good Using LC_COLLATE = "ar_DZ.utf8" Using LC_CTYPE = "ar_DZ.utf8" ar_DZ.utf8 good Using LC_COLLATE = "ar_EG.utf8" Using LC_CTYPE = "ar_EG.utf8" ar_EG.utf8 good Using LC_COLLATE = "ar_IN.utf8" Using LC_CTYPE = "ar_IN.utf8" ar_IN.utf8 good Using LC_COLLATE = "ar_IQ.utf8" Using LC_CTYPE = "ar_IQ.utf8" ar_IQ.utf8 good Using LC_COLLATE = "ar_JO.utf8" Using LC_CTYPE = "ar_JO.utf8" ar_JO.utf8 good Using LC_COLLATE = "ar_KW.utf8" Using LC_CTYPE = "ar_KW.utf8" ar_KW.utf8 good Using LC_COLLATE = "ar_LB.utf8" Using LC_CTYPE = "ar_LB.utf8" ar_LB.utf8 good Using LC_COLLATE = "ar_LY.utf8" Using LC_CTYPE = "ar_LY.utf8" ar_LY.utf8 good Using LC_COLLATE = "ar_MA.utf8" Using LC_CTYPE = "ar_MA.utf8" ar_MA.utf8 good Using LC_COLLATE = "ar_OM.utf8" Using LC_CTYPE = "ar_OM.utf8" ar_OM.utf8 good Using LC_COLLATE = "ar_QA.utf8" Using LC_CTYPE = "ar_QA.utf8" ar_QA.utf8 good Using LC_COLLATE = "ar_SA.utf8" Using LC_CTYPE = "ar_SA.utf8" ar_SA.utf8 good Using LC_COLLATE = "ar_SD.utf8" Using LC_CTYPE = "ar_SD.utf8" ar_SD.utf8 good Using LC_COLLATE = "ar_SY.utf8" Using LC_CTYPE = "ar_SY.utf8" ar_SY.utf8 good Using LC_COLLATE = "ar_TN.utf8" Using LC_CTYPE = "ar_TN.utf8" ar_TN.utf8 good Using LC_COLLATE = "ar_YE.utf8" Using LC_CTYPE = "ar_YE.utf8" ar_YE.utf8 good Using LC_COLLATE = "as_IN.utf8" Using LC_CTYPE = "as_IN.utf8" as_IN.utf8 good Using LC_COLLATE = "ast_ES.utf8" Using LC_CTYPE = "ast_ES.utf8" ast_ES.utf8 good Using LC_COLLATE = "az_AZ.utf8" Using LC_CTYPE = "az_AZ.utf8" inconsistency between strcoll (718) and strxfrm (717) orders inconsistency between strcoll (717) and strxfrm (718) orders az_AZ.utf8 BAD Using LC_COLLATE = "be_BY.utf8" Using LC_CTYPE = "be_BY.utf8" be_BY.utf8 good Using LC_COLLATE = "be_BY.utf8@latin" Using LC_CTYPE = "be_BY.utf8@latin" be_BY.utf8@latin good Using LC_COLLATE = "ber_DZ.utf8" Using LC_CTYPE = "ber_DZ.utf8" ber_DZ.utf8 good Using LC_COLLATE = "ber_MA.utf8" Using LC_CTYPE = "ber_MA.utf8" ber_MA.utf8 good Using LC_COLLATE = "bg_BG.utf8" Using LC_CTYPE = "bg_BG.utf8" bg_BG.utf8 good Using LC_COLLATE = "bn_BD.utf8" Using LC_CTYPE = "bn_BD.utf8" bn_BD.utf8 good Using LC_COLLATE = "bn_IN.utf8" Using LC_CTYPE = "bn_IN.utf8" bn_IN.utf8 good Using LC_COLLATE = "bo_CN.utf8" Using LC_CTYPE = "bo_CN.utf8" bo_CN.utf8 good Using LC_COLLATE = "bo_IN.utf8" Using LC_CTYPE = "bo_IN.utf8" bo_IN.utf8 good Using LC_COLLATE = "br_FR.utf8" Using LC_CTYPE = "br_FR.utf8" br_FR.utf8 good Using LC_COLLATE = "bs_BA.utf8" Using LC_CTYPE = "bs_BA.utf8" bs_BA.utf8 good Using LC_COLLATE = "byn_ER.utf8" Using LC_CTYPE = "byn_ER.utf8" byn_ER.utf8 good Using LC_COLLATE = "ca_AD.utf8" Using LC_CTYPE = "ca_AD.utf8" ca_AD.utf8 good Using LC_COLLATE = "ca_ES.utf8" Using LC_CTYPE = "ca_ES.utf8" ca_ES.utf8 good Using LC_COLLATE = "ca_FR.utf8" Using LC_CTYPE = "ca_FR.utf8" ca_FR.utf8 good Using LC_COLLATE = "ca_IT.utf8" Using LC_CTYPE = "ca_IT.utf8" ca_IT.utf8 good Using LC_COLLATE = "crh_UA.utf8" Using LC_CTYPE = "crh_UA.utf8" inconsistency between strcoll (264) and strxfrm (263) orders inconsistency between strcoll (265) and strxfrm (264) orders inconsistency between strcoll (263) and strxfrm (265) orders inconsistency between strcoll (427) and strxfrm (426) orders inconsistency between strcoll (426) and strxfrm (427) orders crh_UA.utf8 BAD Using LC_COLLATE = "cs_CZ.utf8" Using LC_CTYPE = "cs_CZ.utf8" cs_CZ.utf8 good Using LC_COLLATE = "csb_PL.utf8" Using LC_CTYPE = "csb_PL.utf8" csb_PL.utf8 good Using LC_COLLATE = "cv_RU.utf8" Using LC_CTYPE = "cv_RU.utf8" cv_RU.utf8 good Using LC_COLLATE = "cy_GB.utf8" Using LC_CTYPE = "cy_GB.utf8" cy_GB.utf8 good Using LC_COLLATE = "da_DK.utf8" Using LC_CTYPE = "da_DK.utf8" inconsistency between strcoll (876) and strxfrm (875) orders inconsistency between strcoll (877) and strxfrm (876) orders inconsistency between strcoll (875) and strxfrm (877) orders inconsistency between strcoll (902) and strxfrm (901) orders inconsistency between strcoll (901) and strxfrm (902) orders da_DK.utf8 BAD Using LC_COLLATE = "de_AT.utf8" Using LC_CTYPE = "de_AT.utf8" de_AT.utf8 good Using LC_COLLATE = "de_BE.utf8" Using LC_CTYPE = "de_BE.utf8" de_BE.utf8 good Using LC_COLLATE = "de_CH.utf8" Using LC_CTYPE = "de_CH.utf8" de_CH.utf8 good Using LC_COLLATE = "de_DE.utf8" Using LC_CTYPE = "de_DE.utf8" inconsistency between strcoll (69) and strxfrm (68) orders inconsistency between strcoll (68) and strxfrm (69) orders inconsistency between strcoll (129) and strxfrm (127) orders inconsistency between strcoll (127) and strxfrm (128) orders inconsistency between strcoll (128) and strxfrm (129) orders inconsistency between strcoll (188) and strxfrm (187) orders inconsistency between strcoll (187) and strxfrm (188) orders inconsistency between strcoll (258) and strxfrm (257) orders inconsistency between strcoll (257) and strxfrm (258) orders inconsistency between strcoll (260) and strxfrm (259) orders inconsistency between strcoll (261) and strxfrm (260) orders inconsistency between strcoll (259) and strxfrm (261) orders inconsistency between strcoll (284) and strxfrm (283) orders inconsistency between strcoll (283) and strxfrm (284) orders inconsistency between strcoll (312) and strxfrm (311) orders inconsistency between strcoll (311) and strxfrm (312) orders inconsistency between strcoll (316) and strxfrm (315) orders inconsistency between strcoll (315) and strxfrm (316) orders inconsistency between strcoll (361) and strxfrm (360) orders inconsistency between strcoll (360) and strxfrm (361) orders inconsistency between strcoll (385) and strxfrm (383) orders inconsistency between strcoll (383) and strxfrm (384) orders inconsistency between strcoll (384) and strxfrm (385) orders inconsistency between strcoll (410) and strxfrm (408) orders inconsistency between strcoll (408) and strxfrm (409) orders inconsistency between strcoll (409) and strxfrm (410) orders inconsistency between strcoll (428) and strxfrm (426) orders inconsistency between strcoll (426) and strxfrm (427) orders inconsistency between strcoll (429) and strxfrm (428) orders inconsistency between strcoll (427) and strxfrm (429) orders inconsistency between strcoll (431) and strxfrm (430) orders inconsistency between strcoll (430) and strxfrm (431) orders inconsistency between strcoll (528) and strxfrm (527) orders inconsistency between strcoll (529) and strxfrm (528) orders inconsistency between strcoll (527) and strxfrm (529) orders inconsistency between strcoll (542) and strxfrm (541) orders inconsistency between strcoll (541) and strxfrm (542) orders inconsistency between strcoll (552) and strxfrm (551) orders inconsistency between strcoll (551) and strxfrm (552) orders inconsistency between strcoll (586) and strxfrm (583) orders inconsistency between strcoll (587) and strxfrm (584) orders inconsistency between strcoll (583) and strxfrm (585) orders inconsistency between strcoll (584) and strxfrm (586) orders inconsistency between strcoll (585) and strxfrm (587) orders inconsistency between strcoll (596) and strxfrm (595) orders inconsistency between strcoll (595) and strxfrm (596) orders inconsistency between strcoll (921) and strxfrm (920) orders inconsistency between strcoll (920) and strxfrm (921) orders de_DE.utf8 BAD Using LC_COLLATE = "de_LU.utf8" Using LC_CTYPE = "de_LU.utf8" de_LU.utf8 good Using LC_COLLATE = "dv_MV.utf8" Using LC_CTYPE = "dv_MV.utf8" dv_MV.utf8 good Using LC_COLLATE = "dz_BT.utf8" Using LC_CTYPE = "dz_BT.utf8" dz_BT.utf8 good Using LC_COLLATE = "el_CY.utf8" Using LC_CTYPE = "el_CY.utf8" el_CY.utf8 good Using LC_COLLATE = "el_GR.utf8" Using LC_CTYPE = "el_GR.utf8" el_GR.utf8 good Using LC_COLLATE = "en_AG.utf8" Using LC_CTYPE = "en_AG.utf8" en_AG.utf8 good Using LC_COLLATE = "en_AU.utf8" Using LC_CTYPE = "en_AU.utf8" en_AU.utf8 good Using LC_COLLATE = "en_BW.utf8" Using LC_CTYPE = "en_BW.utf8" en_BW.utf8 good Using LC_COLLATE = "en_CA.utf8" Using LC_CTYPE = "en_CA.utf8" en_CA.utf8 good Using LC_COLLATE = "en_DK.utf8" Using LC_CTYPE = "en_DK.utf8" en_DK.utf8 good Using LC_COLLATE = "en_GB.utf8" Using LC_CTYPE = "en_GB.utf8" en_GB.utf8 good Using LC_COLLATE = "en_HK.utf8" Using LC_CTYPE = "en_HK.utf8" en_HK.utf8 good Using LC_COLLATE = "en_IE.utf8" Using LC_CTYPE = "en_IE.utf8" en_IE.utf8 good Using LC_COLLATE = "en_IN.utf8" Using LC_CTYPE = "en_IN.utf8" en_IN.utf8 good Using LC_COLLATE = "en_NG.utf8" Using LC_CTYPE = "en_NG.utf8" en_NG.utf8 good Using LC_COLLATE = "en_NZ.utf8" Using LC_CTYPE = "en_NZ.utf8" en_NZ.utf8 good Using LC_COLLATE = "en_PH.utf8" Using LC_CTYPE = "en_PH.utf8" en_PH.utf8 good Using LC_COLLATE = "en_SG.utf8" Using LC_CTYPE = "en_SG.utf8" en_SG.utf8 good Using LC_COLLATE = "en_US.utf8" Using LC_CTYPE = "en_US.utf8" en_US.utf8 good Using LC_COLLATE = "en_ZA.utf8" Using LC_CTYPE = "en_ZA.utf8" en_ZA.utf8 good Using LC_COLLATE = "en_ZW.utf8" Using LC_CTYPE = "en_ZW.utf8" en_ZW.utf8 good Using LC_COLLATE = "es_AR.utf8" Using LC_CTYPE = "es_AR.utf8" es_AR.utf8 good Using LC_COLLATE = "es_BO.utf8" Using LC_CTYPE = "es_BO.utf8" es_BO.utf8 good Using LC_COLLATE = "es_CL.utf8" Using LC_CTYPE = "es_CL.utf8" es_CL.utf8 good Using LC_COLLATE = "es_CO.utf8" Using LC_CTYPE = "es_CO.utf8" es_CO.utf8 good Using LC_COLLATE = "es_CR.utf8" Using LC_CTYPE = "es_CR.utf8" es_CR.utf8 good Using LC_COLLATE = "es_DO.utf8" Using LC_CTYPE = "es_DO.utf8" es_DO.utf8 good Using LC_COLLATE = "es_EC.utf8" Using LC_CTYPE = "es_EC.utf8" es_EC.utf8 good Using LC_COLLATE = "es_ES.utf8" Using LC_CTYPE = "es_ES.utf8" es_ES.utf8 good Using LC_COLLATE = "es_GT.utf8" Using LC_CTYPE = "es_GT.utf8" es_GT.utf8 good Using LC_COLLATE = "es_HN.utf8" Using LC_CTYPE = "es_HN.utf8" es_HN.utf8 good Using LC_COLLATE = "es_MX.utf8" Using LC_CTYPE = "es_MX.utf8" es_MX.utf8 good Using LC_COLLATE = "es_NI.utf8" Using LC_CTYPE = "es_NI.utf8" es_NI.utf8 good Using LC_COLLATE = "es_PA.utf8" Using LC_CTYPE = "es_PA.utf8" es_PA.utf8 good Using LC_COLLATE = "es_PE.utf8" Using LC_CTYPE = "es_PE.utf8" es_PE.utf8 good Using LC_COLLATE = "es_PR.utf8" Using LC_CTYPE = "es_PR.utf8" es_PR.utf8 good Using LC_COLLATE = "es_PY.utf8" Using LC_CTYPE = "es_PY.utf8" es_PY.utf8 good Using LC_COLLATE = "es_SV.utf8" Using LC_CTYPE = "es_SV.utf8" es_SV.utf8 good Using LC_COLLATE = "es_US.utf8" Using LC_CTYPE = "es_US.utf8" inconsistency between strcoll (605) and strxfrm (603) orders inconsistency between strcoll (603) and strxfrm (604) orders inconsistency between strcoll (604) and strxfrm (605) orders es_US.utf8 BAD Using LC_COLLATE = "es_UY.utf8" Using LC_CTYPE = "es_UY.utf8" es_UY.utf8 good Using LC_COLLATE = "es_VE.utf8" Using LC_CTYPE = "es_VE.utf8" es_VE.utf8 good Using LC_COLLATE = "et_EE.utf8" Using LC_CTYPE = "et_EE.utf8" et_EE.utf8 good Using LC_COLLATE = "eu_ES.utf8" Using LC_CTYPE = "eu_ES.utf8" eu_ES.utf8 good Using LC_COLLATE = "fa_IR.utf8" Using LC_CTYPE = "fa_IR.utf8" fa_IR.utf8 good Using LC_COLLATE = "fi_FI.utf8" Using LC_CTYPE = "fi_FI.utf8" inconsistency between strcoll (699) and strxfrm (697) orders inconsistency between strcoll (697) and strxfrm (698) orders inconsistency between strcoll (698) and strxfrm (699) orders inconsistency between strcoll (883) and strxfrm (881) orders inconsistency between strcoll (881) and strxfrm (882) orders inconsistency between strcoll (882) and strxfrm (883) orders fi_FI.utf8 BAD Using LC_COLLATE = "fil_PH.utf8" Using LC_CTYPE = "fil_PH.utf8" inconsistency between strcoll (605) and strxfrm (603) orders inconsistency between strcoll (603) and strxfrm (604) orders inconsistency between strcoll (604) and strxfrm (605) orders fil_PH.utf8 BAD Using LC_COLLATE = "fo_FO.utf8" Using LC_CTYPE = "fo_FO.utf8" inconsistency between strcoll (892) and strxfrm (891) orders inconsistency between strcoll (891) and strxfrm (892) orders inconsistency between strcoll (945) and strxfrm (944) orders inconsistency between strcoll (944) and strxfrm (945) orders fo_FO.utf8 BAD Using LC_COLLATE = "fr_BE.utf8" Using LC_CTYPE = "fr_BE.utf8" fr_BE.utf8 good Using LC_COLLATE = "fr_CA.utf8" Using LC_CTYPE = "fr_CA.utf8" inconsistency between strcoll (220) and strxfrm (219) orders inconsistency between strcoll (219) and strxfrm (220) orders fr_CA.utf8 BAD Using LC_COLLATE = "fr_CH.utf8" Using LC_CTYPE = "fr_CH.utf8" fr_CH.utf8 good Using LC_COLLATE = "fr_FR.utf8" Using LC_CTYPE = "fr_FR.utf8" fr_FR.utf8 good Using LC_COLLATE = "fr_LU.utf8" Using LC_CTYPE = "fr_LU.utf8" fr_LU.utf8 good Using LC_COLLATE = "fur_IT.utf8" Using LC_CTYPE = "fur_IT.utf8" fur_IT.utf8 good Using LC_COLLATE = "fy_DE.utf8" Using LC_CTYPE = "fy_DE.utf8" fy_DE.utf8 good Using LC_COLLATE = "fy_NL.utf8" Using LC_CTYPE = "fy_NL.utf8" fy_NL.utf8 good Using LC_COLLATE = "ga_IE.utf8" Using LC_CTYPE = "ga_IE.utf8" ga_IE.utf8 good Using LC_COLLATE = "gd_GB.utf8" Using LC_CTYPE = "gd_GB.utf8" gd_GB.utf8 good Using LC_COLLATE = "gez_ER.utf8" Using LC_CTYPE = "gez_ER.utf8" gez_ER.utf8 good Using LC_COLLATE = "gez_ER.utf8@abegede" Using LC_CTYPE = "gez_ER.utf8@abegede" gez_ER.utf8@abegede good Using LC_COLLATE = "gez_ET.utf8" Using LC_CTYPE = "gez_ET.utf8" gez_ET.utf8 good Using LC_COLLATE = "gez_ET.utf8@abegede" Using LC_CTYPE = "gez_ET.utf8@abegede" gez_ET.utf8@abegede good Using LC_COLLATE = "gl_ES.utf8" Using LC_CTYPE = "gl_ES.utf8" gl_ES.utf8 good Using LC_COLLATE = "gu_IN.utf8" Using LC_CTYPE = "gu_IN.utf8" gu_IN.utf8 good Using LC_COLLATE = "gv_GB.utf8" Using LC_CTYPE = "gv_GB.utf8" gv_GB.utf8 good Using LC_COLLATE = "ha_NG.utf8" Using LC_CTYPE = "ha_NG.utf8" ha_NG.utf8 good Using LC_COLLATE = "he_IL.utf8" Using LC_CTYPE = "he_IL.utf8" he_IL.utf8 good Using LC_COLLATE = "hi_IN.utf8" Using LC_CTYPE = "hi_IN.utf8" hi_IN.utf8 good Using LC_COLLATE = "hne_IN.utf8" Using LC_CTYPE = "hne_IN.utf8" hne_IN.utf8 good Using LC_COLLATE = "hr_HR.utf8" Using LC_CTYPE = "hr_HR.utf8" hr_HR.utf8 good Using LC_COLLATE = "hsb_DE.utf8" Using LC_CTYPE = "hsb_DE.utf8" hsb_DE.utf8 good Using LC_COLLATE = "ht_HT.utf8" Using LC_CTYPE = "ht_HT.utf8" ht_HT.utf8 good Using LC_COLLATE = "hu_HU.utf8" Using LC_CTYPE = "hu_HU.utf8" hu_HU.utf8 good Using LC_COLLATE = "hy_AM.utf8" Using LC_CTYPE = "hy_AM.utf8" hy_AM.utf8 good Using LC_COLLATE = "id_ID.utf8" Using LC_CTYPE = "id_ID.utf8" id_ID.utf8 good Using LC_COLLATE = "ig_NG.utf8" Using LC_CTYPE = "ig_NG.utf8" inconsistency between strcoll (165) and strxfrm (164) orders inconsistency between strcoll (164) and strxfrm (165) orders inconsistency between strcoll (453) and strxfrm (452) orders inconsistency between strcoll (452) and strxfrm (453) orders inconsistency between strcoll (786) and strxfrm (785) orders inconsistency between strcoll (785) and strxfrm (786) orders ig_NG.utf8 BAD Using LC_COLLATE = "ik_CA.utf8" Using LC_CTYPE = "ik_CA.utf8" ik_CA.utf8 good Using LC_COLLATE = "is_IS.utf8" Using LC_CTYPE = "is_IS.utf8" is_IS.utf8 good Using LC_COLLATE = "it_CH.utf8" Using LC_CTYPE = "it_CH.utf8" it_CH.utf8 good Using LC_COLLATE = "it_IT.utf8" Using LC_CTYPE = "it_IT.utf8" it_IT.utf8 good Using LC_COLLATE = "iu_CA.utf8" Using LC_CTYPE = "iu_CA.utf8" iu_CA.utf8 good Using LC_COLLATE = "iw_IL.utf8" Using LC_CTYPE = "iw_IL.utf8" iw_IL.utf8 good Using LC_COLLATE = "ja_JP.utf8" Using LC_CTYPE = "ja_JP.utf8" ja_JP.utf8 good Using LC_COLLATE = "ka_GE.utf8" Using LC_CTYPE = "ka_GE.utf8" ka_GE.utf8 good Using LC_COLLATE = "kk_KZ.utf8" Using LC_CTYPE = "kk_KZ.utf8" kk_KZ.utf8 good Using LC_COLLATE = "kl_GL.utf8" Using LC_CTYPE = "kl_GL.utf8" inconsistency between strcoll (704) and strxfrm (703) orders inconsistency between strcoll (703) and strxfrm (704) orders inconsistency between strcoll (871) and strxfrm (870) orders inconsistency between strcoll (870) and strxfrm (871) orders inconsistency between strcoll (870) and strxfrm (871) orders inconsistency between strcoll (885) and strxfrm (884) orders inconsistency between strcoll (884) and strxfrm (885) orders inconsistency between strcoll (927) and strxfrm (926) orders inconsistency between strcoll (928) and strxfrm (927) orders inconsistency between strcoll (926) and strxfrm (928) orders kl_GL.utf8 BAD Using LC_COLLATE = "km_KH.utf8" Using LC_CTYPE = "km_KH.utf8" km_KH.utf8 good Using LC_COLLATE = "kn_IN.utf8" Using LC_CTYPE = "kn_IN.utf8" kn_IN.utf8 good Using LC_COLLATE = "ko_KR.utf8" Using LC_CTYPE = "ko_KR.utf8" ko_KR.utf8 good Using LC_COLLATE = "kok_IN.utf8" Using LC_CTYPE = "kok_IN.utf8" kok_IN.utf8 good Using LC_COLLATE = "ks_IN.utf8" Using LC_CTYPE = "ks_IN.utf8" ks_IN.utf8 good Using LC_COLLATE = "ks_IN.utf8@devanagari" Using LC_CTYPE = "ks_IN.utf8@devanagari" ks_IN.utf8@devanagari good Using LC_COLLATE = "ku_TR.utf8" Using LC_CTYPE = "ku_TR.utf8" inconsistency between strcoll (505) and strxfrm (504) orders inconsistency between strcoll (506) and strxfrm (505) orders inconsistency between strcoll (504) and strxfrm (506) orders ku_TR.utf8 BAD Using LC_COLLATE = "kw_GB.utf8" Using LC_CTYPE = "kw_GB.utf8" kw_GB.utf8 good Using LC_COLLATE = "ky_KG.utf8" Using LC_CTYPE = "ky_KG.utf8" ky_KG.utf8 good Using LC_COLLATE = "lg_UG.utf8" Using LC_CTYPE = "lg_UG.utf8" lg_UG.utf8 good Using LC_COLLATE = "li_BE.utf8" Using LC_CTYPE = "li_BE.utf8" li_BE.utf8 good Using LC_COLLATE = "li_NL.utf8" Using LC_CTYPE = "li_NL.utf8" li_NL.utf8 good Using LC_COLLATE = "lo_LA.utf8" Using LC_CTYPE = "lo_LA.utf8" lo_LA.utf8 good Using LC_COLLATE = "lt_LT.utf8" Using LC_CTYPE = "lt_LT.utf8" lt_LT.utf8 good Using LC_COLLATE = "lv_LV.utf8" Using LC_CTYPE = "lv_LV.utf8" lv_LV.utf8 good Using LC_COLLATE = "mai_IN.utf8" Using LC_CTYPE = "mai_IN.utf8" mai_IN.utf8 good Using LC_COLLATE = "mg_MG.utf8" Using LC_CTYPE = "mg_MG.utf8" mg_MG.utf8 good Using LC_COLLATE = "mi_NZ.utf8" Using LC_CTYPE = "mi_NZ.utf8" mi_NZ.utf8 good Using LC_COLLATE = "mk_MK.utf8" Using LC_CTYPE = "mk_MK.utf8" mk_MK.utf8 good Using LC_COLLATE = "ml_IN.utf8" Using LC_CTYPE = "ml_IN.utf8" ml_IN.utf8 good Using LC_COLLATE = "mn_MN.utf8" Using LC_CTYPE = "mn_MN.utf8" mn_MN.utf8 good Using LC_COLLATE = "mr_IN.utf8" Using LC_CTYPE = "mr_IN.utf8" mr_IN.utf8 good Using LC_COLLATE = "ms_MY.utf8" Using LC_CTYPE = "ms_MY.utf8" ms_MY.utf8 good Using LC_COLLATE = "mt_MT.utf8" Using LC_CTYPE = "mt_MT.utf8" mt_MT.utf8 good Using LC_COLLATE = "my_MM.utf8" Using LC_CTYPE = "my_MM.utf8" my_MM.utf8 good Using LC_COLLATE = "nan_TW.utf8@latin" Using LC_CTYPE = "nan_TW.utf8@latin" nan_TW.utf8@latin good Using LC_COLLATE = "nb_NO.utf8" Using LC_CTYPE = "nb_NO.utf8" inconsistency between strcoll (295) and strxfrm (294) orders inconsistency between strcoll (294) and strxfrm (295) orders nb_NO.utf8 BAD Using LC_COLLATE = "nds_DE.utf8" Using LC_CTYPE = "nds_DE.utf8" nds_DE.utf8 good Using LC_COLLATE = "nds_NL.utf8" Using LC_CTYPE = "nds_NL.utf8" nds_NL.utf8 good Using LC_COLLATE = "ne_NP.utf8" Using LC_CTYPE = "ne_NP.utf8" ne_NP.utf8 good Using LC_COLLATE = "nl_AW.utf8" Using LC_CTYPE = "nl_AW.utf8" nl_AW.utf8 good Using LC_COLLATE = "nl_BE.utf8" Using LC_CTYPE = "nl_BE.utf8" nl_BE.utf8 good Using LC_COLLATE = "nl_NL.utf8" Using LC_CTYPE = "nl_NL.utf8" nl_NL.utf8 good Using LC_COLLATE = "nn_NO.utf8" Using LC_CTYPE = "nn_NO.utf8" inconsistency between strcoll (295) and strxfrm (294) orders inconsistency between strcoll (294) and strxfrm (295) orders nn_NO.utf8 BAD Using LC_COLLATE = "no_NO.utf8" Using LC_CTYPE = "no_NO.utf8" inconsistency between strcoll (295) and strxfrm (294) orders inconsistency between strcoll (294) and strxfrm (295) orders no_NO.utf8 BAD Using LC_COLLATE = "nr_ZA.utf8" Using LC_CTYPE = "nr_ZA.utf8" nr_ZA.utf8 good Using LC_COLLATE = "nso_ZA.utf8" Using LC_CTYPE = "nso_ZA.utf8" nso_ZA.utf8 good Using LC_COLLATE = "oc_FR.utf8" Using LC_CTYPE = "oc_FR.utf8" oc_FR.utf8 good Using LC_COLLATE = "om_ET.utf8" Using LC_CTYPE = "om_ET.utf8" om_ET.utf8 good Using LC_COLLATE = "om_KE.utf8" Using LC_CTYPE = "om_KE.utf8" om_KE.utf8 good Using LC_COLLATE = "or_IN.utf8" Using LC_CTYPE = "or_IN.utf8" or_IN.utf8 good Using LC_COLLATE = "pa_IN.utf8" Using LC_CTYPE = "pa_IN.utf8" pa_IN.utf8 good Using LC_COLLATE = "pa_PK.utf8" Using LC_CTYPE = "pa_PK.utf8" pa_PK.utf8 good Using LC_COLLATE = "pap_AN.utf8" Using LC_CTYPE = "pap_AN.utf8" pap_AN.utf8 good Using LC_COLLATE = "pl_PL.utf8" Using LC_CTYPE = "pl_PL.utf8" pl_PL.utf8 good Using LC_COLLATE = "ps_AF.utf8" Using LC_CTYPE = "ps_AF.utf8" ps_AF.utf8 good Using LC_COLLATE = "pt_BR.utf8" Using LC_CTYPE = "pt_BR.utf8" pt_BR.utf8 good Using LC_COLLATE = "pt_PT.utf8" Using LC_CTYPE = "pt_PT.utf8" pt_PT.utf8 good Using LC_COLLATE = "ro_RO.utf8" Using LC_CTYPE = "ro_RO.utf8" inconsistency between strcoll (502) and strxfrm (501) orders inconsistency between strcoll (503) and strxfrm (502) orders inconsistency between strcoll (501) and strxfrm (503) orders ro_RO.utf8 BAD Using LC_COLLATE = "ru_RU.utf8" Using LC_CTYPE = "ru_RU.utf8" ru_RU.utf8 good Using LC_COLLATE = "ru_UA.utf8" Using LC_CTYPE = "ru_UA.utf8" ru_UA.utf8 good Using LC_COLLATE = "rw_RW.utf8" Using LC_CTYPE = "rw_RW.utf8" rw_RW.utf8 good Using LC_COLLATE = "sa_IN.utf8" Using LC_CTYPE = "sa_IN.utf8" sa_IN.utf8 good Using LC_COLLATE = "sc_IT.utf8" Using LC_CTYPE = "sc_IT.utf8" sc_IT.utf8 good Using LC_COLLATE = "sd_IN.utf8" Using LC_CTYPE = "sd_IN.utf8" sd_IN.utf8 good Using LC_COLLATE = "sd_IN.utf8@devanagari" Using LC_CTYPE = "sd_IN.utf8@devanagari" sd_IN.utf8@devanagari good Using LC_COLLATE = "se_NO.utf8" Using LC_CTYPE = "se_NO.utf8" inconsistency between strcoll (196) and strxfrm (194) orders inconsistency between strcoll (197) and strxfrm (195) orders inconsistency between strcoll (194) and strxfrm (196) orders inconsistency between strcoll (195) and strxfrm (197) orders inconsistency between strcoll (894) and strxfrm (892) orders inconsistency between strcoll (892) and strxfrm (893) orders inconsistency between strcoll (892) and strxfrm (893) orders inconsistency between strcoll (893) and strxfrm (894) orders inconsistency between strcoll (911) and strxfrm (909) orders inconsistency between strcoll (909) and strxfrm (910) orders inconsistency between strcoll (910) and strxfrm (911) orders inconsistency between strcoll (934) and strxfrm (933) orders inconsistency between strcoll (933) and strxfrm (934) orders se_NO.utf8 BAD Using LC_COLLATE = "shs_CA.utf8" Using LC_CTYPE = "shs_CA.utf8" inconsistency between strcoll (944) and strxfrm (942) orders inconsistency between strcoll (942) and strxfrm (943) orders inconsistency between strcoll (942) and strxfrm (943) orders inconsistency between strcoll (943) and strxfrm (944) orders shs_CA.utf8 BAD Using LC_COLLATE = "si_LK.utf8" Using LC_CTYPE = "si_LK.utf8" si_LK.utf8 good Using LC_COLLATE = "sid_ET.utf8" Using LC_CTYPE = "sid_ET.utf8" sid_ET.utf8 good Using LC_COLLATE = "sk_SK.utf8" Using LC_CTYPE = "sk_SK.utf8" sk_SK.utf8 good Using LC_COLLATE = "sl_SI.utf8" Using LC_CTYPE = "sl_SI.utf8" sl_SI.utf8 good Using LC_COLLATE = "so_DJ.utf8" Using LC_CTYPE = "so_DJ.utf8" so_DJ.utf8 good Using LC_COLLATE = "so_ET.utf8" Using LC_CTYPE = "so_ET.utf8" so_ET.utf8 good Using LC_COLLATE = "so_KE.utf8" Using LC_CTYPE = "so_KE.utf8" so_KE.utf8 good Using LC_COLLATE = "so_SO.utf8" Using LC_CTYPE = "so_SO.utf8" so_SO.utf8 good Using LC_COLLATE = "sq_AL.utf8" Using LC_CTYPE = "sq_AL.utf8" inconsistency between strcoll (286) and strxfrm (285) orders inconsistency between strcoll (285) and strxfrm (286) orders sq_AL.utf8 BAD Using LC_COLLATE = "sq_MK.utf8" Using LC_CTYPE = "sq_MK.utf8" inconsistency between strcoll (286) and strxfrm (285) orders inconsistency between strcoll (285) and strxfrm (286) orders sq_MK.utf8 BAD Using LC_COLLATE = "sr_ME.utf8" Using LC_CTYPE = "sr_ME.utf8" sr_ME.utf8 good Using LC_COLLATE = "sr_RS.utf8" Using LC_CTYPE = "sr_RS.utf8" sr_RS.utf8 good Using LC_COLLATE = "sr_RS.utf8@latin" Using LC_CTYPE = "sr_RS.utf8@latin" sr_RS.utf8@latin good Using LC_COLLATE = "ss_ZA.utf8" Using LC_CTYPE = "ss_ZA.utf8" ss_ZA.utf8 good Using LC_COLLATE = "st_ZA.utf8" Using LC_CTYPE = "st_ZA.utf8" st_ZA.utf8 good Using LC_COLLATE = "sv_FI.utf8" Using LC_CTYPE = "sv_FI.utf8" inconsistency between strcoll (898) and strxfrm (897) orders inconsistency between strcoll (897) and strxfrm (898) orders sv_FI.utf8 BAD Using LC_COLLATE = "sv_SE.utf8" Using LC_CTYPE = "sv_SE.utf8" inconsistency between strcoll (788) and strxfrm (785) orders inconsistency between strcoll (785) and strxfrm (786) orders inconsistency between strcoll (786) and strxfrm (787) orders inconsistency between strcoll (787) and strxfrm (788) orders inconsistency between strcoll (837) and strxfrm (836) orders inconsistency between strcoll (836) and strxfrm (837) orders inconsistency between strcoll (903) and strxfrm (902) orders inconsistency between strcoll (902) and strxfrm (903) orders sv_SE.utf8 BAD Using LC_COLLATE = "ta_IN.utf8" Using LC_CTYPE = "ta_IN.utf8" ta_IN.utf8 good Using LC_COLLATE = "te_IN.utf8" Using LC_CTYPE = "te_IN.utf8" te_IN.utf8 good Using LC_COLLATE = "tg_TJ.utf8" Using LC_CTYPE = "tg_TJ.utf8" tg_TJ.utf8 good Using LC_COLLATE = "th_TH.utf8" Using LC_CTYPE = "th_TH.utf8" th_TH.utf8 good Using LC_COLLATE = "ti_ER.utf8" Using LC_CTYPE = "ti_ER.utf8" ti_ER.utf8 good Using LC_COLLATE = "ti_ET.utf8" Using LC_CTYPE = "ti_ET.utf8" ti_ET.utf8 good Using LC_COLLATE = "tig_ER.utf8" Using LC_CTYPE = "tig_ER.utf8" tig_ER.utf8 good Using LC_COLLATE = "tk_TM.utf8" Using LC_CTYPE = "tk_TM.utf8" inconsistency between strcoll (383) and strxfrm (382) orders inconsistency between strcoll (384) and strxfrm (383) orders inconsistency between strcoll (382) and strxfrm (384) orders inconsistency between strcoll (700) and strxfrm (699) orders inconsistency between strcoll (699) and strxfrm (700) orders inconsistency between strcoll (858) and strxfrm (857) orders inconsistency between strcoll (857) and strxfrm (858) orders tk_TM.utf8 BAD Using LC_COLLATE = "tl_PH.utf8" Using LC_CTYPE = "tl_PH.utf8" tl_PH.utf8 good Using LC_COLLATE = "tn_ZA.utf8" Using LC_CTYPE = "tn_ZA.utf8" tn_ZA.utf8 good Using LC_COLLATE = "tr_CY.utf8" Using LC_CTYPE = "tr_CY.utf8" tr_CY.utf8 good Using LC_COLLATE = "tr_TR.utf8" Using LC_CTYPE = "tr_TR.utf8" tr_TR.utf8 good Using LC_COLLATE = "ts_ZA.utf8" Using LC_CTYPE = "ts_ZA.utf8" ts_ZA.utf8 good Using LC_COLLATE = "tt_RU.utf8" Using LC_CTYPE = "tt_RU.utf8" inconsistency between strcoll (248) and strxfrm (247) orders inconsistency between strcoll (249) and strxfrm (248) orders inconsistency between strcoll (247) and strxfrm (249) orders inconsistency between strcoll (431) and strxfrm (430) orders inconsistency between strcoll (432) and strxfrm (431) orders inconsistency between strcoll (430) and strxfrm (432) orders inconsistency between strcoll (714) and strxfrm (713) orders inconsistency between strcoll (713) and strxfrm (714) orders tt_RU.utf8 BAD Using LC_COLLATE = "tt_RU.utf8@iqtelif" Using LC_CTYPE = "tt_RU.utf8@iqtelif" inconsistency between strcoll (431) and strxfrm (430) orders inconsistency between strcoll (432) and strxfrm (431) orders inconsistency between strcoll (430) and strxfrm (432) orders inconsistency between strcoll (700) and strxfrm (699) orders inconsistency between strcoll (699) and strxfrm (700) orders tt_RU.utf8@iqtelif BAD Using LC_COLLATE = "ug_CN.utf8" Using LC_CTYPE = "ug_CN.utf8" inconsistency between strcoll (248) and strxfrm (247) orders inconsistency between strcoll (249) and strxfrm (248) orders inconsistency between strcoll (247) and strxfrm (249) orders inconsistency between strcoll (700) and strxfrm (699) orders inconsistency between strcoll (699) and strxfrm (700) orders ug_CN.utf8 BAD Using LC_COLLATE = "uk_UA.utf8" Using LC_CTYPE = "uk_UA.utf8" uk_UA.utf8 good Using LC_COLLATE = "ur_PK.utf8" Using LC_CTYPE = "ur_PK.utf8" ur_PK.utf8 good Using LC_COLLATE = "uz_UZ.utf8@cyrillic" Using LC_CTYPE = "uz_UZ.utf8@cyrillic" uz_UZ.utf8@cyrillic good Using LC_COLLATE = "ve_ZA.utf8" Using LC_CTYPE = "ve_ZA.utf8" ve_ZA.utf8 good Using LC_COLLATE = "vi_VN.utf8" Using LC_CTYPE = "vi_VN.utf8" inconsistency between strcoll (379) and strxfrm (378) orders inconsistency between strcoll (380) and strxfrm (379) orders inconsistency between strcoll (378) and strxfrm (380) orders vi_VN.utf8 BAD Using LC_COLLATE = "wa_BE.utf8" Using LC_CTYPE = "wa_BE.utf8" wa_BE.utf8 good Using LC_COLLATE = "wo_SN.utf8" Using LC_CTYPE = "wo_SN.utf8" wo_SN.utf8 good Using LC_COLLATE = "xh_ZA.utf8" Using LC_CTYPE = "xh_ZA.utf8" xh_ZA.utf8 good Using LC_COLLATE = "yi_US.utf8" Using LC_CTYPE = "yi_US.utf8" yi_US.utf8 good Using LC_COLLATE = "yo_NG.utf8" Using LC_CTYPE = "yo_NG.utf8" inconsistency between strcoll (347) and strxfrm (346) orders inconsistency between strcoll (348) and strxfrm (347) orders inconsistency between strcoll (346) and strxfrm (348) orders inconsistency between strcoll (793) and strxfrm (791) orders inconsistency between strcoll (791) and strxfrm (792) orders inconsistency between strcoll (792) and strxfrm (793) orders inconsistency between strcoll (795) and strxfrm (794) orders inconsistency between strcoll (794) and strxfrm (795) orders yo_NG.utf8 BAD Using LC_COLLATE = "zh_CN.utf8" Using LC_CTYPE = "zh_CN.utf8" zh_CN.utf8 good Using LC_COLLATE = "zh_HK.utf8" Using LC_CTYPE = "zh_HK.utf8" zh_HK.utf8 good Using LC_COLLATE = "zh_SG.utf8" Using LC_CTYPE = "zh_SG.utf8" zh_SG.utf8 good Using LC_COLLATE = "zh_TW.utf8" Using LC_CTYPE = "zh_TW.utf8" zh_TW.utf8 good Using LC_COLLATE = "zu_ZA.utf8" Using LC_CTYPE = "zu_ZA.utf8" zu_ZA.utf8 good
pgsql-bugs by date: