Ltree pattern matching

Started by PG Bug reporting formover 4 years ago3 messagesdocs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following documentation comment has been logged on the website:

Page: https://www.postgresql.org/docs/12/ltree.html
Description:

In v12 ltree doc (I've not checked other versions)
"The behavior of % is a bit complicated. It tries to match words rather than
the entire label. For example foo_bar% matches foo_bar_baz but not
foo_barbaz. If combined with *, prefix matching applies to each word
separately, for example foo_bar%* matches foo1_bar2_baz but not
foo1_br2_baz.

I believe foo1 is in error (if I understood the operators), it should be
foo.

Regards
T

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: PG Bug reporting form (#1)
Re: Ltree pattern matching

PG Doc comments form <noreply@postgresql.org> writes:

In v12 ltree doc (I've not checked other versions)
"The behavior of % is a bit complicated. It tries to match words rather than
the entire label. For example foo_bar% matches foo_bar_baz but not
foo_barbaz. If combined with *, prefix matching applies to each word
separately, for example foo_bar%* matches foo1_bar2_baz but not
foo1_br2_baz.

I believe foo1 is in error (if I understood the operators), it should be
foo.

A quick test shows that the examples are correct as stated:

contrib_regression=# select 'foo_bar_baz'::ltree ~ 'foo_bar%'::lquery;
?column?
----------
t
(1 row)

contrib_regression=# select 'foo_barbaz'::ltree ~ 'foo_bar%'::lquery;
?column?
----------
f
(1 row)

contrib_regression=# select 'foo1_bar2_baz'::ltree ~ 'foo_bar%*'::lquery;
?column?
----------
t
(1 row)

contrib_regression=# select 'foo1_br2_baz'::ltree ~ 'foo_bar%*'::lquery;
?column?
----------
f
(1 row)

I'd be the first to admit that this paragraph doesn't seem to measure up
to our usual standards of clarity, but I'm not sure about what would be
better wording.

regards, tom lane

#3Terry Gilbert
Terry.Gilbert@sas.com
In reply to: Tom Lane (#2)
RE: Ltree pattern matching

So, when it says "* prefix matching matches each word separately" it means
foo_bar* will match a label with the first word beginning with foo and a second word beginning with bar?

Hmmm I'll think about it, maybe I can suggest helpful wording.
Thank you for clarifying!
Terry

-----Original Message-----
From: Tom Lane <tgl@sss.pgh.pa.us>
Sent: Friday, November 12, 2021 10:37 AM
To: Terry Gilbert <terry.gilbert@sas.com>
Cc: pgsql-docs@lists.postgresql.org
Subject: Re: Ltree pattern matching

EXTERNAL

PG Doc comments form <noreply@postgresql.org> writes:

In v12 ltree doc (I've not checked other versions) "The behavior of %
is a bit complicated. It tries to match words rather than the entire
label. For example foo_bar% matches foo_bar_baz but not foo_barbaz. If
combined with *, prefix matching applies to each word separately, for
example foo_bar%* matches foo1_bar2_baz but not foo1_br2_baz.

I believe foo1 is in error (if I understood the operators), it should
be foo.

A quick test shows that the examples are correct as stated:

contrib_regression=# select 'foo_bar_baz'::ltree ~ 'foo_bar%'::lquery; ?column?
----------
t
(1 row)

contrib_regression=# select 'foo_barbaz'::ltree ~ 'foo_bar%'::lquery; ?column?
----------
f
(1 row)

contrib_regression=# select 'foo1_bar2_baz'::ltree ~ 'foo_bar%*'::lquery; ?column?
----------
t
(1 row)

contrib_regression=# select 'foo1_br2_baz'::ltree ~ 'foo_bar%*'::lquery; ?column?
----------
f
(1 row)

I'd be the first to admit that this paragraph doesn't seem to measure up to our usual standards of clarity, but I'm not sure about what would be better wording.

regards, tom lane