Fix bogus tree-flattening logic in QTNTernary().
authorTom Lane
Sun, 30 Oct 2016 19:24:40 +0000 (15:24 -0400)
committerTom Lane
Sun, 30 Oct 2016 19:24:40 +0000 (15:24 -0400)
commitf0c2ce45e7acb38d56cf62ef8c907bb690e84cb1
tree998441b6126a90a7ba94d4615916fa4e15c7d44b
parent4a8cfbdcbe8447e4226b2ebdb155e0acc1167db5
Fix bogus tree-flattening logic in QTNTernary().

QTNTernary() contains logic to flatten, eg, '(a & b) & c' into 'a & b & c',
which is all well and good, but it tries to do that to NOT nodes as well,
so that '!!a' gets changed to '!a'.  Explicitly restrict the conversion to
be done only on AND and OR nodes, and add a test case illustrating the bug.

In passing, provide some comments for the sadly naked functions in
tsquery_util.c, and simplify some baroque logic in QTNFree(), which
I think may have been leaking some items it intended to free.

Noted while investigating a complaint from Andreas Seltenreich.
Back-patch to all supported versions.
src/backend/utils/adt/tsquery_util.c
src/test/regress/expected/tsearch.out
src/test/regress/sql/tsearch.sql