Re: [HACKERS] Patch (was: tough locale bug) - Mailing list pgsql-hackers
| From | Bruce Momjian |
|---|---|
| Subject | Re: [HACKERS] Patch (was: tough locale bug) |
| Date | |
| Msg-id | 199903151444.JAA12654@candle.pha.pa.us Whole thread Raw |
| In response to | Patch (was: tough locale bug) (Goran Thyni <goran@kirra.net>) |
| List | pgsql-hackers |
As I remember, this was fixed already, without your patch, right?
[Charset iso-8859-1 unsupported, filtering to ASCII...]
> 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() */
>
-- Bruce Momjian | http://www.op.net/~candle maillist@candle.pha.pa.us | (610)
853-3000+ If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill,
Pennsylvania19026
pgsql-hackers by date: