diff --git a/CHANGELOG.md b/CHANGELOG.md index 6282c609d..908557c85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,28 @@ true until the next version shipped. ### Changed +- Five selftest parts and `rewrite_storage_oid` no longer hold a check that has + never been red (#1236). Nine checks now carry a mutation that reddens them, + each measured on all five majors: 570's fold arm, two in 290, one in 560, three + in 580 and both matview arms in `rewrite_storage_oid`. The `WITH DATA` matview + arm reddens on 17, 18 and 19 only, because PostgreSQL 15 and 16 fill a new + matview in place and the defect it guards cannot happen there. + + Three checks that only described their own fixture are renamed `premise:`, + two in 570 and one in 190, because no change to the code under test can + redden them. For 190's, that was measured rather than argued: replacing the + arm's comment strip with a raw read left all 1213 selftest checks green on + every major. The owner decided on 2026-10-12 that such checks are renamed, not + kept as arms or deleted. + +- Four more suites, `catalog_delete_index`, `catalog_plan_index`, + `projection_scan_cost` and `projection_parallel`, no longer hold a check that + has never been red (#1236). Nine arms and two premises now carry a mutation + that reddens them on all five majors. One arm in `projection_parallel`, + "workers share the covering projection scan", stayed green when no worker + shared anything, because it only asks that both workers produced rows. It + is recorded on #1236 rather than changed here. + - `test/pytest/README.md` now names all four registries a new pytest test has to be entered in, and which of them a local run can catch. Adding one test reddens CI from `expected_tests.txt`, `TESTS.md`, the ledger plus its budget, and diff --git a/test/check_ledger.tsv b/test/check_ledger.tsv index 09b6d615b..12ea66fbf 100644 --- a/test/check_ledger.tsv +++ b/test/check_ledger.tsv @@ -61,10 +61,10 @@ capability_sweep capability_sweep premise: the shim makes pyarrow unimportable 1 capability_sweep capability_sweep premise: the sweep is not in the population it sweeps 15;16;17;18;19 2026-09-23 the self-exclusion removed from pgc_cap_population, so the sweep enters its own population capability_sweep capability_sweep premise: the two derivations of the population name the same suites 15;16;17;18;19 never - capability_sweep capability_sweep premise: while python itself still runs under the shim 15;16;17;18;19 never - -catalog_delete_index catalog_delete_index A1 with more catalog pages the default does less work than reading every one whole 15;16;17;18;19 2026-09-24 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid -catalog_delete_index catalog_delete_index B1 with large catalogs the default does far less work than reading every one whole 15;16;17;18;19 2026-09-24 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid -catalog_delete_index catalog_delete_index P1 with a few catalog pages the default does less work than probing every one 15;16;17;18;19 2026-09-24 pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid -catalog_delete_index catalog_delete_index premise: row_group is larger than the threshold, so the two paths differ 15;16;17;18;19 2026-09-24 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes +catalog_delete_index catalog_delete_index A1 with more catalog pages the default does less work than reading every one whole 15;16;17;18;19 2026-10-12 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid +catalog_delete_index catalog_delete_index B1 with large catalogs the default does far less work than reading every one whole 15;16;17;18;19 2026-10-12 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid +catalog_delete_index catalog_delete_index P1 with a few catalog pages the default does less work than probing every one 15;16;17;18;19 2026-10-12 pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid +catalog_delete_index catalog_delete_index premise: row_group is larger than the threshold, so the two paths differ 15;16;17;18;19 2026-10-12 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes catalog_delete_index catalog_delete_index premise: the deep table grew the catalogs it is there to grow 15;16;17;18;19 never - catalog_delete_index catalog_delete_index premise: the drop fixture grew the catalogs it is there to grow 15;16;17;18;19 never - catalog_delete_index catalog_delete_index premise: the phase 0 catalogs hold only this file's tables 15;16;17;18;19 never - @@ -91,15 +91,15 @@ catalog_delete_index catalog_delete_index premise: two phase 0 compactions at th catalog_delete_index catalog_delete_index premise: two phase A compactions at the same setting agree well inside the floor 15;16;17;18;19 never - catalog_delete_index catalog_delete_index premise: two phase B compactions at the same setting agree well inside the floor 15;16;17;18;19 never - catalog_delete_index catalog_delete_index premise: two vacuums of the same table at the same setting agree well inside the floor 15;16;17;18;19 never - -catalog_delete_index catalog_delete_index the default's cost grows far less with the database than reading whole does 15;16;17;18;19 2026-09-24 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid -catalog_delete_index catalog_delete_index the drop's default does less catalog work than reading them whole 15;16;17;18;19 never - -catalog_delete_index catalog_delete_index the vacuum's default does less row_group work than reading it whole 15;16;17;18;19 2026-09-24 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid -catalog_delete_index catalog_delete_index with few catalog pages the drop's default does less work than probing every one 15;16;17;18;19 never - +catalog_delete_index catalog_delete_index the default's cost grows far less with the database than reading whole does 15;16;17;18;19 2026-10-12 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid +catalog_delete_index catalog_delete_index the drop's default does less catalog work than reading them whole 15;16;17;18;19 2026-10-12 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes +catalog_delete_index catalog_delete_index the vacuum's default does less row_group work than reading it whole 15;16;17;18;19 2026-10-12 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes;the eight converted scan sites back to InvalidOid +catalog_delete_index catalog_delete_index with few catalog pages the drop's default does less work than probing every one 15;16;17;18;19 2026-10-12 pgcolumnar_index_min_blocks default 3 -> 2147483647, so no site probes;pgcolumnar_scan_index_oid stops asking the relation its size, so every site probes catalog_plan_index catalog_plan_index a no-qual count did not sequentially scan pgcolumnar.storage 15;16;17;18;19 2026-09-23 both storage_id scans reverted to InvalidOid, so the catalog is swept sequentially on its own primary key catalog_plan_index catalog_plan_index and touches the empty catalogs not at all 15;16;17;18;19 2026-09-24 only the five options_pkey sites reverted, the two projection ones kept;pgcolumnar_scan_index_oid stops asking the relation its size;the seven planner sites back to the unconditional pgcolumnar_index_oid catalog_plan_index catalog_plan_index planning a join probed pgcolumnar.storage through storage_pkey 15;16;17;18;19 2026-09-23 both storage_id scans reverted to InvalidOid, so the catalog is swept sequentially on its own primary key catalog_plan_index catalog_plan_index planning costs less than probing both catalogs would 15;16;17;18;19 2026-09-24 pgcolumnar_scan_index_oid stops asking the relation its size;the seven planner sites back to the unconditional pgcolumnar_index_oid -catalog_plan_index catalog_plan_index planning over the newest columnar table did not sequentially scan pgcolumnar.storage 15;16;17;18;19 never - +catalog_plan_index catalog_plan_index planning over the newest columnar table did not sequentially scan pgcolumnar.storage 15;16;17;18;19 2026-10-12 pgcolumnar_written_stripe_row_limit looks its storage row up by relation_oid again (the #1210 change reverted) catalog_plan_index catalog_plan_index premise: a covering projection gave the table a second storage row 15;16;17;18;19 never - catalog_plan_index catalog_plan_index premise: a no-qual count over a columnar table touched storage at all 15;16;17;18;19 never - catalog_plan_index catalog_plan_index premise: forcing the probe costs something, so the instrument measured 15;16;17;18;19 never - @@ -119,8 +119,8 @@ catalog_plan_index catalog_plan_index premise: the two storage rows disagree abo catalog_plan_index catalog_plan_index premise: the update put the projection row in front 15;16;17;18;19 never - catalog_plan_index catalog_plan_index premise: this fixture is the default configuration, both catalogs empty 15;16;17;18;19 never - catalog_plan_index catalog_plan_index premise: this query shape is priced differently under the two limits 15;16;17;18;19 never - -catalog_plan_index catalog_plan_index the newest columnar table costs no more catalog work than the oldest 15;16;17;18;19 never - -catalog_plan_index catalog_plan_index the planned cost does not depend on which storage row the heap returns first 15;16;17;18;19 never - +catalog_plan_index catalog_plan_index the newest columnar table costs no more catalog work than the oldest 15;16;17;18;19 2026-10-12 pgcolumnar_written_stripe_row_limit looks its storage row up by relation_oid again (the #1210 change reverted) +catalog_plan_index catalog_plan_index the planned cost does not depend on which storage row the heap returns first 15;16;17;18;19 2026-10-12 pgcolumnar_written_stripe_row_limit looks its storage row up by relation_oid again (the #1210 change reverted) catalog_plan_index catalog_plan_index with the catalog populated, planning costs less than reading it whole 15;16;17;18;19 2026-09-24 pgcolumnar_scan_index_oid stops asking the relation its size;the seven planner sites back to the unconditional pgcolumnar_index_oid catalog_scan_index catalog_scan_index a one-row delete does not read pgcolumnar.row_group whole 15;16;17;18;19 2026-10-12 the twelve converted sites reverted to InvalidOid, so each reads its catalog whole catalog_scan_index catalog_scan_index a parallel bulk load does not read pgcolumnar.storage whole 15;16;17;18;19 2026-10-12 the twelve converted sites reverted to InvalidOid, so each reads its catalog whole @@ -540,7 +540,6 @@ harness_selftest 180-the-port-walk-must-wrap-not premise: the auxiliary band has harness_selftest 180-the-port-walk-must-wrap-not premise: the real prober was restored, or every check after this lies 15;16;17;18;19 never - harness_selftest 180-the-port-walk-must-wrap-not premise: the stub frees exactly one port, 500 past the floor 15;16;17;18;19 never - harness_selftest 180-the-port-walk-must-wrap-not premise: the stub really does refuse the top of the band 15;16;17;18;19 never - -harness_selftest 190-an-in-tree-build-must-not a comment naming the call does not satisfy the arm above 15;16;17;18;19 never - harness_selftest 190-an-in-tree-build-must-not an unknown provenance is not reported as a major 15;16;17;18;19 2026-09-23 an unknown provenance is reported as a major, PG?, instead of saying none was recorded harness_selftest 190-an-in-tree-build-must-not an unparseable stamp cleans rather than guessing 15;16;17;18;19 2026-09-23 pgc_build_needs_clean never asks for a clean harness_selftest 190-an-in-tree-build-must-not and an empty WANT is refused rather than compared 15;16;17;18;19 2026-09-23 pgc_build_needs_clean never asks for a clean @@ -551,9 +550,10 @@ harness_selftest 190-an-in-tree-build-must-not building a DIFFERENT major needs harness_selftest 190-an-in-tree-build-must-not building the same major again needs no clean 15;16;17;18;19 2026-09-23 pgc_build_needs_clean always demands a clean harness_selftest 190-an-in-tree-build-must-not but a tree with no objects at all needs nothing, stamp or not 15;16;17;18;19 2026-09-23 pgc_build_needs_clean always demands a clean harness_selftest 190-an-in-tree-build-must-not objects with NO stamp are unknown provenance and must be cleaned 15;16;17;18;19 2026-09-23 pgc_build_needs_clean never asks for a clean +harness_selftest 190-an-in-tree-build-must-not premise: stripping comments drops a call named only in a comment 15;16;17;18;19 never - harness_selftest 190-an-in-tree-build-must-not premise: the build-stamp decision is exposed to be judged 15;16;17;18;19 never - harness_selftest 190-an-in-tree-build-must-not premise: the stamp writer is a function that can be exercised 15;16;17;18;19 never - -harness_selftest 190-an-in-tree-build-must-not the build path asks pgc_build_needs_clean rather than merely naming it 15;16;17;18;19 2026-09-23 the call replaced by a comment naming it +harness_selftest 190-an-in-tree-build-must-not the build path asks pgc_build_needs_clean rather than merely naming it 15;16;17;18;19 2026-10-12 pgc_build_and_install stops consulting the build stamp: its pgc_build_needs_clean branch becomes elif false;the call replaced by a comment naming it harness_selftest 190-an-in-tree-build-must-not the stamp lib.sh writes is exactly the major 15;16;17;18;19 2026-09-23 the build stamp writes an escaped literal, restoring the #898 bug harness_selftest 200-additions-go-in-their-own-file premise: the parts directory exists and was sourced 15;16;17;18;19 never - harness_selftest 200-additions-go-in-their-own-file the driver holds no checks; they all live in parts 15;16;17;18;19 never - @@ -627,11 +627,11 @@ harness_selftest 280-the-shared-cluster-config-must-not the per-suite escape hat harness_selftest 280-the-shared-cluster-config-must-not the shared cluster config sets no pgcolumnar.* GUC 15;16;17;18;19 never - harness_selftest 290-a-preflight-that-built-nothing a preflight that built nothing does not report PASSED 15;16;17;18;19 2026-09-24 the zero-build refusal removed, so a preflight that built nothing reports PASSED harness_selftest 290-a-preflight-that-built-nothing a preflight that built nothing exits non-zero 15;16;17;18;19 2026-09-24 the zero-build refusal removed, so a preflight that built nothing reports PASSED -harness_selftest 290-a-preflight-that-built-nothing a preflight that built nothing says how many it built 15;16;17;18;19 never - +harness_selftest 290-a-preflight-that-built-nothing a preflight that built nothing says how many it built 15;16;17;18;19 2026-10-12 build_all_versions.sh prints no built N of M line, so a run that built nothing no longer says how many it built harness_selftest 290-a-preflight-that-built-nothing a tree full of objects is reported clean after the sweep 15;16;17;18;19 2026-09-24 the cleaner always answers dirty, whatever the detector says;the find sweep removed, so only make clean is relied on;the sweep looks only in src/, missing objstore/ harness_selftest 290-a-preflight-that-built-nothing a tree holding objects is detected as holding them 15;16;17;18;19 2026-09-24 the detector blinded, so it never reports an object harness_selftest 290-a-preflight-that-built-nothing a tree with nothing to remove is clean, not an error 15;16;17;18;19 2026-09-24 the cleaner always answers dirty, whatever the detector says;the find sweep removed, so only make clean is relied on;the sweep looks only in src/, missing objstore/ -harness_selftest 290-a-preflight-that-built-nothing and a directory that is not there holds none 15;16;17;18;19 never - +harness_selftest 290-a-preflight-that-built-nothing and a directory that is not there holds none 15;16;17;18;19 2026-10-12 the leftover detector answers yes for a directory that is not there harness_selftest 290-a-preflight-that-built-nothing and a directory that is not there is dirty rather than silently clean 15;16;17;18;19 2026-09-24 the missing-or-empty directory guard removed harness_selftest 290-a-preflight-that-built-nothing and clean when it reports none 15;16;17;18;19 2026-09-24 the cleaner always answers dirty, whatever the detector says harness_selftest 290-a-preflight-that-built-nothing and it left the source alone 15;16;17;18;19 2026-09-24 the sweep loses its name filter and deletes every file it finds @@ -1515,7 +1515,7 @@ harness_selftest 560-the-objects-decide-which-major a caller that only MENTIONS harness_selftest 560-the-objects-decide-which-major a tree with no objects reports unknown, not a false match 15;16;17;18;19 2026-09-23 the helper forced to yes or no, its wiring removed, or the comment stripping removed harness_selftest 560-the-objects-decide-which-major an object with no debug info reports UNKNOWN, so the stamp still decides 15;16;17;18;19 2026-09-23 the helper forced to yes or no, its wiring removed, or the comment stripping removed harness_selftest 560-the-objects-decide-which-major an unreadable pg_config fails CLOSED rather than assuming a match 15;16;17;18;19 2026-09-23 the helper forced to yes or no, its wiring removed, or the comment stripping removed -harness_selftest 560-the-objects-decide-which-major and it still consults the stamp, which answers when the objects cannot 15;16;17;18;19 never - +harness_selftest 560-the-objects-decide-which-major and it still consults the stamp, which answers when the objects cannot 15;16;17;18;19 2026-10-12 pgc_build_and_install stops consulting the build stamp: its pgc_build_needs_clean branch becomes elif false harness_selftest 560-the-objects-decide-which-major objects are reported FOREIGN to an includedir they were not built against 15;16;17;18;19 2026-09-23 the helper forced to yes or no, its wiring removed, or the comment stripping removed harness_selftest 560-the-objects-decide-which-major pgc_build_and_install consults the objects, not only the stamp 15;16;17;18;19 2026-09-23 the helper forced to yes or no, its wiring removed, or the comment stripping removed harness_selftest 560-the-objects-decide-which-major premise: an object compiled without -g carries no debug sections 15;16;17;18;19 never - @@ -1525,25 +1525,25 @@ harness_selftest 560-the-objects-decide-which-major premise: the object-provenan harness_selftest 560-the-objects-decide-which-major premise: the tree under test holds objects to judge 15;16;17;18;19 never - harness_selftest 560-the-objects-decide-which-major the objects of this very run are never called foreign to their own pg_config 15;16;17;18;19 2026-09-23 the helper forced to yes or no, its wiring removed, or the comment stripping removed harness_selftest 570-a-checkout-test-must-ask-git a gitfile directory is its own work tree 15;16;17;18;19 2026-09-23 the work-tree reader insists .git is a directory;the work-tree reader this part evals is renamed away -harness_selftest 570-a-checkout-test-must-ask-git a gitfile is a regular file, which a directory test cannot accept 15;16;17;18;19 never - harness_selftest 570-a-checkout-test-must-ask-git a test split over a line continuation is not invisible to the sweep 15;16;17;18;19 2026-09-23 the fold helper stops folding and only strips comments -harness_selftest 570-a-checkout-test-must-ask-git and it is still a .git that a reader must not skip on 15;16;17;18;19 never - -harness_selftest 570-a-checkout-test-must-ask-git and matches none of .gitignore, .gitattributes, .github or a plain dir 15;16;17;18;19 2026-09-23 the same planted line, read by the pattern shipped in #1224;the sweep pattern loses its trailing non-word boundary;the sweep pattern shipped in #1224 is restored verbatim -harness_selftest 570-a-checkout-test-must-ask-git and unfolded it is invisible, so the fold is what finds it 15;16;17;18;19 never - +harness_selftest 570-a-checkout-test-must-ask-git and matches none of .gitignore, .gitattributes, .github or a plain dir 15;16;17;18;19 2026-10-12 the .git pattern relaxed to match the bare name, so a test split over a line continuation is found without folding and the fold stops being what finds it;the same planted line, read by the pattern shipped in #1224;the sweep pattern loses its trailing non-word boundary;the sweep pattern shipped in #1224 is restored verbatim +harness_selftest 570-a-checkout-test-must-ask-git and unfolded it is invisible, so the fold is what finds it 15;16;17;18;19 2026-10-12 the .git pattern relaxed to match the bare name, so a test split over a line continuation is found without folding and the fold stops being what finds it harness_selftest 570-a-checkout-test-must-ask-git but a directory inside another repository is NOT its own work tree 15;16;17;18;19 2026-09-23 the work-tree reader decides with the bare rev-parse, not --show-toplevel -harness_selftest 570-a-checkout-test-must-ask-git no suite decides it is a checkout by stat-ing .git as a directory 15;16;17;18;19 2026-09-23 a .git test split over a line continuation is planted in a real suite;a quote-before-the-slash .git test is planted in a real suite;one test form is spelled literally instead of built from a fragment;the -d form restored in extension_upgrade, or the comment stripping removed;the sweep stops stripping comments before reading the suites;the work-tree reader insists .git is a directory +harness_selftest 570-a-checkout-test-must-ask-git no suite decides it is a checkout by stat-ing .git as a directory 15;16;17;18;19 2026-10-12 a .git test split over a line continuation is planted in a real suite;a quote-before-the-slash .git test is planted in a real suite;one test form is spelled literally instead of built from a fragment;the -d form restored in extension_upgrade, or the comment stripping removed;the .git pattern relaxed to match the bare name, so a test split over a line continuation is found without folding and the fold stops being what finds it;the sweep stops stripping comments before reading the suites;the work-tree reader insists .git is a directory harness_selftest 570-a-checkout-test-must-ask-git premise: five legitimate spellings were built to test against 15;16;17;18;19 never - harness_selftest 570-a-checkout-test-must-ask-git premise: it is callable once evalled 15;16;17;18;19 2026-09-23 the work-tree reader this part evals is renamed away harness_selftest 570-a-checkout-test-must-ask-git premise: rev-parse does answer for the nested directory 15;16;17;18;19 never - harness_selftest 570-a-checkout-test-must-ask-git premise: some suite already asks git whether it can answer 15;16;17;18;19 never - -harness_selftest 570-a-checkout-test-must-ask-git premise: stripping the boundary actually changed the pattern 15;16;17;18;19 2026-09-23 the boundary in the sweep pattern drifts, so the strip becomes a no-op;the derived control stops stripping the boundary;the same planted line, read by the pattern shipped in #1224;the sweep pattern loses its trailing non-word boundary;the sweep pattern shipped in #1224 is restored verbatim +harness_selftest 570-a-checkout-test-must-ask-git premise: stripping the boundary actually changed the pattern 15;16;17;18;19 2026-10-12 the .git pattern relaxed to match the bare name, so a test split over a line continuation is found without folding and the fold stops being what finds it;the boundary in the sweep pattern drifts, so the strip becomes a no-op;the derived control stops stripping the boundary;the same planted line, read by the pattern shipped in #1224;the sweep pattern loses its trailing non-word boundary;the sweep pattern shipped in #1224 is restored verbatim harness_selftest 570-a-checkout-test-must-ask-git premise: ten spellings were built to test the pattern against 15;16;17;18;19 never - harness_selftest 570-a-checkout-test-must-ask-git premise: the continuation fixture really is two lines 15;16;17;18;19 never - +harness_selftest 570-a-checkout-test-must-ask-git premise: the gitfile fixture exists, so a reader must not skip it 15;16;17;18;19 never - +harness_selftest 570-a-checkout-test-must-ask-git premise: the gitfile fixture is a regular file, not a directory 15;16;17;18;19 never - harness_selftest 570-a-checkout-test-must-ask-git premise: the suite defines the work-tree reader this part evals 15;16;17;18;19 2026-09-23 the work-tree reader this part evals is renamed away harness_selftest 570-a-checkout-test-must-ask-git premise: the sweep sees .git mentioned in the suites at all 15;16;17;18;19 never - harness_selftest 570-a-checkout-test-must-ask-git the sweep matches every spelling that stats .git as a directory 15;16;17;18;19 2026-09-23 the same planted line, read by the pattern shipped in #1224;the sweep pattern shipped in #1224 is restored verbatim -harness_selftest 570-a-checkout-test-must-ask-git without the trailing boundary the same pattern flags three of them 15;16;17;18;19 2026-09-23 the boundary in the sweep pattern drifts, so the strip becomes a no-op;the derived control stops stripping the boundary -harness_selftest 580-a-hand-rebuild-must-record a PostgreSQL symbol is NOT exempt, so the check still has a subject 15;16;17;18;19 2026-09-25 the symbol exemption matches every name, so the check has no subject left and a genuinely mislinked major would resolve clean +harness_selftest 570-a-checkout-test-must-ask-git without the trailing boundary the same pattern flags three of them 15;16;17;18;19 2026-10-12 the .git pattern relaxed to match the bare name, so a test split over a line continuation is found without folding and the fold stops being what finds it;the boundary in the sweep pattern drifts, so the strip becomes a no-op;the derived control stops stripping the boundary +harness_selftest 580-a-hand-rebuild-must-record a PostgreSQL symbol is NOT exempt, so the check still has a subject 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh;the symbol exemption matches every name, so the check has no subject left and a genuinely mislinked major would resolve clean harness_selftest 580-a-hand-rebuild-must-record a log that is not there also produces a diagnosis 15;16;17;18;19 2026-09-24 _hr_diagnose restored to its silent `[ -s ] || return 0` form, so an empty or missing rebuild.log prints nothing at all harness_selftest 580-a-hand-rebuild-must-record a log with content produces a diagnosis to print 15;16;17;18;19 2026-09-24 rebuild.sh forced to fail after its stamp AND _hr_diagnose gutted, so the failure prints no reason harness_selftest 580-a-hand-rebuild-must-record a rebuild that failed skips them rather than reading a stamp it did not write 15;16;17;18;19 2026-09-24 driven alone, with no forced rebuild failure, because these two arms call the gate with literals and the rebuild's status never reaches them;the gate reverted so a failed rebuild still runs the arms beneath it @@ -1554,31 +1554,31 @@ harness_selftest 580-a-hand-rebuild-must-record and it distinguishes missing fro harness_selftest 580-a-hand-rebuild-must-record and it names the log as empty rather than printing a bare banner 15;16;17;18;19 2026-09-24 _hr_diagnose restored to its silent `[ -s ] || return 0` form, so an empty or missing rebuild.log prints nothing at all harness_selftest 580-a-hand-rebuild-must-record and it never reaches the pg_config check it would otherwise fail on 15;16;17;18;19 2026-09-25 rebuild.sh's fail-closed assertion is removed, so a missing exemption function leaves the undefined list empty and the check reports success harness_selftest 580-a-hand-rebuild-must-record and it reads a different source as stale rather than fresh 15;16;17;18;19 2026-09-23 the record call removed from rebuild.sh, so no stamp is written at all -harness_selftest 580-a-hand-rebuild-must-record and it writes a reason, so there is something for the gate to print 15;16;17;18;19 2026-09-24 rebuild.sh exits without saying why, so the gate has nothing to print -harness_selftest 580-a-hand-rebuild-must-record and neither is one of ours 15;16;17;18;19 2026-09-25 the symbol exemption matches every name, so the check has no subject left and a genuinely mislinked major would resolve clean -harness_selftest 580-a-hand-rebuild-must-record and so are the ITM and gmon hooks this check always ignored 15;16;17;18;19 2026-09-25 the symbol exemption matches nothing, so every toolchain name rebuild.sh has always ignored is reported as an unresolved symbol +harness_selftest 580-a-hand-rebuild-must-record and it writes a reason, so there is something for the gate to print 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh;rebuild.sh exits without saying why, so the gate has nothing to print;rebuild.sh words its missing pg_config refusal differently, so the control no longer sees it +harness_selftest 580-a-hand-rebuild-must-record and neither is one of ours 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh;the symbol exemption matches every name, so the check has no subject left and a genuinely mislinked major would resolve clean +harness_selftest 580-a-hand-rebuild-must-record and so are the ITM and gmon hooks this check always ignored 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh;the symbol exemption matches nothing, so every toolchain name rebuild.sh has always ignored is reported as an unresolved symbol harness_selftest 580-a-hand-rebuild-must-record and the diagnosis carries the failing line, not just a status 15;16;17;18;19 2026-09-24 rebuild.sh forced to fail after its stamp AND _hr_diagnose gutted, so the failure prints no reason harness_selftest 580-a-hand-rebuild-must-record and the freshness gate then reads the tree as built from this source 15;16;17;18;19 2026-09-23 the record call removed from rebuild.sh, so no stamp is written at all harness_selftest 580-a-hand-rebuild-must-record and the installed library of the running major was never touched 15;16;17;18;19 2026-09-23 the shim answers --pkglibdir with the real prefix, so the install is not redirected harness_selftest 580-a-hand-rebuild-must-record and writes no stamp into the directory it was called from 15;16;17;18;19 2026-09-23 the argument guard removed from pgc_record_source_stamp -harness_selftest 580-a-hand-rebuild-must-record control: and it does NOT blame the exemption 15;16;17;18;19 never - -harness_selftest 580-a-hand-rebuild-must-record control: with the exemption present, the same call fails on the pg_config 15;16;17;18;19 never - +harness_selftest 580-a-hand-rebuild-must-record control: and it does NOT blame the exemption 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh +harness_selftest 580-a-hand-rebuild-must-record control: with the exemption present, the same call fails on the pg_config 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh;rebuild.sh words its missing pg_config refusal differently, so the control no longer sees it harness_selftest 580-a-hand-rebuild-must-record premise: a rebuild with no pg_config fails 15;16;17;18;19 never - harness_selftest 580-a-hand-rebuild-must-record premise: and the callers are still there, so this is scope not syntax 15;16;17;18;19 never - harness_selftest 580-a-hand-rebuild-must-record premise: lib.sh has one recorder for what was installed 15;16;17;18;19 2026-09-23 pgc_record_source_stamp removed from lib.sh harness_selftest 580-a-hand-rebuild-must-record premise: no stamp for this prefix before the rebuild 15;16;17;18;19 2026-09-23 the shim answers --pkglibdir with the real prefix, so the install is not redirected harness_selftest 580-a-hand-rebuild-must-record premise: the diagnosis is exposed too 15;16;17;18;19 never - harness_selftest 580-a-hand-rebuild-must-record premise: the gating decision is exposed to be judged 15;16;17;18;19 never - -harness_selftest 580-a-hand-rebuild-must-record premise: the hand rebuild itself succeeded 15;16;17;18;19 2026-09-25 rebuild.sh forced to exit 1 after writing its stamp, reproducing the aarch64 shape;rebuild.sh forced to fail after its stamp AND _hr_diagnose gutted, so the failure prints no reason;rebuild.sh forced to fail after its stamp AND the gate reverted, so a failed rebuild still runs the arms beneath it;the symbol exemption matches nothing, so every toolchain name rebuild.sh has always ignored is reported as an unresolved symbol +harness_selftest 580-a-hand-rebuild-must-record premise: the hand rebuild itself succeeded 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh;rebuild.sh forced to exit 1 after writing its stamp, reproducing the aarch64 shape;rebuild.sh forced to fail after its stamp AND _hr_diagnose gutted, so the failure prints no reason;rebuild.sh forced to fail after its stamp AND the gate reverted, so a failed rebuild still runs the arms beneath it;the symbol exemption matches nothing, so every toolchain name rebuild.sh has always ignored is reported as an unresolved symbol harness_selftest 580-a-hand-rebuild-must-record premise: the hand rebuild tool installs, so a stale record is possible 15;16;17;18;19 never - harness_selftest 580-a-hand-rebuild-must-record premise: the mutation left lib.sh loadable 15;16;17;18;19 never - harness_selftest 580-a-hand-rebuild-must-record premise: the mutation removed the definition and nothing else 15;16;17;18;19 never - harness_selftest 580-a-hand-rebuild-must-record premise: the shim redirects the install away from the real prefix 15;16;17;18;19 2026-09-23 the shim answers --pkglibdir with the real prefix, so the install is not redirected -harness_selftest 580-a-hand-rebuild-must-record premise: the symbol exemption is exposed to be judged 15;16;17;18;19 never - -harness_selftest 580-a-hand-rebuild-must-record the exemption sees through an @GLIBC version suffix 15;16;17;18;19 2026-09-25 the symbol exemption matches nothing, so every toolchain name rebuild.sh has always ignored is reported as an unresolved symbol +harness_selftest 580-a-hand-rebuild-must-record premise: the symbol exemption is exposed to be judged 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh +harness_selftest 580-a-hand-rebuild-must-record the exemption sees through an @GLIBC version suffix 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh;the symbol exemption matches nothing, so every toolchain name rebuild.sh has always ignored is reported as an unresolved symbol harness_selftest 580-a-hand-rebuild-must-record the hand rebuild tool records what it installed rather than only naming it 15;16;17;18;19 2026-09-23 the record call removed from rebuild.sh, or the comment stripping removed harness_selftest 580-a-hand-rebuild-must-record the recorder refuses when it is not told what was installed 15;16;17;18;19 2026-09-23 the argument guard removed from pgc_record_source_stamp -harness_selftest 580-a-hand-rebuild-must-record the stack canary object is exempt, whatever the architecture calls it 15;16;17;18;19 2026-09-25 the symbol exemption matches nothing, so every toolchain name rebuild.sh has always ignored is reported as an unresolved symbol +harness_selftest 580-a-hand-rebuild-must-record the stack canary object is exempt, whatever the architecture calls it 15;16;17;18;19 2026-10-12 pgc_symbol_is_toolchain deleted from the real lib.sh;the symbol exemption matches nothing, so every toolchain name rebuild.sh has always ignored is reported as an unresolved symbol harness_selftest 580-a-hand-rebuild-must-record without the exemption it refuses EARLIER, naming the missing function 15;16;17;18;19 2026-09-25 rebuild.sh's fail-closed assertion is removed, so a missing exemption function leaves the undefined list empty and the check reports success harness_selftest 590-a-declared-suite-must-account a completed suite still reads as having reached its summary 15;16;17;18;19 never - harness_selftest 590-a-declared-suite-must-account a suite that DID reach its summary is not given a second one 15;16;17;18;19 2026-09-23 the EXIT trap reverted to the bare pgc_teardown, so the eight pgc_setup exits emit no accounting @@ -1753,7 +1753,7 @@ parallel_scan_cost parallel_scan_cost premise: the table holds every inserted ro parallel_scan_cost parallel_scan_cost the leader-participation branch changes the divisor 15;16;17;18;19 never - projection_parallel projection_parallel a covering projection can be a parallel scan 15;16;17;18;19 2026-09-18 - projection_parallel projection_parallel a page cost that makes I/O dominate costs the parallel covering path 15;16;17;18;19 2026-09-23 the partial covering total amortises I/O as well as CPU: (ioRunProj + cpuRunProj) / divisor -projection_parallel projection_parallel a parallel covering projection returns the covering rows once 15;16;17;18;19 never - +projection_parallel projection_parallel a parallel covering projection returns the covering rows once 15;16;17;18;19 2026-10-12 a parallel worker never wires the shared row-group counter, so every worker scans every group projection_parallel projection_parallel premise: ANALYZE printed a rows= line per launched worker 15;16;17;18;19 never - projection_parallel projection_parallel premise: EXPLAIN ANALYZE launched two workers 15;16;17;18;19 never - projection_parallel projection_parallel premise: a covering projection exists 15;16;17;18;19 never - @@ -1762,23 +1762,23 @@ projection_parallel projection_parallel premise: a serial covering query uses th projection_parallel projection_parallel premise: the covering plan is parallel at the default page cost 15;16;17;18;19 never - projection_parallel projection_parallel premise: the table holds every inserted row 15;16;17;18;19 never - projection_parallel projection_parallel workers share the covering projection scan, it is not a single claimer 15;16;17;18;19 2026-09-18 first-wins-claimer -projection_scan_cost projection_scan_cost a clause that mentions the sort key but cannot prune on it does not cheapen a covering projection 15;16;17;18;19 never - +projection_scan_cost projection_scan_cost a clause that mentions the sort key but cannot prune on it does not cheapen a covering projection 15;16;17;18;19 2026-10-12 a covering projection is discounted for any clause that mentions the sort key, as before #1126 projection_scan_cost projection_scan_cost a non-sort-key restriction does not cheapen a covering projection 15;16;17;18;19 2026-09-18 - -projection_scan_cost projection_scan_cost a tight covering projection is cheaper relative to the base than a loose one 15;16;17;18;19 2026-09-17 - -projection_scan_cost projection_scan_cost and an IN-list on the sort key keeps its discount, which gating on exactness would lose 15;16;17;18;19 never - +projection_scan_cost projection_scan_cost a tight covering projection is cheaper relative to the base than a loose one 15;16;17;18;19 2026-10-12 no restriction ever earns the sort-key discount +projection_scan_cost projection_scan_cost and an IN-list on the sort key keeps its discount, which gating on exactness would lose 15;16;17;18;19 2026-10-12 no restriction ever earns the sort-key discount;the sort-key discount is gated on an exact scan key, so an IN-list loses it projection_scan_cost projection_scan_cost premise: a covering projection exists 15;16;17;18;19 never - projection_scan_cost projection_scan_cost premise: every compared scan has a positive run cost 15;16;17;18;19 never - projection_scan_cost projection_scan_cost premise: every misattributed scan has a positive run cost 15;16;17;18;19 never - projection_scan_cost projection_scan_cost premise: every unprunable-clause scan has a positive run cost 15;16;17;18;19 never - -projection_scan_cost projection_scan_cost premise: the loose plan uses the covering projection 15;16;17;18;19 never - +projection_scan_cost projection_scan_cost premise: the loose plan uses the covering projection 15;16;17;18;19 2026-10-12 no restriction ever earns the sort-key discount projection_scan_cost projection_scan_cost premise: the misattributed query has a covering projection 15;16;17;18;19 never - projection_scan_cost projection_scan_cost premise: the prunable range is priced above the one-stripe floor, so the arms differ 15;16;17;18;19 never - projection_scan_cost projection_scan_cost premise: the table holds every inserted row 15;16;17;18;19 never - -projection_scan_cost projection_scan_cost premise: the tight plan uses the covering projection 15;16;17;18;19 never - +projection_scan_cost projection_scan_cost premise: the tight plan uses the covering projection 15;16;17;18;19 2026-10-12 no restriction ever earns the sort-key discount projection_scan_cost projection_scan_cost premise: without the projection scan, the loose plan is a base columnar scan 15;16;17;18;19 never - projection_scan_cost projection_scan_cost premise: without the projection scan, the tight plan is a base columnar scan 15;16;17;18;19 never - projection_scan_cost projection_scan_cost tight and loose covering scans are not both priced at half the base 15;16;17;18;19 2026-09-17 - -projection_scan_cost projection_scan_cost while a plain range on the sort key still earns its discount 15;16;17;18;19 never - +projection_scan_cost projection_scan_cost while a plain range on the sort key still earns its discount 15;16;17;18;19 2026-10-12 no restriction ever earns the sort-key discount projection_scan_io projection_scan_io a covering projection is not priced from the base table's pages 15;16;17;18;19 2026-09-19 rel->pages projection_scan_io projection_scan_io a covering projection whose storage cannot be found is not priced as one page 15;16;17;18;19 2026-09-21 return 1 projection_scan_io projection_scan_io an empty covering projection is still priced as one page, so it is chosen 15;16;17;18;19 2026-09-23 pages = 997 on the third return of pgcolumnar_projection_pages @@ -1821,9 +1821,9 @@ range_pruning range_pruning premise: the range type collates differently from it range_pruning range_pruning so does a containment probe 15;16;17;18;19 never - range_pruning range_pruning the overlap qual is pushed down, where it used to be dropped 15;16;17;18;19 never - range_pruning range_pruning the same for a containment probe far to its right 15;16;17;18;19 never - -rewrite_storage_oid rewrite_storage_oid a matview created WITH DATA leaves its storage row pointing at itself 15;16;17;18;19 never - +rewrite_storage_oid rewrite_storage_oid a matview created WITH DATA leaves its storage row pointing at itself 15;16;17;18;19 2026-10-12 the rewrite repair gate no longer covers CreateTableAsStmt, so a matview created WITH DATA keeps the transient's OID rewrite_storage_oid rewrite_storage_oid a type rewrite leaves the storage row pointing at the live table 15;16;17;18;19 2026-09-24 the rewrite hook does not retarget storage.relation_oid -rewrite_storage_oid rewrite_storage_oid and REFRESH still leaves it pointing at itself 15;16;17;18;19 never - +rewrite_storage_oid rewrite_storage_oid and REFRESH still leaves it pointing at itself 15;16;17;18;19 2026-10-12 the rewrite repair gate no longer covers RefreshMatViewStmt rewrite_storage_oid rewrite_storage_oid premise: CREATE TABLE ... AS leaves its storage row pointing at itself 15;16;17;18;19 never - rewrite_storage_oid rewrite_storage_oid premise: a table that was not rewritten still points at itself 15;16;17;18;19 never - rewrite_storage_oid rewrite_storage_oid premise: the CREATE TABLE AS table holds them too 15;16;17;18;19 never - diff --git a/test/check_ledger_budget.txt b/test/check_ledger_budget.txt index 2a338303e..865dc8a8c 100644 --- a/test/check_ledger_budget.txt +++ b/test/check_ledger_budget.txt @@ -1189,4 +1189,38 @@ suites_not_covered 247 # # suites_not_covered does not move: the suite is registered and covered in the # same change. -checks_never_observed_red 1671 +# +# REBUILT ONTO c1e253f, after #1285 landed. The ledger rows were not merged by +# hand: the same mutation logs were merged again by a script, and that script run +# on be31874 reproduces the pre-rebase ledger byte for byte. +# +# #1236, first batch: 1671 -> 1662. Nine checks dated, all from mutation runs on +# all five majors, merged one log at a time with --mutation and --target: +# +# harness_selftest 570 1 the fold arm (its four neighbours were dated) +# harness_selftest 290 2 the built-count line; the missing-directory answer +# harness_selftest 560 1 the build path's stamp consultation +# harness_selftest 580 3 both control: arms, and one premise the deletion +# of pgc_symbol_is_toolchain also reddened +# rewrite_storage_oid 2 both matview arms; the WITH DATA arm reddens on +# 17, 18 and 19 only, because PostgreSQL 15 and 16 +# fill a new matview in place rather than swapping +# +# never 1671 - 9 = 1662 +# +# Three checks were renamed premise: (two in 570, one in 190) because no change to +# the code under test can redden them (#1236, owner's decision 2026-10-12). They +# stay never, under their new names, so the rename alone does not move this count. +# +# #1236, second batch: 1662 -> 1651. Eleven checks dated, same method: +# +# catalog_delete_index 2 both DROP arms; the two mutations already in the +# ledger for this part, re-run, reach them +# catalog_plan_index 3 the #1210 change reversed on the current tree +# projection_scan_cost 5 three arms, plus the two "plan uses the covering +# projection" premises the no-discount mutation +# also reddens +# projection_parallel 1 a worker never wires the shared row-group counter +# +# never 1662 - 11 = 1651 +checks_never_observed_red 1651 diff --git a/test/selftest/190-an-in-tree-build-must-not.sh b/test/selftest/190-an-in-tree-build-must-not.sh index a94fbb524..4bbdb2901 100644 --- a/test/selftest/190-an-in-tree-build-must-not.sh +++ b/test/selftest/190-an-in-tree-build-must-not.sh @@ -73,7 +73,11 @@ check "the build path asks pgc_build_needs_clean rather than merely naming it" \ # distinguishes them. _bnc_prose="$(mktemp)" printf '%s\n' 'elif false; then # call to pgc_build_needs_clean "$had" "$want" removed' > "$_bnc_prose" -check "a comment naming the call does not satisfy the arm above" \ +# A PREMISE, NOT AN ARM (#1236). It runs its own copy of the strip on a line +# printf just wrote, so no change to lib.sh or to the arm above can redden it: +# replace the arm's strip with a raw read and this still passes. It shows the +# idiom works; the arm above is what holds lib.sh to it. +check "premise: stripping comments drops a call named only in a comment" \ "$(printf 'raw=%s stripped=%s' \ "$(grep -c 'pgc_build_needs_clean "' "$_bnc_prose")" \ "$(sed 's/#.*//' "$_bnc_prose" | grep -c 'pgc_build_needs_clean "')")" \ diff --git a/test/selftest/570-a-checkout-test-must-ask-git.sh b/test/selftest/570-a-checkout-test-must-ask-git.sh index 1b86e4480..00aa4ef07 100644 --- a/test/selftest/570-a-checkout-test-must-ask-git.sh +++ b/test/selftest/570-a-checkout-test-must-ask-git.sh @@ -97,11 +97,16 @@ check_num "no suite decides it is a checkout by stat-ing .git as a directory" \ # sweep above then counted its own demonstration and stayed red after both real # sites were fixed. A guard whose own text satisfies its pattern is the defect # it exists to catch, one level up. +# THESE TWO ARE PREMISES, NOT ARMS (#1236). They assert what `printf >` just +# made, so no change to this repository can redden them: that is POSIX, not +# pgcolumnar. They stay because they make the gitfile concrete beside the sweep +# that depends on it, and the sweep is the arm. Named as arms, they were counted +# as coverage they cannot give. _ck_dir="$(mktemp -d)" printf 'gitdir: %s\n' "$_ck_dir/nowhere" > "$_ck_dir/.git" -check_text "a gitfile is a regular file, which a directory test cannot accept" \ +check_text "premise: the gitfile fixture is a regular file, not a directory" \ "$(stat -c %F "$_ck_dir/.git" 2>/dev/null)" "regular file" -check_text "and it is still a .git that a reader must not skip on" \ +check_text "premise: the gitfile fixture exists, so a reader must not skip it" \ "$(if test -e "$_ck_dir/.git"; then echo present; else echo absent; fi)" "present" rm -rf "$_ck_dir"