|
8 | 8 | *
|
9 | 9 | *
|
10 | 10 | * IDENTIFICATION
|
11 |
| - * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.92 2002/09/04 20:31:29 momjian Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/utils/adt/varlena.c,v 1.93 2002/11/17 23:01:30 tgl Exp $ |
12 | 12 | *
|
13 | 13 | *-------------------------------------------------------------------------
|
14 | 14 | */
|
@@ -736,36 +736,47 @@ int
|
736 | 736 | varstr_cmp(char *arg1, int len1, char *arg2, int len2)
|
737 | 737 | {
|
738 | 738 | int result;
|
739 |
| - char *a1p, |
740 |
| - *a2p; |
741 | 739 |
|
742 | 740 | /*
|
743 | 741 | * Unfortunately, there is no strncoll(), so in the non-C locale case
|
744 | 742 | * we have to do some memory copying. This turns out to be
|
745 | 743 | * significantly slower, so we optimize the case where LC_COLLATE is
|
746 |
| - * C. |
| 744 | + * C. We also try to optimize relatively-short strings by avoiding |
| 745 | + * palloc/pfree overhead. |
747 | 746 | */
|
| 747 | +#define STACKBUFLEN 1024 |
| 748 | + |
748 | 749 | if (!lc_collate_is_c())
|
749 | 750 | {
|
750 |
| - a1p = (char *) palloc(len1 + 1); |
751 |
| - a2p = (char *) palloc(len2 + 1); |
| 751 | + char a1buf[STACKBUFLEN]; |
| 752 | + char a2buf[STACKBUFLEN]; |
| 753 | + char *a1p, |
| 754 | + *a2p; |
| 755 | + |
| 756 | + if (len1 >= STACKBUFLEN) |
| 757 | + a1p = (char *) palloc(len1 + 1); |
| 758 | + else |
| 759 | + a1p = a1buf; |
| 760 | + if (len2 >= STACKBUFLEN) |
| 761 | + a2p = (char *) palloc(len2 + 1); |
| 762 | + else |
| 763 | + a2p = a2buf; |
752 | 764 |
|
753 | 765 | memcpy(a1p, arg1, len1);
|
754 |
| - *(a1p + len1) = '\0'; |
| 766 | + a1p[len1] = '\0'; |
755 | 767 | memcpy(a2p, arg2, len2);
|
756 |
| - *(a2p + len2) = '\0'; |
| 768 | + a2p[len2] = '\0'; |
757 | 769 |
|
758 | 770 | result = strcoll(a1p, a2p);
|
759 | 771 |
|
760 |
| - pfree(a1p); |
761 |
| - pfree(a2p); |
| 772 | + if (len1 >= STACKBUFLEN) |
| 773 | + pfree(a1p); |
| 774 | + if (len2 >= STACKBUFLEN) |
| 775 | + pfree(a2p); |
762 | 776 | }
|
763 | 777 | else
|
764 | 778 | {
|
765 |
| - a1p = arg1; |
766 |
| - a2p = arg2; |
767 |
| - |
768 |
| - result = strncmp(a1p, a2p, Min(len1, len2)); |
| 779 | + result = strncmp(arg1, arg2, Min(len1, len2)); |
769 | 780 | if ((result == 0) && (len1 != len2))
|
770 | 781 | result = (len1 < len2) ? -1 : 1;
|
771 | 782 | }
|
|
0 commit comments