Skip to content

Catalog & Metadata

CatalogSelf-Hosted MetadataTime Travel
Stable On by default · production-ready

Every database needs a catalog: the list of tables, the columns inside them, indexes, constraints, and policies. In most engines the catalog lives in a separate store or a custom file format — which means recovering after a crash takes two coordinated mechanisms, one for catalog and one for data, to agree on what was committed.

AetheriusDB stores the catalog in ordinary system tables, alongside your user data and sharing the same history. If user data survives a crash, the catalog survives it identically. If you can time-travel a row, you can time-travel a column definition.

  • One recovery path — recover and you have both your data and the schema that interprets it, with no race windows or orphaned tables.
  • Free schema history — every CREATE, ALTER, and DROP is a row in a system table at a known point in time. “What did this table look like last Tuesday?” is just SELECT ... AS OF TIMESTAMP.
  • Hot planning — catalog tables are kept resident in memory, so the planner never waits on disk to resolve a column.

You typically don’t touch the catalog directly — DDL statements do it for you. But because the catalog is just tables, you can query it to introspect your schema or to see how it has evolved over time.

-- A schema change is a normal write.
ALTER TABLE users ADD COLUMN tier TEXT DEFAULT 'standard';
-- Look at every column the catalog knows about today.
SELECT t.name AS table_name,
c.name AS column_name,
c.data_type,
c.nullable
FROM aetherius_catalog.tables t
JOIN aetherius_catalog.columns c USING (table_id)
WHERE t.name = 'users'
ORDER BY c.column_id;
-- See what the schema looked like before the ALTER.
SELECT name, data_type
FROM aetherius_catalog.columns
AS OF TIMESTAMP '2026-05-01 00:00:00'
WHERE table_id = (SELECT table_id FROM aetherius_catalog.tables
WHERE name = 'users');

The catalog is queryable like any other schema. That makes audits, compliance reports, and “who changed what when” investigations one SELECT away.

Every index and constraint you declare is catalog metadata too — including the index method (PTI/BTREE/HASH/HNSW/IVFFLAT), its WITH (…) tuning, any partial-index predicate, and covering INCLUDE aggregates. Because it lives in the catalog snapshot, every index survives a restart: vector indexes rehydrate at boot, tree and covering-aggregate structures rebuild from a scan, and declared graph indexes re-arm from their definition.

The engine also exposes runtime index state through system views. For example, the learned and declared relationship edges of the Graph Index are visible one SELECT away:

SELECT * FROM system.join_graph;
-- edge | declared | parent_rows | child_rows | bytes | hits | last_used_epoch
ConceptWhat it means
System tableAn ordinary table managed by the engine itself, queryable with normal SQL.
Always-residentCatalog tables are kept in memory at all times for instant lookup.
Time-travelCatalog and data share one timeline, so AS OF TIMESTAMP works for schema too.