postgresql/contrib
Robert Haas 6455e55b0d pg_plan_advice: Invent DO_NOT_SCAN(relation_identifier).
The premise of src/test/modules/test_plan_advice is that if we plan
a query once, generate plan advice, and then replan it using that
same advice, all of that advice should apply cleanly, since the
settings and everything else are the same. Unfortunately, that's
not the case: the test suite is the main regression tests, and
concurrent activity can change the statistics on tables involved
in the query, especially system catalogs. That's OK as long as it
only affects costing, but in a few cases, it affects which relations
appear in the final plan at all.

In the buildfarm failures observed to date, this happens because
we consider alternative subplans for the same portion of the query;
in theory, MinMaxAggPath is vulnerable to a similar hazard. In both
cases, the planner clones an entire subquery, and the clone has a
different plan name, and therefore different range table identifiers,
than the original. If a cost change results in flipping between one
of these plans and the other, the test_plan_advice tests will fail,
because the range table identifiers to which advice was applied won't
even be present in the output of the second planning cycle.

To fix, invent a new DO_NOT_SCAN advice tag. When generating advice,
emit it for relations that should not appear in the final plan at
all, because some alternative version of that relation was used
instead. When DO_NOT_SCAN is supplied, disable all scan methods for
that relation.

To make this work, we reuse a bunch of the machinery that previously
existed for the purpose of ensuring that we build the same set of
relation identifiers during planning as we do from the final
PlannedStmt. In the process, this commit slightly weakens the
cross-check mechanism: before this commit, it would fire whenever
the pg_plan_advice module was loaded, even if pg_plan_advice wasn't
actually doing anything; now, it will only engage when we have some
other reason to create a pgpa_planner_state. The old way was complex
and didn't add much useful test coverage, so this seems like an
acceptable sacrifice.

