Tests

Layout (run with scripts/pgtest.sh regress [test...], which starts a throwaway cluster; make installcheck against a running server):

path what
sql/, expected/ pg_regress tests (one .sql per test, its output in expected/, a second _1.out for a version-dependent output)
isolation/ concurrent-session tests (specs, expected output)
t/ TAP tests with clusters of their own (crash, standby, WAL)
col/ the column index differential harness: the same statements with the index on and off, rows compared
fuzz/ the differential fuzzer
plan/ planning and execution budgets per statement family
corpus/ the corpus gate: 174 statements in a new backend each, sift off against on, the plan slug of each pinned (scripts/corpus.sh)
matrix/ data-type matrix
fixtures/ binary fixtures of old on-disk formats

Synthetic data

Every test builds its data with generate_series and a seeded generator. The domain is declared synthetic and stays small: orders, events, docs and facts, with customers and country_code. No test holds real-looking data, and none names an application.

Naming vocabulary for new tests

A name says what a column or key is (its type and role), never where it came from. Use these in new tests, benchmarks and fixtures:

role name
integer references foreign_id, foreign_id_b, parent_id, ref_id, dim_a_id, dim_b_id, link_id
partition and group keys tenant_id, set_id, category_id
enums status (smallint), kind (text), lvl3 (three ordered labels lo, ok, hi)
timestamps and dates created_at, updated_at, deleted_at, event_date
jsonb metrics / metrics_a (object of numbers), items / tags_a (array of objects with a type key), doc / doc_b
scalars counter_a, counter_b, a_count (a counter the index treats as often rewritten), label, label_a, body, title, flag_a, value_num, value_txt
tables dim_a, dim_b, dim_c (dimensions), tenants, key_sets, orders, events, docs, facts

The column index decides on some names (updated_at, a _count suffix, an _id suffix: the index cuts by key columns picked by it); keep those suffixes where a test depends on them.

scripts/check-neutral.sh (the neutral step of scripts/lint.sh) fails a change that brings back a name this vocabulary replaced. The list of replaced names is not in the repository: the check reads it from NEUTRAL_VOCAB_FILE (a file) or NEUTRAL_VOCAB (the text of a CI secret); without it only the structural rules run and the check passes. scripts/apply-rename.sh DIR rewrites a tree to the vocabulary with the same private list (--check only lists the files that still need it).

Private overlay

Tests and data that are not part of this repository run from a directory of the maintainer’s, laid over the work tree:

SIFT_PRIVATE_TESTS=~/private-tests scripts/private-overlay.sh sync    # copies its files to the same paths and keeps them out of git
scripts/pgtest.sh regress ...                                         # the overlaid tests are part of the run (the Makefile takes every test/sql/*.sql)
scripts/private-overlay.sh clean

Without SIFT_PRIVATE_TESTS the sync does nothing and succeeds; CI has no overlay and never depends on one.