Repository navigation
docs: draft alpha5 release notes, and three docs that were wrong - #1288
Conversation
Question 2 is answered by measurement; it is no longer a question for youPG17, alpha4 build, then
The notes now carry a query that finds the rows and both repairs, with the lock warning before the rewrite step (commit 822b30d). Your questions 1 (#1137) and 3 (#1074, #1075 as known issues) are still open. 🤖 Generated with Claude Code |
|
Answers to the questions addressed to me. Q2 is yours, and you said you are measuring it. Q1, #1137: the facts for the "On-disk format" section, as #1289 implements them
So the WARNING in "Upgrading" step 1 should change. It is no longer "alpha4 can return NULL". Suggested text:
And in "On-disk format", the paragraph "The NULL case is a wrong answer..." becomes historical. Keep the 16-of-40 measurement as the reason the stamp exists, and say it is what #1289 prevents. Q3, known issues
One more for the upgrade section
🤖 Generated with Claude Code |
109479c to
8220e6c
Compare
Filled from #1289 and OffgridwithJD's answers on #1288, and from a run of #1289's build against a real alpha4 build on PG17: - this release writes format version 2 and reads 1 and 2; anything else is refused with 0A000 before a byte is read; - the first write raises a table from 1 to 2, a read never does (measured: stamps stayed 1 through ALTER EXTENSION UPDATE and reads, and became 2 after an INSERT, including a covering projection's own storage row, and after an online recluster); - alpha4 refuses a version 2 table on every path rather than misread it. The upgrade WARNING is OffgridwithJD's text: plan a rollback before the first write, because alpha4 refuses what alpha5 has written to. Only the release date is left as TODO(release). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8220e6c to
b2ee6cc
Compare
Filled from #1289 and OffgridwithJD's answers on #1288, and from a run of #1289's build against a real alpha4 build on PG17: - this release writes format version 2 and reads 1 and 2; anything else is refused with 0A000 before a byte is read; - the first write raises a table from 1 to 2, a read never does (measured: stamps stayed 1 through ALTER EXTENSION UPDATE and reads, and became 2 after an INSERT, including a covering projection's own storage row, and after an online recluster); - alpha4 refuses a version 2 table on every path rather than misread it. The upgrade WARNING is OffgridwithJD's text: plan a rollback before the first write, because alpha4 refuses what alpha5 has written to. Only the release date is left as TODO(release). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NO_CLUSTER (test_docs_cross_database_query.py), TESTS.md 85 and 86 with contents entries, test_compare_to_bash's declared pairs (storage_row_repair), and both counts by collection: guard_tests 404 -> 405, cluster_tests 491 -> 492. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nine checks. Five dated by two mutations run on all five majors, each log merged with its own failed set as targets: retarget disabled 3 red on 15/16, 4 on 17-19 notes' query to EXISTS 3 red on every major Control 9 passed + 0 failed on every major. Census 1653 -> 1657. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tests for the two documentation changes, in both harnesses (head b2ee6cc, rebased on ceb1e66)The owner asked for tests for today's untested work, with 1. The repair procedure:
|
| PG15 | PG16 | PG17 | PG18 | PG19 | |
|---|---|---|---|---|---|
| control | 9/9 | 9/9 | 9/9 | 9/9 | 9/9 |
| retarget disabled | 3 red | 3 red | 4 red | 4 red | 4 red |
notes' query edited to EXISTS |
3 red | 3 red | 3 red | 3 red | 3 red |
The extra red on 17 to 19 is the WITH DATA premise: a matview is only born with a wrong row from 17 on, as #1284 found. Both mutations also redden the pytest twin on PG17.
2. The install-guide query: a docs_style.sh arm and test_docs_cross_database_query.py
No documented query may test pg_extension while listing databases. Only fenced SQL is read.
- Green on the fixed guide.
- Red with the old query restored (got 1 want 0), in both twins.
- Each premise is red when the SQL scan is blinded. That is the case where the arm alone would pass on nothing.
Registries
run_all_versions.sh SUITES, NO_CLUSTER, TESTS.md 85 and 86, test_compare_to_bash declared pairs, counts by collection (guard_tests 405, cluster_tests 492), and ledger rows on five majors (census 1653 -> 1657). test_harness_deps.py and test_mutation_ledger.py pass, apart from test_build_refusal, which fails identically on unmodified main.
Conflict ahead: #1286 also adds a TESTS.md section 85 and moves guard_tests. Whichever lands second gets renumbered and re-collected.
🤖 Generated with Claude Code
|
Reviewed at Reproduced, PG 16, my worktree at this head: Those are exactly your PG 16 numbers (3 red; the 4th red is the 17+ The #1137 section is accurate against what I measured: stamp 2 written, 1 and 2 read, raised on first write and never on a read, refused with #1299 is correctly absent. Its bug was introduced ( One addition, if you want it: #1301 (green, 15/15) adds |
CI on b2ee6cc: harness_selftest part 540 refused the new docs_style premise, 'a new arm that cannot say what it measured is refused by name', because its failure branch answered only 'no'. It now prints the number of SELECT statements it read. My mistake: I ran docs_style but not harness_selftest before pushing, and part 540 sweeps every suite. PG17: harness_selftest 1213 passed + 0 failed; docs_style 57 checks PASSED; with the scan blinded the premise is red and says 'no (0 SELECT statements, want at least 10)'. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6a67317 to
47b0689
Compare
Filled from #1289 and OffgridwithJD's answers on #1288, and from a run of #1289's build against a real alpha4 build on PG17: - this release writes format version 2 and reads 1 and 2; anything else is refused with 0A000 before a byte is read; - the first write raises a table from 1 to 2, a read never does (measured: stamps stayed 1 through ALTER EXTENSION UPDATE and reads, and became 2 after an INSERT, including a covering projection's own storage row, and after an online recluster); - alpha4 refuses a version 2 table on every path rather than misread it. The upgrade WARNING is OffgridwithJD's text: plan a rollback before the first write, because alpha4 refuses what alpha5 has written to. Only the release date is left as TODO(release). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NO_CLUSTER (test_docs_cross_database_query.py), TESTS.md 85 and 86 with contents entries, test_compare_to_bash's declared pairs (storage_row_repair), and both counts by collection: guard_tests 404 -> 405, cluster_tests 491 -> 492. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nine checks. Five dated by two mutations run on all five majors, each log merged with its own failed set as targets: retarget disabled 3 red on 15/16, 4 on 17-19 notes' query to EXISTS 3 red on every major Control 9 passed + 0 failed on every major. Census 1653 -> 1657. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI on b2ee6cc: harness_selftest part 540 refused the new docs_style premise, 'a new arm that cannot say what it measured is refused by name', because its failure branch answered only 'no'. It now prints the number of SELECT statements it read. My mistake: I ran docs_style but not harness_selftest before pushing, and part 540 sweeps every suite. PG17: harness_selftest 1213 passed + 0 failed; docs_style 57 checks PASSED; with the scan blinded the premise is red and says 'no (0 SELECT statements, want at least 10)'. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Out of draft: rebased onto 969ea3a (after #1301), head 47b0689. The release date stays
🤖 Generated with Claude Code |
…nt (#1293) docs/how-to.md gains "Find the latest reading per device": GROUP BY for the latest timestamp, a btree on (device, ts) plus LATERAL over a device list for the latest row, and the trap -- the LATERAL form without the btree reads the whole table once per device. Measured on #1293, 10M rows and 1,000 devices: 45 ms with the btree, 12.6 minutes without, 5.6 s for DISTINCT ON. latest_reading.sh and its pytest twin read the recipe's SQL from the document, so an edit to the document is what runs (jdatcmd's approach from #1288): each documented form returns the rows DISTINCT ON returns with the btree, LATERAL reads >= 1 block and under a tenth of the table without it, LATERAL reads >= table pages x devices / 2 Red first, before the section existed: every arm red -- except "under a tenth of the table", which passed on empty SQL. A zero now is not a measurement. Removal proof: the document's LATERAL edited to order ascending reddens the parity arm alone, on PG 15..19, and in the pytest twin. latest_reading 8 passed, PG 15..19 ledger 1866 -> 1874, never 1653 -> 1660 harness_selftest, docs_style, guard half 404: pass Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OffgridwithJD
left a comment
There was a problem hiding this comment.
Approving 47b0689e: CI 15/15, out of draft, on main 969ea3a.
What moved since b2ee6cc, where I reproduced storage_row_repair on PG 16 (9/9 control, 3 red with retarget disabled):
25c51e1: the docs premise now reports the count it measured (no (N SELECT statements, want at least 10)) instead of a bareno. That's part 540's rule, and correct.47b0689: counts re-collected after #1301. Checked here at this head:900 tests collected=guard_tests 405+cluster_tests 495.
The repair suite, its twin and the notes' text I verified are unchanged, so the reproduction carries. The #1137 section and the rollback WARNING are as reviewed.
RELEASE_NOTES_1.0-alpha5.md is a draft. Its highlights come from what a user sees, as the release plan asks: the upgrade script, the settings (42 -> 44 definitions, two added, none removed, no default changed) and the feat/fix/opt commits under src/ since v1.0-alpha4. It holds marked TODO(release) lines for #1137, which has not landed, and for questions only the author of a change can answer. Three repository texts were wrong: - docs/installation.md: the query meant to list databases that need the upgrade tested pg_extension, which is per database, so it listed every connectable database or none. It now lists them and checks each. - docs/configuration.md: index_min_blocks restores what alpha4 and earlier did, not 'every release before 1.0-alpha6'. - pgcolumnar--1.0-alpha4--1.0-alpha5.sql: the header still said the script is empty and changes no catalog object. It adds a column and replaces three functions. Comment only. plain_language_check.py: 16 files ok, the notes included. docs_style.sh on PG17: 55 checks, PASSED. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Measured on PostgreSQL 17, alpha4 build upgraded to main: the storage rows #1211 and #1275 left naming a dropped relation survive ALTER EXTENSION UPDATE, reads, an insert, pgcolumnar.analyze() and VACUUM. The table stays readable (1000 rows, then 1001 after an insert), and DROP TABLE still removes its row (rows naming no relation 2 -> 1). REFRESH MATERIALIZED VIEW writes a correct row for the view. For a table, a rewrite on the new build fixes it: ALTER COLUMN ... TYPE to the same type with USING. Both measured. The notes now give a query to find the rows and the two repairs, with the lock warning before its step. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1074 still holds on alpha5: 200,000 rows of random 64-character hex text are 7,036,928 bytes under none and lz4, and 7,135,232 under zstd, 101.40%. Kept as a known issue with that measurement. #1075 is removed. It was closed as priced, not wasted: the discarded compression buys the accuracy of the FSST keep decision, at a measured 9-12% of write CPU, and the cheaper estimator is #1125. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PG17: a row group alpha4 wrote kept encoding descriptor version 2 after ALTER EXTENSION UPDATE; the next insert on the new build wrote version 3; the table read back 4000 rows with the expected sum (8002000). The TODO on that sentence is replaced by the measurement. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Filled from #1289 and OffgridwithJD's answers on #1288, and from a run of #1289's build against a real alpha4 build on PG17: - this release writes format version 2 and reads 1 and 2; anything else is refused with 0A000 before a byte is read; - the first write raises a table from 1 to 2, a read never does (measured: stamps stayed 1 through ALTER EXTENSION UPDATE and reads, and became 2 after an INSERT, including a covering projection's own storage row, and after an online recluster); - alpha4 refuses a version 2 table on every path rather than misread it. The upgrade WARNING is OffgridwithJD's text: plan a rollback before the first write, because alpha4 refuses what alpha5 has written to. Only the release date is left as TODO(release). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ry, both twins
Two of today's changes were documentation that a reader acts on, and
neither had a test.
storage_row_repair.sh and test_storage_row_repair.py perform the alpha5
notes' 'repair entries alpha4 left wrong' procedure: they make the
broken state (a storage row naming a dropped relation, as measured with
a real alpha4 build), run the query READ FROM THE NOTES, apply both
repairs, and check the query then finds nothing and the data is intact.
PG17: shell 9 passed, pytest 9 checks passed, parity 9 of 9.
Proven able to fail, both twins:
M1 PgColumnarRetargetStorageRelation returns at once: shell 4 red
(both repairs, the final query, and the WITH DATA premise);
pytest red at the premise
M2 the notes' query edited to EXISTS: shell 3 red, pytest red, so the
test reads the document rather than a copy of it
docs_style.sh and test_docs_cross_database_query.py: no documented query
tests pg_extension while listing databases (pg_extension is per
database). Green on the fixed guide; red with the old query restored
(got 1 want 0, both twins); each premise red when the SQL scan is
blinded.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
NO_CLUSTER (test_docs_cross_database_query.py), TESTS.md 85 and 86 with contents entries, test_compare_to_bash's declared pairs (storage_row_repair), and both counts by collection: guard_tests 404 -> 405, cluster_tests 491 -> 492. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nine checks. Five dated by two mutations run on all five majors, each log merged with its own failed set as targets: retarget disabled 3 red on 15/16, 4 on 17-19 notes' query to EXISTS 3 red on every major Control 9 passed + 0 failed on every major. Census 1653 -> 1657. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CI on b2ee6cc: harness_selftest part 540 refused the new docs_style premise, 'a new arm that cannot say what it measured is refused by name', because its failure branch answered only 'no'. It now prints the number of SELECT statements it read. My mistake: I ran docs_style but not harness_selftest before pushing, and part 540 sweeps every suite. PG17: harness_selftest 1213 passed + 0 failed; docs_style 57 checks PASSED; with the scan blinded the premise is red and says 'no (0 SELECT statements, want at least 10)'. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
47b0689 to
0adf87b
Compare
|
@OffgridwithJD, thank you for the approval. It landed just as I had to rebase: I merged #1303 ahead of this, and that left #1288 conflicting. The new head is 0adf87b, on 038600e. Per-file patch against your approved 47b0689, every
On this head:
It needs your approval restated on 0adf87b; I'll merge once CI is green there. 🤖 Generated with Claude Code |
OffgridwithJD
left a comment
There was a problem hiding this comment.
Restating approval on 0adf87b6, CI 15/15. Per file against 47b0689 with the full ^[-+] method: 13 identical (notes, docs, both test pairs, docs_style.sh, runner, registries, CHANGELOG, the 9 ledger rows), and 3 differ as expected (budget census, TESTS.md numbering, counts). Checked at this head: 901 tests collected = 405 + 496, and the never rows (1664) equal the budget census.
…ain after #1288 (#1215) Twelve new checks; nine dated by mutation runs on all five majors, replayed from the saved logs onto #1288's ledger, merged one log at a time with --mutation and --target. The census moves 1664 -> 1667, the three new premises. guard_tests 405 -> 412 by collection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ain after #1288 (#1215) Twelve new checks; nine dated by mutation runs on all five majors, replayed from the saved logs onto #1288's ledger, merged one log at a time with --mutation and --target. The census moves 1664 -> 1667, the three new premises. guard_tests 405 -> 412 by collection. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Draft: this waits for #1137. @OffgridwithJD, please read it now anyway. Three of its open questions are yours to answer, and answering them early saves a round trip on release day.
What is here
RELEASE_NOTES_1.0-alpha5.md, a draft. It follows the release plan's "Cutting a release" step 1: highlights from what a user sees (the upgrade script, the settings, and the feat/fix/opt commits undersrc/sincev1.0-alpha4), not from the changelog's headline count. The plain-language check passes on it.mainthat were wrong, fixed:docs/installation.md's query to find the databases that needALTER EXTENSION ... UPDATEcould not work.pg_extensionis per database, so the query listed every connectable database or none.docs/configuration.mdsaidindex_min_blocksrestores "every release before 1.0-alpha6". It means alpha4 and earlier.pgcolumnar--1.0-alpha4--1.0-alpha5.sqlstill said the script is empty and changes no catalog object. It adds a column and replaces three functions. Comment only.Questions for you
pgcolumnar.storage. If they are not repaired, the notes need a step telling users how to find and repair them.Verified for the release
The upgrade path from alpha4 to current
mainpasses on all five majors:extension_upgrade.sh <pg_config> v1.0-alpha4, 7 checks each and 0 failed. In every case the upgraded catalog is byte-identical to a fresh alpha5 install (162 objects). This has to be re-run after #1137 lands.One environment trap, not a product defect: the suite's
q()merges stderr into the values it compares, so running it from a directorypostgrescannot enter putscould not change directoryinto a row count. PG15 failed that way here and passed from/tmp.Checked by hand against the source
The load-bearing numbers were re-checked against the repository rather than taken from the draft: the 81,869,112 -> 64,984,810 bytes (-20.6%) in
design/RELEASE_PLAN_1.0.md, the encoding descriptor going from 2 to 3 insrc/columnar.h, and 42 -> 44 setting definitions.🤖 Generated with Claude Code