Thirteen suites build with their own make -C ... install instead of
pgc_build_and_install, so neither the build stamp (#536) nor the
object-provenance check (#1219) protects them. Found while building #1219's
end-to-end proof: my first attempt used smoke.sh and the guard never fired,
because smoke.sh never calls the guarded builder.
Demonstrated, not inferred
Same fixture as #1219's proof — PG18 objects in the tree, stamp written to say
17, run under PG17:
native_reclaim_frag.sh (routes through pgc_build_and_install)
-- the objects in the tree were not built against .../pg17/include/postgresql/server,
whatever the build stamp says; cleaning first
accounting: 4 passed + 0 failed = 4 PASSED
smoke.sh (its own make, line 55-58)
-- building
-- installing
pg_ctl: could not start server
FATAL: could not load library ".../pgcolumnar.so": undefined symbol: pqsignal_be
One major's objects installed into another's prefix, silently, with no clean
and no refusal.
The thirteen
audit concurrency extension_upgrade objstore_stash_recovery pg_upgrade
phase2 phase3 phase4 phase5 phase6 smoke unique_conc update_conc
267 of 277 suites route through pgc_setup, so this is the tail, not the
norm. run_all_versions.sh and run_coverage.sh also build directly, but the
matrix path is separately safe: it cleans each per-major copy right after its
cp -a, which the #536 comment in test/selftest/190-... already records and
which was measured when that issue was filed.
Scope
Pre-existing, and orthogonal to #1219 — that change makes the guarded path
strictly better and leaves these exactly as they were. Filing rather than
folding in, so the fix is reviewable on its own.
What the fix needs, and the part that is not obvious
Thirteen small edits are the easy half. The guard against it happening again is
the hard half: an arm asserting every suite either routes through the builder
or is named in an exception list rots the moment the list is the thing being
maintained — the same defect as the build stamp this came from, where a check
depended on hand-written bookkeeping and a hand-run command defeated it.
Deriving the population instead: a suite that calls make ... install and does
not call pgc_build_and_install is exactly the predicate used to produce the
list above, and it needs no list. Whether any of the thirteen build directly for
a reason is the open question — pg_upgrade and extension_upgrade plausibly
need two majors installed at once, which is precisely the case a single guarded
builder cannot express.
So the answer may be "fix eleven, and give the other two a way to say so" rather
than "fix thirteen".
🤖 Generated with Claude Code
https://claude.ai/code/session_01XiFn3HteTXnGdRiA2xDP2n
Thirteen suites build with their own
make -C ... installinstead ofpgc_build_and_install, so neither the build stamp (#536) nor theobject-provenance check (#1219) protects them. Found while building #1219's
end-to-end proof: my first attempt used
smoke.shand the guard never fired,because
smoke.shnever calls the guarded builder.Demonstrated, not inferred
Same fixture as #1219's proof — PG18 objects in the tree, stamp written to say
17, run under PG17:One major's objects installed into another's prefix, silently, with no clean
and no refusal.
The thirteen
267 of 277 suites route through
pgc_setup, so this is the tail, not thenorm.
run_all_versions.shandrun_coverage.shalso build directly, but thematrix path is separately safe: it cleans each per-major copy right after its
cp -a, which the #536 comment intest/selftest/190-...already records andwhich was measured when that issue was filed.
Scope
Pre-existing, and orthogonal to #1219 — that change makes the guarded path
strictly better and leaves these exactly as they were. Filing rather than
folding in, so the fix is reviewable on its own.
What the fix needs, and the part that is not obvious
Thirteen small edits are the easy half. The guard against it happening again is
the hard half: an arm asserting every suite either routes through the builder
or is named in an exception list rots the moment the list is the thing being
maintained — the same defect as the build stamp this came from, where a check
depended on hand-written bookkeeping and a hand-run command defeated it.
Deriving the population instead: a suite that calls
make ... installand doesnot call
pgc_build_and_installis exactly the predicate used to produce thelist above, and it needs no list. Whether any of the thirteen build directly for
a reason is the open question —
pg_upgradeandextension_upgradeplausiblyneed two majors installed at once, which is precisely the case a single guarded
builder cannot express.
So the answer may be "fix eleven, and give the other two a way to say so" rather
than "fix thirteen".
🤖 Generated with Claude Code
https://claude.ai/code/session_01XiFn3HteTXnGdRiA2xDP2n