|
15 | 15 | * |
16 | 16 | * |
17 | 17 | * IDENTIFICATION |
18 | | - * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.139 2003/05/28 16:03:59 tgl Exp $ |
| 18 | + * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.140 2003/07/17 20:52:36 tgl Exp $ |
19 | 19 | * |
20 | 20 | *------------------------------------------------------------------------- |
21 | 21 | */ |
@@ -2651,9 +2651,6 @@ static unsigned char * |
2651 | 2651 | convert_string_datum(Datumvalue,Oidtypid) |
2652 | 2652 | { |
2653 | 2653 | char*val; |
2654 | | -char*xfrmstr; |
2655 | | -size_txfrmsize; |
2656 | | -size_txfrmlen; |
2657 | 2654 |
|
2658 | 2655 | switch (typid) |
2659 | 2656 | { |
@@ -2693,17 +2690,21 @@ convert_string_datum(Datum value, Oid typid) |
2693 | 2690 |
|
2694 | 2691 | if (!lc_collate_is_c()) |
2695 | 2692 | { |
2696 | | -/* Guess that transformed string is not much bigger than original */ |
2697 | | -xfrmsize=strlen(val)+32;/* arbitrary pad value here... */ |
2698 | | -xfrmstr= (char*)palloc(xfrmsize); |
2699 | | -xfrmlen=strxfrm(xfrmstr,val,xfrmsize); |
2700 | | -if (xfrmlen >=xfrmsize) |
2701 | | -{ |
2702 | | -/* Oops, didn't make it */ |
2703 | | -pfree(xfrmstr); |
2704 | | -xfrmstr= (char*)palloc(xfrmlen+1); |
2705 | | -xfrmlen=strxfrm(xfrmstr,val,xfrmlen+1); |
2706 | | -} |
| 2693 | +char*xfrmstr; |
| 2694 | +size_txfrmlen; |
| 2695 | +size_txfrmlen2; |
| 2696 | + |
| 2697 | +/* |
| 2698 | + * Note: originally we guessed at a suitable output buffer size, |
| 2699 | + * and only needed to call strxfrm twice if our guess was too small. |
| 2700 | + * However, it seems that some versions of Solaris have buggy |
| 2701 | + * strxfrm that can write past the specified buffer length in that |
| 2702 | + * scenario. So, do it the dumb way for portability. |
| 2703 | + */ |
| 2704 | +xfrmlen=strxfrm(NULL,val,0); |
| 2705 | +xfrmstr= (char*)palloc(xfrmlen+1); |
| 2706 | +xfrmlen2=strxfrm(xfrmstr,val,xfrmlen+1); |
| 2707 | +Assert(xfrmlen2==xfrmlen); |
2707 | 2708 | pfree(val); |
2708 | 2709 | val=xfrmstr; |
2709 | 2710 | } |
|