1515 *
1616 *
1717 * IDENTIFICATION
18- * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.198 2006/03/05 15:58:44 momjian Exp $
18+ * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.199 2006/04/20 17:50:18 tgl Exp $
1919 *
2020 *-------------------------------------------------------------------------
2121 */
@@ -3736,14 +3736,8 @@ like_fixed_prefix(Const *patt_const, bool case_insensitive,
37363736bytea * bstr = DatumGetByteaP (patt_const -> constvalue );
37373737
37383738pattlen = VARSIZE (bstr )- VARHDRSZ ;
3739- if (pattlen > 0 )
3740- {
3741- patt = (char * )palloc (pattlen );
3742- memcpy (patt ,VARDATA (bstr ),pattlen );
3743- }
3744- else
3745- patt = NULL ;
3746-
3739+ patt = (char * )palloc (pattlen );
3740+ memcpy (patt ,VARDATA (bstr ),pattlen );
37473741if ((Pointer )bstr != DatumGetPointer (patt_const -> constvalue ))
37483742pfree (bstr );
37493743}
@@ -3761,7 +3755,7 @@ like_fixed_prefix(Const *patt_const, bool case_insensitive,
37613755if (patt [pos ]== '\\' )
37623756{
37633757pos ++ ;
3764- if (patt [ pos ] == '\0' && typeid != BYTEAOID )
3758+ if (pos >= pattlen )
37653759break ;
37663760}
37673761
@@ -3794,8 +3788,7 @@ like_fixed_prefix(Const *patt_const, bool case_insensitive,
37943788* rest_const = string_to_bytea_const (rest ,pattlen - pos );
37953789}
37963790
3797- if (patt != NULL )
3798- pfree (patt );
3791+ pfree (patt );
37993792pfree (match );
38003793
38013794/* in LIKE, an empty pattern is an exact match! */
@@ -4101,7 +4094,6 @@ like_selectivity(Const *patt_const, bool case_insensitive)
41014094{
41024095Selectivity sel = 1.0 ;
41034096int pos ;
4104- int start ;
41054097Oid typeid = patt_const -> consttype ;
41064098char * patt ;
41074099int pattlen ;
@@ -4124,23 +4116,20 @@ like_selectivity(Const *patt_const, bool case_insensitive)
41244116bytea * bstr = DatumGetByteaP (patt_const -> constvalue );
41254117
41264118pattlen = VARSIZE (bstr )- VARHDRSZ ;
4127- if (pattlen > 0 )
4128- {
4129- patt = (char * )palloc (pattlen );
4130- memcpy (patt ,VARDATA (bstr ),pattlen );
4131- }
4132- else
4133- patt = NULL ;
4134-
4119+ patt = (char * )palloc (pattlen );
4120+ memcpy (patt ,VARDATA (bstr ),pattlen );
41354121if ((Pointer )bstr != DatumGetPointer (patt_const -> constvalue ))
41364122pfree (bstr );
41374123}
4138- /* patt should never be NULL in practice */
4139- Assert (patt != NULL );
41404124
4141- /* Skip any leading %; it's already factored into initial sel */
4142- start = (* patt == '%' ) ?1 :0 ;
4143- for (pos = start ;pos < pattlen ;pos ++ )
4125+ /* Skip any leading wildcard; it's already factored into initial sel */
4126+ for (pos = 0 ;pos < pattlen ;pos ++ )
4127+ {
4128+ if (patt [pos ]!= '%' && patt [pos ]!= '_' )
4129+ break ;
4130+ }
4131+
4132+ for (;pos < pattlen ;pos ++ )
41444133{
41454134/* % and _ are wildcard characters in LIKE */
41464135if (patt [pos ]== '%' )
@@ -4151,7 +4140,7 @@ like_selectivity(Const *patt_const, bool case_insensitive)
41514140{
41524141/* Backslash quotes the next character */
41534142pos ++ ;
4154- if (patt [ pos ] == '\0' && typeid != BYTEAOID )
4143+ if (pos >= pattlen )
41554144break ;
41564145sel *=FIXED_CHAR_SEL ;
41574146}
@@ -4161,6 +4150,8 @@ like_selectivity(Const *patt_const, bool case_insensitive)
41614150/* Could get sel > 1 if multiple wildcards */
41624151if (sel > 1.0 )
41634152sel = 1.0 ;
4153+
4154+ pfree (patt );
41644155return sel ;
41654156}
41664157
@@ -4366,14 +4357,8 @@ make_greater_string(const Const *str_const)
43664357bytea * bstr = DatumGetByteaP (str_const -> constvalue );
43674358
43684359len = VARSIZE (bstr )- VARHDRSZ ;
4369- if (len > 0 )
4370- {
4371- workstr = (char * )palloc (len );
4372- memcpy (workstr ,VARDATA (bstr ),len );
4373- }
4374- else
4375- workstr = NULL ;
4376-
4360+ workstr = (char * )palloc (len );
4361+ memcpy (workstr ,VARDATA (bstr ),len );
43774362if ((Pointer )bstr != DatumGetPointer (str_const -> constvalue ))
43784363pfree (bstr );
43794364}
@@ -4429,8 +4414,7 @@ make_greater_string(const Const *str_const)
44294414}
44304415
44314416/* Failed... */
4432- if (workstr != NULL )
4433- pfree (workstr );
4417+ pfree (workstr );
44344418
44354419return NULL ;
44364420}