postgresql/contrib/ltree
Tom Lane 70dc4c509b Fix lquery's NOT handling, and add ability to quantify non-'*' items.
The existing implementation of the ltree ~ lquery match operator is
sufficiently complex and undocumented that it's hard to tell exactly
what it does.  But one thing it clearly gets wrong is the combination
of NOT symbols (!) and '*' symbols.  A pattern such as '*.!foo.*'
should, by any ordinary understanding of regular expression behavior,
match any ltree that has at least one label that's not "foo".  As best
we can tell by experimentation, what it's actually matching is any
ltree in which *no* label is "foo".  That's surprising, and not at all
what the documentation says.

Now, that's arguably a useful behavior, so if we rewrite to fix the
bug we should provide some other way to get it.  To do so, add the
ability to attach lquery quantifiers to non-'*' items as well as '*'s.
Then the pattern '!foo{,}' expresses "any ltree in which no label is
foo".  For backwards compatibility, the default quantifier for non-'*'
items has to be "{1}", although the default for '*' items is '{,}'.
I wouldn't have done it like that in a green field, but it's not
totally horrible.

Armed with that, rewrite checkCond() from scratch.  Treating '*' and
non-'*' items alike makes it simpler, not more complicated, so that
the function actually gets a lot shorter than it was.

Filip Rembiałkowski, Tom Lane, Nikita Glukhov, per a very
ancient bug report from M. Palm

Discussion: https://postgr.es/m/CAP_rww=waX2Oo6q+MbMSiZ9ktdj6eaJj0cQzNu=Ry2cCDij5fw@mail.gmail.com
2020-03-31 11:14:42 -04:00
..
data Add ltree data type to contrib, from Teodor Sigaev and Oleg Bartunov. 2002-07-30 16:40:34 +00:00
expected Fix lquery's NOT handling, and add ability to quantify non-'*' items. 2020-03-31 11:14:42 -04:00
sql Fix lquery's NOT handling, and add ability to quantify non-'*' items. 2020-03-31 11:14:42 -04:00
_ltree_gist.c Implement operator class parameters 2020-03-30 19:17:23 +03:00
_ltree_op.c Make DatumGetFoo/PG_GETARG_FOO/PG_RETURN_FOO macro names more consistent. 2017-09-18 15:21:23 -04:00
.gitignore Support "make check" in contrib 2011-04-25 22:27:11 +03:00
crc32.c Make the order of the header file includes consistent in contrib modules. 2019-10-24 08:05:34 +05:30
crc32.h Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
lquery_op.c Fix lquery's NOT handling, and add ability to quantify non-'*' items. 2020-03-31 11:14:42 -04:00
ltree_gist.c Implement operator class parameters 2020-03-30 19:17:23 +03:00
ltree_io.c Fix lquery's NOT handling, and add ability to quantify non-'*' items. 2020-03-31 11:14:42 -04:00
ltree_op.c Protect against overflow of ltree.numlevel and lquery.numlevel. 2020-03-28 17:09:51 -04:00
ltree--1.0--1.1.sql Update extensions with GIN/GIST support for parallel query. 2016-06-14 13:34:37 -04:00
ltree--1.1--1.2.sql Implement operator class parameters 2020-03-30 19:17:23 +03:00
ltree--1.1.sql Update extensions with GIN/GIST support for parallel query. 2016-06-14 13:34:37 -04:00
ltree.control Implement operator class parameters 2020-03-30 19:17:23 +03:00
ltree.h Fix lquery's NOT handling, and add ability to quantify non-'*' items. 2020-03-31 11:14:42 -04:00
ltreetest.sql Remove cvs keywords from all files. 2010-09-20 22:08:53 +02:00
ltxtquery_io.c Remove useless "return;" lines 2019-11-28 16:48:37 -03:00
ltxtquery_op.c Clean up newlines following left parentheses 2020-01-30 13:42:14 -03:00
Makefile Implement operator class parameters 2020-03-30 19:17:23 +03:00