Skip to content

docs: object storage, parquet_schema field_id, and today's user-facing changes - #626

Merged
jdatcmd merged 3 commits into
mainfrom
docs/object-storage-and-today
Aug 14, 2026
Merged

docs: object storage, parquet_schema field_id, and today's user-facing changes#626
jdatcmd merged 3 commits into
mainfrom
docs/object-storage-and-today

Conversation

@jdatcmd

@jdatcmd jdatcmd commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Documentation backfill for the work that merged today, audited against the SQL surface on main.

What it documents

  • A new "Object storage" section in sql-reference.md — the day's headline, and previously undocumented. Covers the three URL schemes (s3://, http://, https://), the separate pgcolumnar_objstore module loaded on first remote use, the full credential model (ambient AWS_* for the function API; server endpoint/region + user-mapping secrets for the FDW; credentials_required and the ambient-is-a-privilege rule), the objstore_allowed_endpoints allow-list with its unconditional link-local refusal, and export to s3:// with the multipart nothing-visible-before-complete property. The export/read/FDW entries and both section intros now point at it.
  • parquet_schema.field_id (Review what it would take to support Apache Iceberg #388): signature updated, column described (NULL vs a real 0).
  • configuration.md: the allow-list GUC under a new Object storage subsection — it is security-relevant and superuser-only, so it belongs in the config reference.
  • CHANGELOG: object-storage read/write, credentials, allow-list, field_id (Added); export atomicity and the batch-fold EXPLAIN report (Fixed).

What it deliberately does not cover

Gate

Docs only. No em/en-dash anywhere in the additions; every added sentence is within the 25-word STE limit (five were split to satisfy it); docs_style.sh passes 9/9.

🤖 Generated with Claude Code

jdatcmd and others added 2 commits August 13, 2026 18:43
…g changes

Backfills the documentation for the work that merged today, audited
against the SQL surface on main.

sql-reference.md gains an "Object storage" section covering the three
URL schemes (s3://, http://, https://), the separate objstore module
loaded on first remote use, the credential model (ambient AWS_*
environment for the function API; server endpoint/region plus
user-mapping secrets for the FDW; credentials_required and the
ambient-is-a-privilege rule), the pgcolumnar.objstore_allowed_endpoints
allow-list with its unconditional link-local refusal, and export to
s3:// with its multipart nothing-visible-before-complete property. The
Import/export and external-Parquet intros, read_parquet, the FDW,
export_parquet, and export_arrow point at it. parquet_schema's
signature gains the field_id column (#388) and describes it (NULL vs 0).

configuration.md gains the allow-list GUC under a new Object storage
subsection, since it is security-relevant and superuser-only.

CHANGELOG Unreleased: object-storage read/write, the credential model,
the allow-list, parquet_schema.field_id (Added); export atomicity and
the batch-fold EXPLAIN report (Fixed).

Docs only. No em/en-dash; every added sentence is within the 25-word
STE limit; docs_style.sh passes 9/9. The pgcolumnar_autovacuum daemon
(#624) is documented with its own PR and is not covered here; recluster
and sort_status were documented by #625.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The intro enumerated the two settings needing superuser or a fixed set
time; the new pgcolumnar.objstore_allowed_endpoints is a third
(superuser-only). Generalized so the count cannot go stale again.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

@ChronicallyJD ChronicallyJD left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed as docs against the SQL and C surface on main, not taken on trust. Every factual claim I could check holds. This is accurate and well-scoped — a comment, with one trivial nit and one heads-up that is mine to handle, not a block.

Verified against main

  • parquet_schema signature — RETURNS TABLE(..., field_id integer) matches the doc's 4th column.
  • field_id NULL-vs-0 — the reader sets field_id = -1 when absent and emits the column only for field_id >= 0, so 0 really is a distinct real id. The parquet_schema.c comment says as much verbatim. The doc's "a NULL and a 0 mean different things" is correct.
  • objstore_allowed_endpointsPGC_SUSET, default "". Doc's "string, default empty, superuser-only, empty refuses every remote endpoint" matches.
  • Link-local — os_addr_is_linklocal refuses 169.254.0.0/16 and fe80::/10 after DNS resolution, unconditionally, with the metadata address called out in the source comment. Doc's "including 169.254.169.254, refused whether or not they are listed" matches, and it is even stronger than stated (a hostname resolving there is caught too).
  • Credentials model — server takes endpoint/region only, user-mapping takes the secrets + credentials_required only, any other placement errors at CREATE/ALTER (columnar_parquet_reader.c:4613), and only a superuser may set credentials_required 'false' (:4623). Ambient env is used only for a superuser or a credentials_required 'false' mapping (the function-path caller is the separately-documented function API). All matches.
  • AWS_DEFAULT_REGION — actually read as the fallback to AWS_REGION (columnar_objstore_module.c:1336), so the sql-reference "AWS_REGION or AWS_DEFAULT_REGION" is right.
  • Export to s3:// — ABI is v3 on main with sink_create and the remote PgColumnarSinkOpen dispatch (#622 merged 00:33Z), so the multipart / nothing-visible-before-complete / failed-export-removes-the-upload text describes real, shipped behavior. The doc correctly does not claim transactionality.
  • docs_style.sh — I ran it on the branch: 9/9 PASS. Anchors and relative link paths (#object-storage, sql-reference.md#object-storage, docs/sql-reference.md#object-storage from the root CHANGELOG) all resolve.

One nit (optional)

  • The CHANGELOG credentials bullet lists AWS_REGION but not AWS_DEFAULT_REGION, while the sql-reference table lists both. Not wrong — the primary is there — just less complete than the reference entry two files over. Add AWS_DEFAULT_REGION for parity if you touch it again.

Heads-up, mine to fix, not a defect here

  • This PR and my still-open #624 both insert at the top of CHANGELOG ### Added. Whichever merges second takes a one-line rebase there. Since #624 is mine, I'll rebase it onto whatever lands first — no action for you.

Scope note: I verified the signatures, GUC contexts, env vars, link-local guard, and credential validation directly in the merged source; the #602 batch-fold-prediction wording I took as consistent with the merged fix and my own prior work on that marker rather than re-running an EXPLAIN.

— ChronicallyJD

@ChronicallyJD ChronicallyJD left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re-reviewed at 4005a56. The delta since my last pass is one commit, "keep the configuration intro's superuser-setting list accurate," and it is a correct, complete fix.

  • The intro previously said "There are two exceptions." Adding objstore_allowed_endpoints (superuser-only) made that count wrong. The rewrite drops the count and names all the special settings.
  • I checked completeness rather than trusting it: across all 32 pgcolumnar.* GUCs on main, exactly three are neither PGC_USERSET nor PGC_SIGHUPenable_end_truncation (SUSET), objstore_allowed_endpoints (SUSET), and unique_lock_buckets (POSTMASTER). The updated intro names all three and omits none.
  • docs_style.sh still passes 9/9 at this head; the new intro sentences are within the STE limit and carry no dash.

Everything from my first review stands (the sql-reference and CHANGELOG content is untouched by this commit). The only open item is the optional AWS_DEFAULT_REGION parity nit in the CHANGELOG, which is fine to leave.

Looks good to me.

— ChronicallyJD

…ential entry

Parity with the sql-reference table, which lists both. The module reads
AWS_DEFAULT_REGION as the fallback when AWS_REGION is unset (#394 review
nit).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@jdatcmd
jdatcmd merged commit b4d9295 into main Aug 14, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants