*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
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);
}
if (patt[pos] == '\\')
{
pos++;
- if (patt[pos] == '\0' && typeid != BYTEAOID)
+ if (pos >= pattlen)
break;
}
*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! */
{
Selectivity sel = 1.0;
int pos;
- int start;
Oid typeid = patt_const->consttype;
char *patt;
int pattlen;
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] == '%')
{
/* Backslash quotes the next character */
pos++;
- if (patt[pos] == '\0' && typeid != BYTEAOID)
+ if (pos >= pattlen)
break;
sel *= FIXED_CHAR_SEL;
}
/* Could get sel > 1 if multiple wildcards */
if (sel > 1.0)
sel = 1.0;
+
+ pfree(patt);
return sel;
}
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);
}
}
/* Failed... */
- if (workstr != NULL)
- pfree(workstr);
+ pfree(workstr);
return NULL;
}