mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Eliminate some no-longer-needed workarounds for palloc's old behavior
of rejecting palloc(0). Also, tweak like_selectivity() to avoid assuming the presented pattern is nonempty; although that assumption is valid, it doesn't really help much, and the new coding is more correct anyway since it properly handles redundant wildcards. In combination these changes should eliminate a Coverity warning noted by Martijn.
This commit is contained in:
		
							parent
							
								
									ea6d54ee06
								
							
						
					
					
						commit
						efe222268f
					
				| @ -15,7 +15,7 @@ | ||||
|  * | ||||
|  * | ||||
|  * IDENTIFICATION | ||||
|  *	  $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.198 2006/03/05 15:58:44 momjian Exp $ | ||||
|  *	  $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.199 2006/04/20 17:50:18 tgl Exp $ | ||||
|  * | ||||
|  *------------------------------------------------------------------------- | ||||
|  */ | ||||
| @ -3736,14 +3736,8 @@ like_fixed_prefix(Const *patt_const, bool case_insensitive, | ||||
| 		bytea	   *bstr = DatumGetByteaP(patt_const->constvalue); | ||||
| 
 | ||||
| 		pattlen = VARSIZE(bstr) - VARHDRSZ; | ||||
| 		if (pattlen > 0) | ||||
| 		{ | ||||
| 			patt = (char *) palloc(pattlen); | ||||
| 			memcpy(patt, VARDATA(bstr), pattlen); | ||||
| 		} | ||||
| 		else | ||||
| 			patt = NULL; | ||||
| 
 | ||||
| 		patt = (char *) palloc(pattlen); | ||||
| 		memcpy(patt, VARDATA(bstr), pattlen); | ||||
| 		if ((Pointer) bstr != DatumGetPointer(patt_const->constvalue)) | ||||
| 			pfree(bstr); | ||||
| 	} | ||||
| @ -3761,7 +3755,7 @@ like_fixed_prefix(Const *patt_const, bool case_insensitive, | ||||
| 		if (patt[pos] == '\\') | ||||
| 		{ | ||||
| 			pos++; | ||||
| 			if (patt[pos] == '\0' && typeid != BYTEAOID) | ||||
| 			if (pos >= pattlen) | ||||
| 				break; | ||||
| 		} | ||||
| 
 | ||||
| @ -3794,8 +3788,7 @@ like_fixed_prefix(Const *patt_const, bool case_insensitive, | ||||
| 		*rest_const = string_to_bytea_const(rest, pattlen - pos); | ||||
| 	} | ||||
| 
 | ||||
| 	if (patt != NULL) | ||||
| 		pfree(patt); | ||||
| 	pfree(patt); | ||||
| 	pfree(match); | ||||
| 
 | ||||
| 	/* in LIKE, an empty pattern is an exact match! */ | ||||
| @ -4101,7 +4094,6 @@ like_selectivity(Const *patt_const, bool case_insensitive) | ||||
| { | ||||
| 	Selectivity sel = 1.0; | ||||
| 	int			pos; | ||||
| 	int			start; | ||||
| 	Oid			typeid = patt_const->consttype; | ||||
| 	char	   *patt; | ||||
| 	int			pattlen; | ||||
| @ -4124,23 +4116,20 @@ like_selectivity(Const *patt_const, bool case_insensitive) | ||||
| 		bytea	   *bstr = DatumGetByteaP(patt_const->constvalue); | ||||
| 
 | ||||
| 		pattlen = VARSIZE(bstr) - VARHDRSZ; | ||||
| 		if (pattlen > 0) | ||||
| 		{ | ||||
| 			patt = (char *) palloc(pattlen); | ||||
| 			memcpy(patt, VARDATA(bstr), pattlen); | ||||
| 		} | ||||
| 		else | ||||
| 			patt = NULL; | ||||
| 
 | ||||
| 		patt = (char *) palloc(pattlen); | ||||
| 		memcpy(patt, VARDATA(bstr), pattlen); | ||||
| 		if ((Pointer) bstr != DatumGetPointer(patt_const->constvalue)) | ||||
| 			pfree(bstr); | ||||
| 	} | ||||
| 	/* patt should never be NULL in practice */ | ||||
| 	Assert(patt != NULL); | ||||
| 
 | ||||
| 	/* Skip any leading %; it's already factored into initial sel */ | ||||
| 	start = (*patt == '%') ? 1 : 0; | ||||
| 	for (pos = start; pos < pattlen; pos++) | ||||
| 	/* Skip any leading wildcard; it's already factored into initial sel */ | ||||
| 	for (pos = 0; pos < pattlen; pos++) | ||||
| 	{ | ||||
| 		if (patt[pos] != '%' && patt[pos] != '_') | ||||
| 			break; | ||||
| 	} | ||||
| 
 | ||||
| 	for (; pos < pattlen; pos++) | ||||
| 	{ | ||||
| 		/* % and _ are wildcard characters in LIKE */ | ||||
| 		if (patt[pos] == '%') | ||||
| @ -4151,7 +4140,7 @@ like_selectivity(Const *patt_const, bool case_insensitive) | ||||
| 		{ | ||||
| 			/* Backslash quotes the next character */ | ||||
| 			pos++; | ||||
| 			if (patt[pos] == '\0' && typeid != BYTEAOID) | ||||
| 			if (pos >= pattlen) | ||||
| 				break; | ||||
| 			sel *= FIXED_CHAR_SEL; | ||||
| 		} | ||||
| @ -4161,6 +4150,8 @@ like_selectivity(Const *patt_const, bool case_insensitive) | ||||
| 	/* Could get sel > 1 if multiple wildcards */ | ||||
| 	if (sel > 1.0) | ||||
| 		sel = 1.0; | ||||
| 
 | ||||
| 	pfree(patt); | ||||
| 	return sel; | ||||
| } | ||||
| 
 | ||||
| @ -4366,14 +4357,8 @@ make_greater_string(const Const *str_const) | ||||
| 		bytea	   *bstr = DatumGetByteaP(str_const->constvalue); | ||||
| 
 | ||||
| 		len = VARSIZE(bstr) - VARHDRSZ; | ||||
| 		if (len > 0) | ||||
| 		{ | ||||
| 			workstr = (char *) palloc(len); | ||||
| 			memcpy(workstr, VARDATA(bstr), len); | ||||
| 		} | ||||
| 		else | ||||
| 			workstr = NULL; | ||||
| 
 | ||||
| 		workstr = (char *) palloc(len); | ||||
| 		memcpy(workstr, VARDATA(bstr), len); | ||||
| 		if ((Pointer) bstr != DatumGetPointer(str_const->constvalue)) | ||||
| 			pfree(bstr); | ||||
| 	} | ||||
| @ -4429,8 +4414,7 @@ make_greater_string(const Const *str_const) | ||||
| 	} | ||||
| 
 | ||||
| 	/* Failed... */ | ||||
| 	if (workstr != NULL) | ||||
| 		pfree(workstr); | ||||
| 	pfree(workstr); | ||||
| 
 | ||||
| 	return NULL; | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user