Thread: BUG #18239: select position ('' in 'A') returns 1

BUG #18239: select position ('' in 'A') returns 1

From
PG Bug reporting form
Date:
The following bug has been logged on the website:

Bug reference:      18239
Logged by:          Luc Van Linden
Email address:      lucvanlind.en@gmail.com
PostgreSQL version: 15.3
Operating system:   windows 10 64 bit
Description:

We simplified the bug, or maybe undocumented behavior to its simplest
testcase.

select position ('' in 'A') returns 1

Thus, case a field has an empty string while, checking positions in another
string, it seems to always fit the position 1.

Not sure if this is intended or not, at least we experience this as a bug.


Re: BUG #18239: select position ('' in 'A') returns 1

From
"David G. Johnston"
Date:
On Sunday, December 10, 2023, PG Bug reporting form <noreply@postgresql.org> wrote:
The following bug has been logged on the website:

Bug reference:      18239
Logged by:          Luc Van Linden
Email address:      lucvanlind.en@gmail.com
PostgreSQL version: 15.3
Operating system:   windows 10 64 bit
Description:       

We simplified the bug, or maybe undocumented behavior to its simplest
testcase.

select position ('' in 'A') returns 1

Thus, case a field has an empty string while, checking positions in another
string, it seems to always fit the position 1.

Not sure if this is intended or not, at least we experience this as a bug.


Just as an empty set is a subset of all sets the empty string is a substring within all strings.

I do not believe we document or refer to this external rule anywhere though.

David J.

Re: BUG #18239: select position ('' in 'A') returns 1

From
Tom Lane
Date:
"David G. Johnston" <david.g.johnston@gmail.com> writes:
> On Sunday, December 10, 2023, PG Bug reporting form <noreply@postgresql.org>
> wrote:
>> select position ('' in 'A') returns 1
>> Thus, case a field has an empty string while, checking positions in another
>> string, it seems to always fit the position 1.

> Just as an empty set is a subset of all sets the empty string is a
> substring within all strings.

Yes.  This behavior is explicitly required by the SQL standard:

         2) If <string position expression> is specified, then

            Case:

            a) If the first <string value expression> has a length of 0
              (zero), then the result is 1 (one).

            b) [ otherwise, ... ]

> I do not believe we document or refer to this external rule anywhere though.

No, our documentation for position() is just one sentence.  With the
new function-table layout it'd be possible to add a second example
to exhibit this behavior, but I'm not sure it's worth the trouble.
Personally I don't find this surprising.

            regards, tom lane