aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2010-12-21 22:11:40 -0500
committerRobert Haas <rhaas@postgresql.org>2010-12-21 22:11:40 -0500
commit32ba2b516066688ff56e6d62a7ff4a01c88f5700 (patch)
treed92587bec7ec83167b11d71afd204fa72d1f6f80 /src/backend/utils/adt
parentc5160b7eecf97a357375960b02a30317474334a3 (diff)
downloadpostgresql-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.c6
-rw-r--r--src/backend/utils/adt/varlena.c14
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)