OSDN Git Service

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 ba051a4..3eae817 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;
 }