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