]> granicus.if.org Git - postgresql/commit
Add test scaffolding for exercising optimizer's predicate-proof logic.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 8 Mar 2018 18:25:26 +0000 (13:25 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 8 Mar 2018 18:25:26 +0000 (13:25 -0500)
commit44468f49bbe7e47e5a27a1ccbf13549ff85149f2
tree73205f87844450ef9d7c0482ccb325116655d8ef
parent04e7ecadf64d18f67ca1d0632d8ab71f120ca5e3
Add test scaffolding for exercising optimizer's predicate-proof logic.

The predicate-proof code in predtest.c is a bit hard to test as-is:
you have to construct a query whose plan changes depending on the success
of a test, and in tests that have been around for awhile, it's always
possible that the plan shape is now being determined by some other factor.
Our existing regression tests aren't doing real well at providing full
code coverage of predtest.c, either.  So, let's add a small test module
that allows directly inspecting the results of predicate_implied_by()
and predicate_refuted_by() for arbitrary boolean expressions.

I chose the set of tests committed here in order to get reasonably
complete code coverage of predtest.c just from running this test
module, and to cover some cases called out as being interesting in
the existing comments.  We might want to add more later.  But this
set already shows a few cases where perhaps things could be improved.

Indeed, this exercise proves that predicate_refuted_by() is buggy for
the case of clause_is_check = true, though fortunately we aren't using
that case anywhere yet.  I'll look into doing something about that in
a separate commit.  For now, just memorialize the current behavior.

Discussion: https://postgr.es/m/5983.1520487191@sss.pgh.pa.us
src/test/modules/Makefile
src/test/modules/test_predtest/.gitignore [new file with mode: 0644]
src/test/modules/test_predtest/Makefile [new file with mode: 0644]
src/test/modules/test_predtest/README [new file with mode: 0644]
src/test/modules/test_predtest/expected/test_predtest.out [new file with mode: 0644]
src/test/modules/test_predtest/sql/test_predtest.sql [new file with mode: 0644]
src/test/modules/test_predtest/test_predtest--1.0.sql [new file with mode: 0644]
src/test/modules/test_predtest/test_predtest.c [new file with mode: 0644]
src/test/modules/test_predtest/test_predtest.control [new file with mode: 0644]