Re: strpos behavior change around empty substring in PG12

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, Shay Rojansky <roji(at)roji(dot)org>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Subject: Re: strpos behavior change around empty substring in PG12
Date: 2019-10-28 15:57:21
Message-ID: 28058.1572278241@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Robert Haas <robertmhaas(at)gmail(dot)com> writes:
> On Mon, Oct 28, 2019 at 11:02 AM Shay Rojansky <roji(at)roji(dot)org> wrote:
>> Before PG12, select strpos('test', '') returns 1 (empty substring found at first position of the string), whereas starting with PG12 it returns 0 (empty substring not found).

> It looks to me like this got broken here:

> commit 9556aa01c69a26ca726d8dda8e395acc7c1e30fc
> Author: Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi>
> Date: Fri Jan 25 16:25:05 2019 +0200
> Use single-byte Boyer-Moore-Horspool search even with multibyte encodings.

> Not sure what happened exactly.

I think the problem is lack of clarity about the edge cases.
The patch added this short-circuit right at the top of text_position():

+ if (VARSIZE_ANY_EXHDR(t1) < 1 || VARSIZE_ANY_EXHDR(t2) < 1)
+ return 0;

and as this example shows, that's the Wrong Thing. Fortunately,
it also seems easily fixed.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Robert Haas 2019-10-28 16:29:48 Re: [Proposal] Global temporary tables
Previous Message postgresql_2016@163.com 2019-10-28 15:57:04 Re: TOAST corruption in standby database