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:

Previous
From: Robert Haas
Date:
Subject: Re: Missing rows with index scan when collation is not "C" (PostgreSQL 9.5)
Next
From: Tom Lane
Date:
Subject: Re: Missing rows with index scan when collation is not "C" (PostgreSQL 9.5)