diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f3c65df..fde889b4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,35 @@ true until the next version shipped. ### Changed +- Nine `index_am_support` arms now carry a mutation that reddens them (#1236). + No test changed and no code changed. + + Its only dated rows were two premises about `docs/features.md`, reddened by a + **docs** mutation, which cannot reach one arm about what an index does. Eight + behaviour arms sat `never` beside them -- unattacked rather than vacuous, the + same shape as the first batch. + + Two mutations with disjoint predicted sets, both confirmed exactly: + + ``` + M-1 the build drops two rows in three, so the index misses entries + predicted the four "answers its operator" arms, NOT the build arms + observed exactly those four; CREATE INDEX still succeeds + + M-2 the build errors, so CREATE INDEX fails + predicted the four "builds an index" arms + observed those four, plus the GiST overlap premise + ``` + + **M-2 also shows a weakness in the four answer arms.** With no index in + existence they all stayed green: the arm compares a count taken with + `enable_seqscan = off` against one taken with the custom scan off, and + `enable_seqscan` is a preference rather than a prohibition -- so with no index + both sides fall back to the same scan and agree. An arm named *answers its + operator with the same rows the scan returns* can be satisfied without an index + scan happening. Reported on #1236 rather than repaired here, because this + change records evidence and alters no test. + - Fifteen `native_join_runtime_filter` arms now carry a mutation that reddens them (#1236). No test changed and no code changed: the arms were attacked and the ledger records what happened. diff --git a/test/check_ledger.tsv b/test/check_ledger.tsv index 97ebc37a..2bf488dc 100644 --- a/test/check_ledger.tsv +++ b/test/check_ledger.tsv @@ -1383,13 +1383,13 @@ harness_selftest 580-a-hand-rebuild-must-record premise: the hand rebuild tool i 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 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 -index_am_support index_am_support btree answers its operator with the same rows the scan returns 15;16;17;18;19 never - -index_am_support index_am_support btree builds an index over a columnar table 15;16;17;18;19 never - -index_am_support index_am_support gist answers its operator with the same rows the scan returns 15;16;17;18;19 never - -index_am_support index_am_support gist builds an index over a columnar table 15;16;17;18;19 never - -index_am_support index_am_support hash answers its operator with the same rows the scan returns 15;16;17;18;19 never - -index_am_support index_am_support hash builds an index over a columnar table 15;16;17;18;19 never - -index_am_support index_am_support premise: an overlap query reaches the row through a GiST index 15;16;17;18;19 never - +index_am_support index_am_support btree answers its operator with the same rows the scan returns 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan drops two rows in three, so the index misses entries +index_am_support index_am_support btree builds an index over a columnar table 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan errors, so CREATE INDEX fails +index_am_support index_am_support gist answers its operator with the same rows the scan returns 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan drops two rows in three, so the index misses entries +index_am_support index_am_support gist builds an index over a columnar table 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan errors, so CREATE INDEX fails +index_am_support index_am_support hash answers its operator with the same rows the scan returns 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan drops two rows in three, so the index misses entries +index_am_support index_am_support hash builds an index over a columnar table 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan errors, so CREATE INDEX fails +index_am_support index_am_support premise: an overlap query reaches the row through a GiST index 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan errors, so CREATE INDEX fails index_am_support index_am_support premise: btree, which the page claims, has a probe in this suite 15;16;17;18;19 never - index_am_support index_am_support premise: gist, which the page claims, has a probe in this suite 15;16;17;18;19 never - index_am_support index_am_support premise: hash, which the page claims, has a probe in this suite 15;16;17;18;19 never - @@ -1401,8 +1401,8 @@ index_am_support index_am_support premise: the fixture holds every row 15;16;17; index_am_support index_am_support premise: the gist predicate matches rows at all 15;16;17;18;19 never - index_am_support index_am_support premise: the hash predicate matches rows at all 15;16;17;18;19 never - index_am_support index_am_support premise: the spgist predicate matches rows at all 15;16;17;18;19 never - -index_am_support index_am_support spgist answers its operator with the same rows the scan returns 15;16;17;18;19 never - -index_am_support index_am_support spgist builds an index over a columnar table 15;16;17;18;19 never - +index_am_support index_am_support spgist answers its operator with the same rows the scan returns 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan drops two rows in three, so the index misses entries +index_am_support index_am_support spgist builds an index over a columnar table 15;16;17;18;19 2026-09-23 pgcolumnar_index_build_range_scan errors, so CREATE INDEX fails index_fetch_penalty_crossover index_fetch_penalty_crossover a 50000-row correlated range uses the custom scan, not a fetching index 15;16;17;18;19 never - index_fetch_penalty_crossover index_fetch_penalty_crossover a selective point lookup still uses the index 15;16;17;18;19 never - index_fetch_penalty_crossover index_fetch_penalty_crossover both paths return the same aggregate at 50000 15;16;17;18;19 never - diff --git a/test/check_ledger_budget.txt b/test/check_ledger_budget.txt index 74ebd000..315c0885 100644 --- a/test/check_ledger_budget.txt +++ b/test/check_ledger_budget.txt @@ -594,4 +594,38 @@ suites_not_covered 249 # YOU KNOW WHAT IS THERE. # # suites_not_covered does NOT move: catalog_plan_index is already covered. -checks_never_observed_red 1521 +# +# 1521 -> 1512 for #1236's second batch: nine index_am_support arms attacked, after +# this branch was rebased onto a main carrying #1241. RE-DERIVED BY COUNTING on +# the composed tree -- the branch carried 1510 against the previous main and that +# number does not survive, because it described a tree that no longer exists: +# +# awk -F'\t' '$5=="never"' test/check_ledger.tsv | wc -l -> 1512 +# 1606 rows total, 94 not `never` +# +# THE SAME SHAPE AS THE FIRST BATCH. index_am_support's only dated rows were two +# premises about docs/features.md, reddened by a DOCS mutation, which cannot +# reach one arm about what an index does. Eight behaviour arms sat `never` next +# to them, unattacked rather than vacuous. +# +# TWO MUTATIONS WITH DISJOINT PREDICTED SETS, both confirmed exactly: +# +# M-1 the build drops two rows in three, so the index misses entries +# predicted the four "answers its operator" arms and NOT the build arms +# observed exactly those four; CREATE INDEX still succeeds, so every +# "builds an index" arm stayed green +# +# M-2 the build errors, so CREATE INDEX fails +# predicted the four "builds an index" arms +# observed those four, plus the GiST overlap premise, which needs an +# index that can no longer be built +# +# AND M-2 SHOWS A WEAKNESS IN THE FOUR ANSWER ARMS, which is worth recording +# where the rows are. With NO index in existence they all stayed GREEN: the arm +# compares a count taken with `enable_seqscan = off` against one taken with the +# custom scan off, and `enable_seqscan` is a preference rather than a +# prohibition, so with no index both sides fall back to the same scan and agree. +# The arm is named "answers its operator with the same rows the scan returns" +# and can be satisfied without an index scan happening. Reported on #1236 rather +# than repaired here: this change records evidence and alters no test. +checks_never_observed_red 1512