Discussion: http://postgr.es/m/CA+TgmoYuWmN-00Ec5pY7zAcpSFQUQLbgAdVWGR9kOR-HM-fHrA@mail.gmail.com
Reviewed-by: Lukas Fittl <lukas@fittl.com>
2026-03-26 17:09:57 -04:00
..
amcheck Don't include storage/lock.h in so many headers 2026-03-24 17:11:12 +01:00
auth_delay Update copyright for 2026 2026-01-01 13:24:10 -05:00
auto_explain instrumentation: Keep time fields as instrtime, convert in callers 2026-01-09 13:38:00 -05:00
basebackup_to_shell Update copyright for 2026 2026-01-01 13:24:10 -05:00
basic_archive Fix dereference in a couple of GUC check hooks 2026-03-24 16:45:39 +01:00
bloom Discount the metapage when estimating number of index pages visited. 2026-03-20 14:50:53 -04:00
bool_plperl Update copyright for 2026 2026-01-01 13:24:10 -05:00
btree_gin Use fallthrough attribute instead of comment 2026-02-19 08:51:12 +01:00
btree_gist Improve type handling of varlena structures 2026-02-11 07:33:24 +09:00
citext Update copyright for 2026 2026-01-01 13:24:10 -05:00
cube Mark commented out code as unused 2026-01-22 12:44:07 +01:00
dblink Reduce header inclusions via execnodes.h 2026-03-16 14:34:57 +01:00
dict_int Update copyright for 2026 2026-01-01 13:24:10 -05:00
dict_xsyn Replace pg_mblen() with bounds-checked versions. 2026-02-09 12:44:04 +13:00
earthdistance Update copyright for 2026 2026-01-01 13:24:10 -05:00
file_fdw file_fdw: Add regression test for file_fdw with ON_ERROR='set_null' 2026-03-16 12:13:11 +09:00
fuzzystrmatch fuzzystrmatch: use pg_ascii_toupper(). 2026-01-12 08:54:04 -08:00
hstore Reduce header inclusions via execnodes.h 2026-03-16 14:34:57 +01:00
hstore_plperl Change StaticAssertVariableIsOfType to be a declaration 2026-02-03 08:46:02 +01:00
hstore_plpython Change StaticAssertVariableIsOfType to be a declaration 2026-02-03 08:46:02 +01:00
intagg Update copyright for 2026 2026-01-01 13:24:10 -05:00
intarray Harden _int_matchsel() against being attached to the wrong operator. 2026-02-09 10:14:22 -05:00
isn Fix additional fallthrough warnings from clang 2026-02-23 07:40:19 +01:00
jsonb_plperl Update copyright for 2026 2026-01-01 13:24:10 -05:00
jsonb_plpython Change StaticAssertVariableIsOfType to be a declaration 2026-02-03 08:46:02 +01:00
lo Update copyright for 2026 2026-01-01 13:24:10 -05:00
ltree Fix more multibyte issues in ltree. 2026-02-26 12:23:22 -08:00
ltree_plpython Change StaticAssertVariableIsOfType to be a declaration 2026-02-03 08:46:02 +01:00
oid2name Use pg_malloc_object() and pg_alloc_array() variants in frontend code 2026-02-27 18:59:41 +09:00
pageinspect Reduce header inclusions via execnodes.h 2026-03-16 14:34:57 +01:00
passwordcheck Update copyright for 2026 2026-01-01 13:24:10 -05:00
pg_buffercache Reduce header inclusions via execnodes.h 2026-03-16 14:34:57 +01:00
pg_freespacemap Update copyright for 2026 2026-01-01 13:24:10 -05:00
pg_logicalinspect Update copyright for 2026 2026-01-01 13:24:10 -05:00
pg_overexplain SQL Property Graph Queries (SQL/PGQ) 2026-03-16 10:14:18 +01:00
pg_plan_advice pg_plan_advice: Invent DO_NOT_SCAN(relation_identifier). 2026-03-26 17:09:57 -04:00
pg_prewarm Don't include wait_event.h in pgstat.h 2026-03-06 16:24:58 +01:00
pg_stat_statements plpgsql: optimize "SELECT simple-expression INTO var". 2026-03-20 18:23:45 -04:00
pg_surgery Update copyright for 2026 2026-01-01 13:24:10 -05:00
pg_trgm Fix local-variable shadowing in pg_trgm's printSourceNFA(). 2026-03-02 14:40:29 -05:00
pg_visibility Add all required calls to TupleDescFinalize() 2026-03-16 11:45:49 +13:00
pg_walinspect Report detailed errors from XLogFindNextRecord() failures. 2026-03-24 22:33:09 +09:00
pgcrypto Use fallthrough attribute instead of comment 2026-02-19 08:51:12 +01:00
pgrowlocks Reduce header inclusions via execnodes.h 2026-03-16 14:34:57 +01:00
pgstattuple pgstattuple: Optimize pgstattuple_approx() with streaming read 2026-03-14 15:06:13 +09:00
postgres_fdw ALTER SUBSCRIPTION ... SERVER test. 2026-03-18 10:15:51 -07:00
seg Mark commented out code as unused 2026-01-22 12:44:07 +01:00
sepgsql Update copyright for 2026 2026-01-01 13:24:10 -05:00
spi Update copyright for 2026 2026-01-01 13:24:10 -05:00
sslinfo Update copyright for 2026 2026-01-01 13:24:10 -05:00
start-scripts Remove gratuitous references to postmaster program 2023-01-26 10:48:32 +01:00
tablefunc Reduce header inclusions via execnodes.h 2026-03-16 14:34:57 +01:00
tcn Update copyright for 2026 2026-01-01 13:24:10 -05:00
test_decoding Standardize replication origin naming to use "ReplOrigin". 2026-01-28 11:03:29 -08:00
tsm_system_rows Update copyright for 2026 2026-01-01 13:24:10 -05:00
tsm_system_time Reduce header inclusions via execnodes.h 2026-03-16 14:34:57 +01:00
unaccent Update Unicode data to Unicode 17.0.0 2026-03-20 08:42:50 +01:00
uuid-ossp Fix accidentally cast away qualifiers 2026-01-26 16:02:31 +01:00
vacuumlo Update copyright for 2026 2026-01-01 13:24:10 -05:00
xml2 Reduce header inclusions via execnodes.h 2026-03-16 14:34:57 +01:00
contrib-global.mk Respect TEMP_CONFIG when pg_regress_check and friends are called 2016-02-27 12:28:21 -05:00
Makefile Add pg_plan_advice contrib module. 2026-03-12 13:00:43 -04:00
meson.build Add pg_plan_advice contrib module. 2026-03-12 13:00:43 -04:00
README Rename 'gmake' to 'make' in docs and recommended commands 2014-02-12 17:29:19 -05:00

The PostgreSQL contrib tree
---------------------------

This subtree contains porting tools, analysis utilities, and plug-in
features that are not part of the core PostgreSQL system, mainly
because they address a limited audience or are too experimental to be
part of the main source tree.  This does not preclude their
usefulness.

User documentation for each module appears in the main SGML
documentation.

When building from the source distribution, these modules are not
built automatically, unless you build the "world" target.  You can
also build and install them all by running "make all" and "make
install" in this directory; or to build and install just one selected
module, do the same in that module's subdirectory.

Some directories supply new user-defined functions, operators, or
types.  To make use of one of these modules, after you have installed
the code you need to register the new SQL objects in the database
system by executing a CREATE EXTENSION command.  In a fresh database,
you can simply do

    CREATE EXTENSION module_name;

See the PostgreSQL documentation for more information about this
procedure.