diff options
author | Robert Haas <rhaas@postgresql.org> | 2010-12-21 22:11:40 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2010-12-21 22:11:40 -0500 |
commit | 32ba2b516066688ff56e6d62a7ff4a01c88f5700 (patch) | |
tree | d92587bec7ec83167b11d71afd204fa72d1f6f80 /src/backend/utils/adt | |
parent | c5160b7eecf97a357375960b02a30317474334a3 (diff) | |
download | postgresql-32ba2b516066688ff56e6d62a7ff4a01c88f5700.tar.gz postgresql-32ba2b516066688ff56e6d62a7ff4a01c88f5700.zip |
Use memcmp() rather than strncmp() when shorter string length is known.
It appears that this will be faster for all but the shortest strings;
at least one some platforms, memcmp() can use word-at-a-time comparisons.
Noah Misch, somewhat pared down.
Diffstat (limited to 'src/backend/utils/adt')
-rw-r--r-- | src/backend/utils/adt/varchar.c | 6 | ||||
-rw-r--r-- | src/backend/utils/adt/varlena.c | 14 |
2 files changed, 10 insertions, 10 deletions
diff --git a/src/backend/utils/adt/varchar.c b/src/backend/utils/adt/varchar.c index 34acfb36180..b3d7ba3f403 100644 --- a/src/backend/utils/adt/varchar.c +++ b/src/backend/utils/adt/varchar.c @@ -690,7 +690,7 @@ bpchareq(PG_FUNCTION_ARGS) if (len1 != len2) result = false; else - result = (strncmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) == 0); + result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) == 0); PG_FREE_IF_COPY(arg1, 0); PG_FREE_IF_COPY(arg2, 1); @@ -717,7 +717,7 @@ bpcharne(PG_FUNCTION_ARGS) if (len1 != len2) result = true; else - result = (strncmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) != 0); + result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) != 0); PG_FREE_IF_COPY(arg1, 0); PG_FREE_IF_COPY(arg2, 1); @@ -905,7 +905,7 @@ internal_bpchar_pattern_compare(BpChar *arg1, BpChar *arg2) len1 = bcTruelen(arg1); len2 = bcTruelen(arg2); - result = strncmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2)); + result = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2)); if (result != 0) return result; else if (len1 < len2) diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index ee83e2f3088..2fa740ac8c0 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -1286,7 +1286,7 @@ varstr_cmp(char *arg1, int len1, char *arg2, int len2) */ if (lc_collate_is_c()) { - result = strncmp(arg1, arg2, Min(len1, len2)); + result = memcmp(arg1, arg2, Min(len1, len2)); if ((result == 0) && (len1 != len2)) result = (len1 < len2) ? -1 : 1; } @@ -1370,7 +1370,7 @@ varstr_cmp(char *arg1, int len1, char *arg2, int len2) */ if (result == 0) { - result = strncmp(arg1, arg2, Min(len1, len2)); + result = memcmp(arg1, arg2, Min(len1, len2)); if ((result == 0) && (len1 != len2)) result = (len1 < len2) ? -1 : 1; } @@ -1462,8 +1462,8 @@ texteq(PG_FUNCTION_ARGS) if (VARSIZE_ANY_EXHDR(arg1) != VARSIZE_ANY_EXHDR(arg2)) result = false; else - result = (strncmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), - VARSIZE_ANY_EXHDR(arg1)) == 0); + result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), + VARSIZE_ANY_EXHDR(arg1)) == 0); PG_FREE_IF_COPY(arg1, 0); PG_FREE_IF_COPY(arg2, 1); @@ -1485,8 +1485,8 @@ textne(PG_FUNCTION_ARGS) if (VARSIZE_ANY_EXHDR(arg1) != VARSIZE_ANY_EXHDR(arg2)) result = true; else - result = (strncmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), - VARSIZE_ANY_EXHDR(arg1)) != 0); + result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), + VARSIZE_ANY_EXHDR(arg1)) != 0); PG_FREE_IF_COPY(arg1, 0); PG_FREE_IF_COPY(arg2, 1); @@ -1612,7 +1612,7 @@ internal_text_pattern_compare(text *arg1, text *arg2) len1 = VARSIZE_ANY_EXHDR(arg1); len2 = VARSIZE_ANY_EXHDR(arg2); - result = strncmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2)); + result = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2)); if (result != 0) return result; else if (len1 < len2) |