|
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(Datum value, Oid typid)
|
2652 | 2652 | {
|
2653 | 2653 | char *val;
|
2654 |
| - char *xfrmstr; |
2655 |
| - size_t xfrmsize; |
2656 |
| - size_t xfrmlen; |
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_t xfrmlen; |
| 2695 | + size_t xfrmlen2; |
| 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 | }
|
|
0 commit comments