Eliminate some no-longer-needed workarounds for palloc's old behavior
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 20 Apr 2006 17:50:18 +0000 (17:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 20 Apr 2006 17:50:18 +0000 (17:50 +0000)
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.

src/backend/utils/adt/selfuncs.c

index ba051a4a8e2240691f8cc3aa37ef877df437c4df..3eae8171e9bc59bcef05774f796348eab44c77be 100644 (file)
@@ -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;
 }