From 9db9232eaf418ccae82100dda36ed3167f7a5fe1 Mon Sep 17 00:00:00 2001 From: "Joshua (D) Drake" <136637981+ChronicallyJD@users.noreply.github.com> Date: Wed, 23 Sep 2026 12:29:17 -0600 Subject: [PATCH] test: attack nine index_am_support arms (#1236) No test changed and no code changed. 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` beside them: unattacked rather than vacuous, the same shape the first batch had. 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, 16 passed + 4 failed CREATE INDEX still succeeds, so every build 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, 15 passed + 5 failed AND M-2 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 -- 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, not repaired here. Rows produced by `pgc_ledger.py merge`, one merge per mutation, --target for every arm that reddened. Control 20/20 before each, source restored and md5-verified after each, clean re-run after the last. Census 1519 -> 1510, counted. The reading list drops 72 -> 64. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01MpajdQbkVJ9ey1XyYHcikP --- CHANGELOG.md | 29 +++++++++++++++++++++++++++++ test/check_ledger.tsv | 18 +++++++++--------- test/check_ledger_budget.txt | 36 +++++++++++++++++++++++++++++++++++- 3 files changed, 73 insertions(+), 10 deletions(-) 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