Several sections had no ORDER BY, so when one section found more than one
problem PostgreSQL could return them in any order (found by new
break-one-thing tests). Every section is now sorted. Output is otherwise
unchanged; no version bump.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An occasional consistency check (not for connect time) comparing
meta.series with the registered series schemas: non-series tables, views,
sequences and functions inside a series schema; registered series whose
table is missing; series tables without a timestamp column or its BRIN
index. Report only; user schemas are never examined. find_schema_problems()
fingerprints its body like every other procedure.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- meta.series_schemas (name, description, created_at, created_by), seeded
with 'series'. FK series_db_schema_fkey from meta.series.db_schema: a
series may only live in a registered schema, for every client.
Unregistered schemas belong to the user and are never touched.
- CHECK series_schemas_name_check and series_table_name_check enforce the
shared lower-case identifier rule in the database.
- meta.find_schema_problems() covers the registry and reports a registered
schema that no longer exists; user schemas are not examined.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
09_schema_check.sql adds meta.find_schema_problems(), a read-only check
any client (Python, C++, psql) can call:
SELECT * FROM meta.find_schema_problems(); -- zero rows = usable
One row per problem (object, problem): missing schemas, extension,
sequences, tables, columns, wrong column type or NOT NULL, missing
constraints, indexes, views, stored-function bodies that differ from the
DDL (whitespace-insensitive md5 fingerprint), a missing/disabled/
misdirected event trigger, short reference data, no version row. It
mirrors 00-08 and must change in the same commit as they do; the
release test (a fresh install returns zero rows) enforces that.
10_schema_version.sql records VERSION in meta.schema_version. Before,
only the Python client wrote that row, so databases provisioned by
run_setup.py recorded no version at all.
run_setup.py now runs 00-10. It skipped 08_script_log.sql, so its
databases lacked a table the Python client uses; every fresh install is
now identical regardless of provisioner.
sql/migrate/ is removed: databases are re-provisioned, not migrated.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>