Patch (was: tough locale bug) - Mailing list pgsql-hackers
From | Goran Thyni |
---|---|
Subject | Patch (was: tough locale bug) |
Date | |
Msg-id | 36B47C47.86D4CCAC@kirra.net Whole thread Raw |
In response to | Re: [HACKERS] Postgres Speed or lack thereof (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: [HACKERS] Patch (was: tough locale bug)
Re: [HACKERS] Patch (was: tough locale bug) |
List | pgsql-hackers |
Goran Thyni wrote: > 3. text_lt('G','G\0xFF') this is not correct! > > Case 3 work not work with strcoll(), in varstr_cmp(). > If I change it to strcoll() to strncmp() it works as expected, > but it probably breaks sorting etc big time. Here is a hack which solves the problem without breaking sorting AFAIK. I have read a lot of code, but has not found any cleaner way to fix this. A cleaner solution would be to find the highest char in locale charset but I found no portable way to do that, any pointers appriciated. It is not a beauty but it works. Please apply to -current since it fixes the bug, unless someone has a better suggestion. best regards, -- ----------------- Göran Thyni This is Penguin Country. On a quiet night you can hear Windows NT reboot!diff -cr cvs/pgsql/src/backend/utils/adt/varlena.c cvswork/pgsql/src/backend/utils/adt/varlena.c *** cvs/pgsql/src/backend/utils/adt/varlena.c Mon Dec 14 07:01:37 1998 --- cvswork/pgsql/src/backend/utils/adt/varlena.c Sun Jan 31 16:32:52 1999 *************** *** 496,528 **** varstr_cmp(char *arg1, int len1, char *arg2, int len2) { int result; ! char *a1p, ! *a2p; ! #ifdef USE_LOCALE ! a1p = (unsigned char *) palloc(len1 + 1); ! a2p = (unsigned char *) palloc(len2 + 1); ! ! memcpy(a1p, arg1, len1); ! *(a1p + len1) = '\0'; ! memcpy(a2p, arg2, len2); ! *(a2p + len2) = '\0'; ! ! result = strcoll(a1p, a2p); ! ! pfree(a1p); ! pfree(a2p); ! ! #else ! ! a1p = arg1; ! a2p = arg2; ! ! result = strncmp(a1p, a2p, Min(len1, len2)); ! if ((result == 0) && (len1 != len2)) ! result = (len1 < len2) ? -1 : 1; #endif ! return result; } /* varstr_cmp() */ --- 496,524 ---- varstr_cmp(char *arg1, int len1, char *arg2, int len2) { int result; ! char *a1p, *a2p; #ifdef USE_LOCALE ! if ((int)arg2[len2 - 1] != -1) ! { ! a1p = (unsigned char *) palloc(len1 + 1); ! a2p = (unsigned char *) palloc(len2 + 1); ! memcpy(a1p, arg1, len1); ! *(a1p + len1) = '\0'; ! memcpy(a2p, arg2, len2); ! *(a2p + len2) = '\0'; ! result = strcoll(a1p, a2p); ! pfree(a1p); ! pfree(a2p); ! } ! else #endif ! { ! a1p = arg1; ! a2p = arg2; ! result = strncmp(a1p, a2p, Min(len1, len2)); ! if ((result == 0) && (len1 != len2)) ! result = (len1 < len2) ? -1 : 1; ! } return result; } /* varstr_cmp() */
pgsql-hackers by date: