strncmp-memcmp.patch

text/plain

Filename: strncmp-memcmp.patch
Type: text/plain
Part: 0
Message: strncmp->memcmp when we know the shorter length

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
contrib/hstore/hstore_io.c 4 0
contrib/hstore/hstore_op.c 13 0
contrib/ltree/lquery_op.c 1 0
contrib/ltree/ltree_gist.c 1 0
contrib/ltree/ltree_op.c 4 0
contrib/ltree/ltxtquery_op.c 1 0
src/backend/nodes/readfuncs.c 1 0
src/backend/tsearch/spell.c 1 0
src/backend/tsearch/to_tsany.c 1 0
src/backend/tsearch/ts_selfuncs.c 3 0
src/backend/tsearch/ts_typanalyze.c 1 0
src/backend/utils/adt/varchar.c 3 0
src/backend/utils/adt/varlena.c 7 0
*** a/contrib/hstore/hstore_io.c
--- b/contrib/hstore/hstore_io.c
***************
*** 280,288 **** comparePairs(const void *a, const void *b)
  {
  	if (((Pairs *) a)->keylen == ((Pairs *) b)->keylen)
  	{
! 		int			res = strncmp(((Pairs *) a)->key,
! 								  ((Pairs *) b)->key,
! 								  ((Pairs *) a)->keylen);
  
  		if (res)
  			return res;
--- 280,288 ----
  {
  	if (((Pairs *) a)->keylen == ((Pairs *) b)->keylen)
  	{
! 		int			res = memcmp(((Pairs *) a)->key,
! 								 ((Pairs *) b)->key,
! 								 ((Pairs *) a)->keylen);
  
  		if (res)
  			return res;
***************
*** 324,330 **** hstoreUniquePairs(Pairs *a, int4 l, int4 *buflen)
  	while (ptr - a < l)
  	{
  		if (ptr->keylen == res->keylen &&
! 			strncmp(ptr->key, res->key, res->keylen) == 0)
  		{
  			if (ptr->needfree)
  			{
--- 324,330 ----
  	while (ptr - a < l)
  	{
  		if (ptr->keylen == res->keylen &&
! 			memcmp(ptr->key, res->key, res->keylen) == 0)
  		{
  			if (ptr->needfree)
  			{
*** a/contrib/hstore/hstore_op.c
--- b/contrib/hstore/hstore_op.c
***************
*** 49,55 **** hstoreFindKey(HStore *hs, int *lowbound, char *key, int keylen)
  		stopMiddle = stopLow + (stopHigh - stopLow) / 2;
  
  		if (HS_KEYLEN(entries, stopMiddle) == keylen)
! 			difference = strncmp(HS_KEY(entries, base, stopMiddle), key, keylen);
  		else
  			difference = (HS_KEYLEN(entries, stopMiddle) > keylen) ? 1 : -1;
  
--- 49,55 ----
  		stopMiddle = stopLow + (stopHigh - stopLow) / 2;
  
  		if (HS_KEYLEN(entries, stopMiddle) == keylen)
! 			difference = memcmp(HS_KEY(entries, base, stopMiddle), key, keylen);
  		else
  			difference = (HS_KEYLEN(entries, stopMiddle) > keylen) ? 1 : -1;
  
***************
*** 263,269 **** hstore_delete(PG_FUNCTION_ARGS)
  		int			len = HS_KEYLEN(es, i);
  		char	   *ptrs = HS_KEY(es, bufs, i);
  
! 		if (!(len == keylen && strncmp(ptrs, keyptr, keylen) == 0))
  		{
  			int			vallen = HS_VALLEN(es, i);
  
--- 263,269 ----
  		int			len = HS_KEYLEN(es, i);
  		char	   *ptrs = HS_KEY(es, bufs, i);
  
! 		if (!(len == keylen && memcmp(ptrs, keyptr, keylen) == 0))
  		{
  			int			vallen = HS_VALLEN(es, i);
  
***************
*** 331,339 **** hstore_delete_array(PG_FUNCTION_ARGS)
  			int			skeylen = HS_KEYLEN(es, i);
  
  			if (skeylen == key_pairs[j].keylen)
! 				difference = strncmp(HS_KEY(es, ps, i),
! 									 key_pairs[j].key,
! 									 key_pairs[j].keylen);
  			else
  				difference = (skeylen > key_pairs[j].keylen) ? 1 : -1;
  		}
--- 331,339 ----
  			int			skeylen = HS_KEYLEN(es, i);
  
  			if (skeylen == key_pairs[j].keylen)
! 				difference = memcmp(HS_KEY(es, ps, i),
! 									key_pairs[j].key,
! 									key_pairs[j].keylen);
  			else
  				difference = (skeylen > key_pairs[j].keylen) ? 1 : -1;
  		}
***************
*** 416,424 **** hstore_delete_hstore(PG_FUNCTION_ARGS)
  			int			s2keylen = HS_KEYLEN(es2, j);
  
  			if (skeylen == s2keylen)
! 				difference = strncmp(HS_KEY(es, ps, i),
! 									 HS_KEY(es2, ps2, j),
! 									 skeylen);
  			else
  				difference = (skeylen > s2keylen) ? 1 : -1;
  		}
--- 416,424 ----
  			int			s2keylen = HS_KEYLEN(es2, j);
  
  			if (skeylen == s2keylen)
! 				difference = memcmp(HS_KEY(es, ps, i),
! 									HS_KEY(es2, ps2, j),
! 									skeylen);
  			else
  				difference = (skeylen > s2keylen) ? 1 : -1;
  		}
***************
*** 433,439 **** hstore_delete_hstore(PG_FUNCTION_ARGS)
  			if (snullval != HS_VALISNULL(es2, j)
  				|| (!snullval
  					&& (svallen != HS_VALLEN(es2, j)
! 						|| strncmp(HS_VAL(es, ps, i), HS_VAL(es2, ps2, j), svallen) != 0)))
  			{
  				HS_COPYITEM(ed, bufd, pd,
  							HS_KEY(es, ps, i), HS_KEYLEN(es, i),
--- 433,439 ----
  			if (snullval != HS_VALISNULL(es2, j)
  				|| (!snullval
  					&& (svallen != HS_VALLEN(es2, j)
! 						|| memcmp(HS_VAL(es, ps, i), HS_VAL(es2, ps2, j), svallen) != 0)))
  			{
  				HS_COPYITEM(ed, bufd, pd,
  							HS_KEY(es, ps, i), HS_KEYLEN(es, i),
***************
*** 526,534 **** hstore_concat(PG_FUNCTION_ARGS)
  			int			s2keylen = HS_KEYLEN(es2, s2idx);
  
  			if (s1keylen == s2keylen)
! 				difference = strncmp(HS_KEY(es1, ps1, s1idx),
! 									 HS_KEY(es2, ps2, s2idx),
! 									 s1keylen);
  			else
  				difference = (s1keylen > s2keylen) ? 1 : -1;
  		}
--- 526,534 ----
  			int			s2keylen = HS_KEYLEN(es2, s2idx);
  
  			if (s1keylen == s2keylen)
! 				difference = memcmp(HS_KEY(es1, ps1, s1idx),
! 									HS_KEY(es2, ps2, s2idx),
! 									s1keylen);
  			else
  				difference = (s1keylen > s2keylen) ? 1 : -1;
  		}
***************
*** 996,1002 **** hstore_contains(PG_FUNCTION_ARGS)
  			if (nullval != HS_VALISNULL(ve, idx)
  				|| (!nullval
  					&& (vallen != HS_VALLEN(ve, idx)
! 			|| strncmp(HS_VAL(te, tstr, i), HS_VAL(ve, vstr, idx), vallen))))
  				res = false;
  		}
  		else
--- 996,1002 ----
  			if (nullval != HS_VALISNULL(ve, idx)
  				|| (!nullval
  					&& (vallen != HS_VALLEN(ve, idx)
! 			|| memcmp(HS_VAL(te, tstr, i), HS_VAL(ve, vstr, idx), vallen))))
  				res = false;
  		}
  		else
*** a/contrib/ltree/lquery_op.c
--- b/contrib/ltree/lquery_op.c
***************
*** 111,117 **** checkLevel(lquery_level *curq, ltree_level *curt)
  
  	for (i = 0; i < curq->numvar; i++)
  	{
! 		cmpptr = (curvar->flag & LVAR_INCASE) ? ltree_strncasecmp : strncmp;
  
  		if (curvar->flag & LVAR_SUBLEXEME)
  		{
--- 111,117 ----
  
  	for (i = 0; i < curq->numvar; i++)
  	{
! 		cmpptr = (curvar->flag & LVAR_INCASE) ? ltree_strncasecmp : memcmp;
  
  		if (curvar->flag & LVAR_SUBLEXEME)
  		{
*** a/contrib/ltree/ltree_gist.c
--- b/contrib/ltree/ltree_gist.c
***************
*** 546,552 **** gist_tqcmp(ltree *t, lquery *q)
  	while (an > 0 && bn > 0)
  	{
  		bl = LQL_FIRST(ql);
! 		if ((res = strncmp(al->name, bl->name, Min(al->len, bl->len))) == 0)
  		{
  			if (al->len != bl->len)
  				return al->len - bl->len;
--- 546,552 ----
  	while (an > 0 && bn > 0)
  	{
  		bl = LQL_FIRST(ql);
! 		if ((res = memcmp(al->name, bl->name, Min(al->len, bl->len))) == 0)
  		{
  			if (al->len != bl->len)
  				return al->len - bl->len;
*** a/contrib/ltree/ltree_op.c
--- b/contrib/ltree/ltree_op.c
***************
*** 68,74 **** ltree_compare(const ltree *a, const ltree *b)
  
  	while (an > 0 && bn > 0)
  	{
! 		if ((res = strncmp(al->name, bl->name, Min(al->len, bl->len))) == 0)
  		{
  			if (al->len != bl->len)
  				return (al->len - bl->len) * 10 * (an + 1);
--- 68,74 ----
  
  	while (an > 0 && bn > 0)
  	{
! 		if ((res = memcmp(al->name, bl->name, Min(al->len, bl->len))) == 0)
  		{
  			if (al->len != bl->len)
  				return (al->len - bl->len) * 10 * (an + 1);
***************
*** 165,171 **** inner_isparent(const ltree *c, const ltree *p)
  	{
  		if (cl->len != pl->len)
  			return false;
! 		if (strncmp(cl->name, pl->name, cl->len))
  			return false;
  
  		pn--;
--- 165,171 ----
  	{
  		if (cl->len != pl->len)
  			return false;
! 		if (memcmp(cl->name, pl->name, cl->len))
  			return false;
  
  		pn--;
***************
*** 373,379 **** ltree_index(PG_FUNCTION_ARGS)
  			bptr = LTREE_FIRST(b);
  			for (j = 0; j < b->numlevel; j++)
  			{
! 				if (!(aptr->len == bptr->len && strncmp(aptr->name, bptr->name, aptr->len) == 0))
  					break;
  				aptr = LEVEL_NEXT(aptr);
  				bptr = LEVEL_NEXT(bptr);
--- 373,379 ----
  			bptr = LTREE_FIRST(b);
  			for (j = 0; j < b->numlevel; j++)
  			{
! 				if (!(aptr->len == bptr->len && memcmp(aptr->name, bptr->name, aptr->len) == 0))
  					break;
  				aptr = LEVEL_NEXT(aptr);
  				bptr = LEVEL_NEXT(bptr);
***************
*** 451,457 **** lca_inner(ltree **a, int len)
  			num = 0;
  			for (i = 0; i < Min(tmp, (*ptr)->numlevel - 1); i++)
  			{
! 				if (l1->len == l2->len && strncmp(l1->name, l2->name, l1->len) == 0)
  					num = i + 1;
  				else
  					break;
--- 451,457 ----
  			num = 0;
  			for (i = 0; i < Min(tmp, (*ptr)->numlevel - 1); i++)
  			{
! 				if (l1->len == l2->len && memcmp(l1->name, l2->name, l1->len) == 0)
  					num = i + 1;
  				else
  					break;
*** a/contrib/ltree/ltxtquery_op.c
--- b/contrib/ltree/ltxtquery_op.c
***************
*** 57,63 **** checkcondition_str(void *checkval, ITEM *val)
  	char	   *op = ((CHKVAL *) checkval)->operand + val->distance;
  	int			(*cmpptr) (const char *, const char *, size_t);
  
! 	cmpptr = (val->flag & LVAR_INCASE) ? ltree_strncasecmp : strncmp;
  	while (tlen > 0)
  	{
  		if (val->flag & LVAR_SUBLEXEME)
--- 57,63 ----
  	char	   *op = ((CHKVAL *) checkval)->operand + val->distance;
  	int			(*cmpptr) (const char *, const char *, size_t);
  
! 	cmpptr = (val->flag & LVAR_INCASE) ? ltree_strncasecmp : memcmp;
  	while (tlen > 0)
  	{
  		if (val->flag & LVAR_SUBLEXEME)
*** a/src/backend/nodes/readfuncs.c
--- b/src/backend/nodes/readfuncs.c
***************
*** 1196,1202 **** parseNodeString(void)
  	token = pg_strtok(&length);
  
  #define MATCH(tokname, namelen) \
! 	(length == namelen && strncmp(token, tokname, namelen) == 0)
  
  	if (MATCH("QUERY", 5))
  		return_value = _readQuery();
--- 1196,1202 ----
  	token = pg_strtok(&length);
  
  #define MATCH(tokname, namelen) \
! 	(length == namelen && memcmp(token, tokname, namelen) == 0)
  
  	if (MATCH("QUERY", 5))
  		return_value = _readQuery();
*** a/src/backend/tsearch/spell.c
--- b/src/backend/tsearch/spell.c
***************
*** 1502,1508 **** CheckCompoundAffixes(CMPDAffix **ptr, char *word, int len, bool CheckInPlace)
  	{
  		while ((*ptr)->affix)
  		{
! 			if (len > (*ptr)->len && strncmp((*ptr)->affix, word, (*ptr)->len) == 0)
  			{
  				len = (*ptr)->len;
  				issuffix = (*ptr)->issuffix;
--- 1502,1508 ----
  	{
  		while ((*ptr)->affix)
  		{
! 			if (len > (*ptr)->len && memcmp((*ptr)->affix, word, (*ptr)->len) == 0)
  			{
  				len = (*ptr)->len;
  				issuffix = (*ptr)->issuffix;
*** a/src/backend/tsearch/to_tsany.c
--- b/src/backend/tsearch/to_tsany.c
***************
*** 90,96 **** uniqueWORD(ParsedWord *a, int4 l)
  	while (ptr - a < l)
  	{
  		if (!(ptr->len == res->len &&
! 			  strncmp(ptr->word, res->word, res->len) == 0))
  		{
  			/*
  			 * Got a new word, so put it in result
--- 90,96 ----
  	while (ptr - a < l)
  	{
  		if (!(ptr->len == res->len &&
! 			  memcmp(ptr->word, res->word, res->len) == 0))
  		{
  			/*
  			 * Got a new word, so put it in result
*** a/src/backend/tsearch/ts_selfuncs.c
--- b/src/backend/tsearch/ts_selfuncs.c
***************
*** 316,323 **** tsquery_opr_selec(QueryItem *item, char *operand,
  				int			tlen = VARSIZE_ANY_EXHDR(t->element);
  
  				if (tlen >= key.length &&
! 					strncmp(key.lexeme, VARDATA_ANY(t->element),
! 							key.length) == 0)
  					matched += t->frequency;
  				allmcvs += t->frequency;
  			}
--- 316,323 ----
  				int			tlen = VARSIZE_ANY_EXHDR(t->element);
  
  				if (tlen >= key.length &&
! 					memcmp(key.lexeme, VARDATA_ANY(t->element),
! 						   key.length) == 0)
  					matched += t->frequency;
  				allmcvs += t->frequency;
  			}
***************
*** 430,434 **** compare_lexeme_textfreq(const void *e1, const void *e2)
  		return -1;
  
  	/* Fall back on byte-for-byte comparison */
! 	return strncmp(key->lexeme, VARDATA_ANY(t->element), len1);
  }
--- 430,434 ----
  		return -1;
  
  	/* Fall back on byte-for-byte comparison */
! 	return memcmp(key->lexeme, VARDATA_ANY(t->element), len1);
  }
*** a/src/backend/tsearch/ts_typanalyze.c
--- b/src/backend/tsearch/ts_typanalyze.c
***************
*** 488,494 **** lexeme_compare(const void *key1, const void *key2)
  	else if (d1->length < d2->length)
  		return -1;
  	/* Lengths are equal, do a byte-by-byte comparison */
! 	return strncmp(d1->lexeme, d2->lexeme, d1->length);
  }
  
  /*
--- 488,494 ----
  	else if (d1->length < d2->length)
  		return -1;
  	/* Lengths are equal, do a byte-by-byte comparison */
! 	return memcmp(d1->lexeme, d2->lexeme, d1->length);
  }
  
  /*
*** a/src/backend/utils/adt/varchar.c
--- b/src/backend/utils/adt/varchar.c
***************
*** 690,696 **** bpchareq(PG_FUNCTION_ARGS)
  	if (len1 != len2)
  		result = false;
  	else
! 		result = (strncmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) == 0);
  
  	PG_FREE_IF_COPY(arg1, 0);
  	PG_FREE_IF_COPY(arg2, 1);
--- 690,696 ----
  	if (len1 != len2)
  		result = false;
  	else
! 		result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) == 0);
  
  	PG_FREE_IF_COPY(arg1, 0);
  	PG_FREE_IF_COPY(arg2, 1);
***************
*** 717,723 **** bpcharne(PG_FUNCTION_ARGS)
  	if (len1 != len2)
  		result = true;
  	else
! 		result = (strncmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) != 0);
  
  	PG_FREE_IF_COPY(arg1, 0);
  	PG_FREE_IF_COPY(arg2, 1);
--- 717,723 ----
  	if (len1 != len2)
  		result = true;
  	else
! 		result = (memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), len1) != 0);
  
  	PG_FREE_IF_COPY(arg1, 0);
  	PG_FREE_IF_COPY(arg2, 1);
***************
*** 905,911 **** 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));
  	if (result != 0)
  		return result;
  	else if (len1 < len2)
--- 905,911 ----
  	len1 = bcTruelen(arg1);
  	len2 = bcTruelen(arg2);
  
! 	result = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
  	if (result != 0)
  		return result;
  	else if (len1 < len2)
*** a/src/backend/utils/adt/varlena.c
--- b/src/backend/utils/adt/varlena.c
***************
*** 1286,1292 **** varstr_cmp(char *arg1, int len1, char *arg2, int len2)
  	 */
  	if (lc_collate_is_c())
  	{
! 		result = strncmp(arg1, arg2, Min(len1, len2));
  		if ((result == 0) && (len1 != len2))
  			result = (len1 < len2) ? -1 : 1;
  	}
--- 1286,1292 ----
  	 */
  	if (lc_collate_is_c())
  	{
! 		result = memcmp(arg1, arg2, Min(len1, len2));
  		if ((result == 0) && (len1 != len2))
  			result = (len1 < len2) ? -1 : 1;
  	}
***************
*** 1370,1376 **** varstr_cmp(char *arg1, int len1, char *arg2, int len2)
  			 */
  			if (result == 0)
  			{
! 				result = strncmp(arg1, arg2, Min(len1, len2));
  				if ((result == 0) && (len1 != len2))
  					result = (len1 < len2) ? -1 : 1;
  			}
--- 1370,1376 ----
  			 */
  			if (result == 0)
  			{
! 				result = memcmp(arg1, arg2, Min(len1, len2));
  				if ((result == 0) && (len1 != len2))
  					result = (len1 < len2) ? -1 : 1;
  			}
***************
*** 1462,1469 **** 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);
  
  	PG_FREE_IF_COPY(arg1, 0);
  	PG_FREE_IF_COPY(arg2, 1);
--- 1462,1469 ----
  	if (VARSIZE_ANY_EXHDR(arg1) != VARSIZE_ANY_EXHDR(arg2))
  		result = false;
  	else
! 		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,1492 **** 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);
  
  	PG_FREE_IF_COPY(arg1, 0);
  	PG_FREE_IF_COPY(arg2, 1);
--- 1485,1492 ----
  	if (VARSIZE_ANY_EXHDR(arg1) != VARSIZE_ANY_EXHDR(arg2))
  		result = true;
  	else
! 		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,1618 **** 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));
  	if (result != 0)
  		return result;
  	else if (len1 < len2)
--- 1612,1618 ----
  	len1 = VARSIZE_ANY_EXHDR(arg1);
  	len2 = VARSIZE_ANY_EXHDR(arg2);
  
! 	result = memcmp(VARDATA_ANY(arg1), VARDATA_ANY(arg2), Min(len1, len2));
  	if (result != 0)
  		return result;
  	else if (len1 < len2)