You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
test/ttl_expire.sh has no pytest counterpart, so the pair does not exist and appears in neither COMPLETE nor INCOMPLETE in test_compare_to_bash.py.
Why this is a gap rather than a choice
The twin rule exists because the two harnesses fail differently. ttl_expire is the suite for pgcolumnar.expire, which deletes rows, and it is the one place in the tree where a wrong answer destroys data rather than reporting a wrong number. It is a poor candidate for single-harness coverage.
It was noticed while fixing #1135 (a date retention column). That change added arms to the shell suite only, deliberately and with the reason stated in the PR: a partial test_ttl_expire.py would manufacture a pair that cannot reach zero MISSING against a 43-check shell suite, landing it in INCOMPLETE -- a declared gap about the port, filed inside a change about a date type. #1183 had just emptied INCOMPLETE, and reopening it for an unrelated reason is worse than the gap it would record.
What the port owes
ttl_expire.sh is 43 checks at 3363331. The port must assert every one of those names for the pair to enter COMPLETE, which is the standing arm's rule.
The properties, in the order the shell suite establishes them:
A group whose rows are all past the retention is retired.
A group that straddles the cutoff survives with every row. This is the one that matters: dropping it is data loss, and a suite that only proved expired data disappears would pass on an implementation that dropped everything.
A group holding NULL retention values is not retired, because the zone map's maximum covers only non-NULL values.
An all-visible group is retired correctly, because expire bypasses the delete vector and the visibility-map bits VACUUM set stay on.
A table with no declared retention raises an error rather than reporting that it did nothing.
The rounding arm in 7 is only discriminating because the fixture puts 1,000 rows exactly on the cutoff day and the cutoff carries a time of day. An arm that compares midnight with midnight returns the same answer whichever way the rounding goes, which was measured during opt: pgcolumnar.expire refuses a date retention column, though date is handled everywhere else #1135 and is an easy thing to port into uselessly.
Done when
ttl_expire is in COMPLETE with zero MISSING, and INCOMPLETE is still {}.
test/ttl_expire.shhas no pytest counterpart, so the pair does not exist and appears in neitherCOMPLETEnorINCOMPLETEintest_compare_to_bash.py.Why this is a gap rather than a choice
The twin rule exists because the two harnesses fail differently.
ttl_expireis the suite forpgcolumnar.expire, which deletes rows, and it is the one place in the tree where a wrong answer destroys data rather than reporting a wrong number. It is a poor candidate for single-harness coverage.It was noticed while fixing #1135 (a
dateretention column). That change added arms to the shell suite only, deliberately and with the reason stated in the PR: a partialtest_ttl_expire.pywould manufacture a pair that cannot reach zero MISSING against a 43-check shell suite, landing it inINCOMPLETE-- a declared gap about the port, filed inside a change about a date type. #1183 had just emptiedINCOMPLETE, and reopening it for an unrelated reason is worse than the gap it would record.What the port owes
ttl_expire.shis 43 checks at3363331. The port must assert every one of those names for the pair to enterCOMPLETE, which is the standing arm's rule.The properties, in the order the shell suite establishes them:
expirebypasses the delete vector and the visibility-map bits VACUUM set stay on.datecolumn arms from opt: pgcolumnar.expire refuses a date retention column, though date is handled everywhere else #1135, including the rounding: a row dated exactly on the cutoff is kept.What to watch when porting
pgcolumnar.stripe_row_limit=1000in the cluster config rather than withSET, so the writing session and every later session agree about the geometry (The cost model reads the session's stripe_row_limit, not the geometry the table was written with #806). A port that sets it per-session gets a different layout and the straddling group stops straddling.Done when
ttl_expireis inCOMPLETEwith zero MISSING, andINCOMPLETEis still{}.🤖 Generated with Claude Code
https://claude.ai/code/session_01XiFn3HteTXnGdRiA2xDP2n