Thread
Commits
-
Handle empty-string edge cases correctly in strpos().
- bd1ef5799b04 13.0 landed
- 43e43771bc4b 12.1 landed
-
Use single-byte Boyer-Moore-Horspool search even with multibyte encodings.
- 9556aa01c69a 12.0 cited
-
strpos behavior change around empty substring in PG12
Shay Rojansky <roji@roji.org> — 2019-10-28T15:02:30Z
Greetings hackers, 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). Is this behavior change intentional? If so, it doesn't seem to be documented in the release notes... First raised by Austin Drenski in https://github.com/npgsql/efcore.pg/pull/1068#issuecomment-546795826 Thanks, Shay -
Re: strpos behavior change around empty substring in PG12
Robert Haas <robertmhaas@gmail.com> — 2019-10-28T15:48:49Z
On Mon, Oct 28, 2019 at 11:02 AM Shay Rojansky <roji@roji.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). > > Is this behavior change intentional? If so, it doesn't seem to be documented in the release notes... > > First raised by Austin Drenski in https://github.com/npgsql/efcore.pg/pull/1068#issuecomment-546795826 It looks to me like this got broken here: commit 9556aa01c69a26ca726d8dda8e395acc7c1e30fc Author: Heikki Linnakangas <heikki.linnakangas@iki.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. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company -
Re: strpos behavior change around empty substring in PG12
Tom Lane <tgl@sss.pgh.pa.us> — 2019-10-28T15:57:21Z
Robert Haas <robertmhaas@gmail.com> writes: > On Mon, Oct 28, 2019 at 11:02 AM Shay Rojansky <roji@roji.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.linnakangas@iki.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 -
Re: strpos behavior change around empty substring in PG12
Heikki Linnakangas <hlinnaka@iki.fi> — 2019-10-29T14:11:13Z
On 28/10/2019 17:57, Tom Lane wrote: > Robert Haas <robertmhaas@gmail.com> writes: >> On Mon, Oct 28, 2019 at 11:02 AM Shay Rojansky <roji@roji.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.linnakangas@iki.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. Tom fixed this in commit bd1ef5799b; thanks! To be sure, I also checked the SQL standard for what POSITION('' IN 'test') is supposed to return. It agrees that 1 is correct: > If CHAR_LENGTH(CVE1) is 0 (zero), then the result is 1 (one). - Heikki -
Re: strpos behavior change around empty substring in PG12
Shay Rojansky <roji@roji.org> — 2019-10-29T14:27:11Z
Thanks for the quick turnaround! Tom Lane <tgl@sss.pgh.pa.us> schrieb am Mo., 28. Okt. 2019, 16:57: > Robert Haas <robertmhaas@gmail.com> writes: > > On Mon, Oct 28, 2019 at 11:02 AM Shay Rojansky <roji@roji.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.linnakangas@iki.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 >