teleo-infrastructure/ops/postgres_parity_manifest.sql
2026-07-11 20:05:56 +02:00

359 lines
10 KiB
SQL

\set ON_ERROR_STOP on
begin transaction isolation level repeatable read read only;
\if :{?snapshot_id}
set transaction snapshot :'snapshot_id';
\endif
set local statement_timeout = '30s';
select jsonb_build_object(
'kind', 'identity',
'database', current_database(),
'current_user', current_user,
'server_version_num', current_setting('server_version_num')::integer,
'server_encoding', current_setting('server_encoding'),
'database_collation', (select datcollate from pg_database where datname = current_database()),
'database_ctype', (select datctype from pg_database where datname = current_database()),
'transaction_read_only', current_setting('transaction_read_only'),
'server_address', inet_server_addr()::text,
'server_port', inet_server_port(),
'ssl', coalesce((select ssl from pg_stat_ssl where pid = pg_backend_pid()), false),
'ssl_version', (select version from pg_stat_ssl where pid = pg_backend_pid()),
'captured_at', clock_timestamp()
)::text;
select jsonb_build_object(
'kind', 'schemas',
'items', coalesce(
(select jsonb_agg(nspname order by nspname)
from pg_namespace
where nspname in ('public', 'kb_stage')),
'[]'::jsonb
)
)::text;
select jsonb_build_object(
'kind', 'extensions',
'items', coalesce(
(select jsonb_agg(jsonb_build_object('name', extname, 'version', extversion) order by extname)
from pg_extension),
'[]'::jsonb
)
)::text;
select jsonb_build_object(
'kind', 'application_roles',
'items', coalesce(
(select jsonb_agg(
jsonb_build_object(
'name', rolname,
'can_login', rolcanlogin,
'superuser', rolsuper,
'create_db', rolcreatedb,
'create_role', rolcreaterole,
'inherit', rolinherit,
'replication', rolreplication,
'bypass_rls', rolbypassrls
) order by rolname)
from pg_roles
where rolname in ('kb_apply', 'kb_review')),
'[]'::jsonb
)
)::text;
select jsonb_build_object(
'kind', 'columns',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', table_schema,
'table', table_name,
'position', ordinal_position,
'name', column_name,
'data_type', data_type,
'udt_name', udt_name,
'nullable', is_nullable,
'default', column_default
) order by table_schema, table_name, ordinal_position
),
'[]'::jsonb
)
)::text
from information_schema.columns
where table_schema in ('public', 'kb_stage');
select jsonb_build_object(
'kind', 'constraints',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', namespace.nspname,
'table', relation.relname,
'name', constraint_row.conname,
'type', constraint_row.contype,
'definition', pg_get_constraintdef(constraint_row.oid, true),
'validated', constraint_row.convalidated,
'deferrable', constraint_row.condeferrable,
'initially_deferred', constraint_row.condeferred
) order by namespace.nspname, relation.relname, constraint_row.conname
),
'[]'::jsonb
)
)::text
from pg_constraint constraint_row
join pg_class relation on relation.oid = constraint_row.conrelid
join pg_namespace namespace on namespace.oid = relation.relnamespace
where namespace.nspname in ('public', 'kb_stage');
select jsonb_build_object(
'kind', 'indexes',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', schemaname,
'table', tablename,
'name', indexname,
'definition', indexdef
) order by schemaname, tablename, indexname
),
'[]'::jsonb
)
)::text
from pg_indexes
where schemaname in ('public', 'kb_stage');
select jsonb_build_object(
'kind', 'sequences',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', schemaname,
'name', sequencename,
'data_type', data_type,
'start_value', start_value,
'min_value', min_value,
'max_value', max_value,
'increment_by', increment_by,
'cycle', cycle,
'cache_size', cache_size,
'last_value', last_value
) order by schemaname, sequencename
),
'[]'::jsonb
)
)::text
from pg_sequences
where schemaname in ('public', 'kb_stage');
select jsonb_build_object(
'kind', 'views',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', schemaname,
'name', viewname,
'definition', definition
) order by schemaname, viewname
),
'[]'::jsonb
)
)::text
from pg_views
where schemaname in ('public', 'kb_stage');
select jsonb_build_object(
'kind', 'functions',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', namespace.nspname,
'name', procedure.proname,
'identity_arguments', pg_get_function_identity_arguments(procedure.oid),
'result', pg_get_function_result(procedure.oid),
'language', language.lanname,
'volatility', procedure.provolatile,
'security_definer', procedure.prosecdef,
'definition', pg_get_functiondef(procedure.oid)
) order by namespace.nspname, procedure.proname, pg_get_function_identity_arguments(procedure.oid)
),
'[]'::jsonb
)
)::text
from pg_proc procedure
join pg_namespace namespace on namespace.oid = procedure.pronamespace
join pg_language language on language.oid = procedure.prolang
where namespace.nspname in ('public', 'kb_stage');
select jsonb_build_object(
'kind', 'triggers',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', namespace.nspname,
'table', relation.relname,
'name', trigger_row.tgname,
'enabled', trigger_row.tgenabled,
'definition', pg_get_triggerdef(trigger_row.oid, true)
) order by namespace.nspname, relation.relname, trigger_row.tgname
),
'[]'::jsonb
)
)::text
from pg_trigger trigger_row
join pg_class relation on relation.oid = trigger_row.tgrelid
join pg_namespace namespace on namespace.oid = relation.relnamespace
where namespace.nspname in ('public', 'kb_stage')
and not trigger_row.tgisinternal;
select jsonb_build_object(
'kind', 'types',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', namespace.nspname,
'name', type_row.typname,
'kind', type_row.typtype,
'category', type_row.typcategory,
'base_type', case when type_row.typbasetype = 0 then null else format_type(type_row.typbasetype, null) end,
'not_null', type_row.typnotnull,
'default', type_row.typdefault,
'enum_values', (
select coalesce(jsonb_agg(enum_row.enumlabel order by enum_row.enumsortorder), '[]'::jsonb)
from pg_enum enum_row
where enum_row.enumtypid = type_row.oid
)
) order by namespace.nspname, type_row.typname
),
'[]'::jsonb
)
)::text
from pg_type type_row
join pg_namespace namespace on namespace.oid = type_row.typnamespace
where namespace.nspname in ('public', 'kb_stage')
and type_row.typtype in ('d', 'e');
select jsonb_build_object(
'kind', 'policies',
'items', coalesce(
jsonb_agg(
jsonb_build_object(
'schema', schemaname,
'table', tablename,
'name', policyname,
'permissive', permissive,
'roles', roles,
'command', cmd,
'using', qual,
'check', with_check
) order by schemaname, tablename, policyname
),
'[]'::jsonb
)
)::text
from pg_policies
where schemaname in ('public', 'kb_stage');
select format(
$manifest$
select jsonb_build_object(
'kind', 'table',
'schema', %L,
'table', %L,
'row_count', count(*)::bigint,
'rowset_md5', md5(coalesce(string_agg(to_jsonb(row_value)::text, E'\n'
order by (to_jsonb(row_value)::text) collate "C"), ''))
)::text
from %I.%I row_value;
$manifest$,
schemaname,
tablename,
schemaname,
tablename
)
from pg_tables
where schemaname in ('public', 'kb_stage')
order by schemaname, tablename
\gexec
with started as materialized (
select clock_timestamp() as at
), observed as materialized (
select count(*)::bigint as row_count, min(started.at) as started_at
from public.claims cross join started
), finished as materialized (
select clock_timestamp() as finished_at, max(row_count) as row_count, min(started_at) as started_at
from observed
)
select jsonb_build_object(
'kind', 'performance',
'query', 'count_claims',
'elapsed_ms', extract(epoch from (finished_at - started_at)) * 1000,
'observed_rows', row_count
)::text
from finished;
with started as materialized (
select clock_timestamp() as at
), candidate as materialized (
select id from public.claims order by id limit 1
), observed as materialized (
select count(*)::bigint as row_count, min(started.at) as started_at
from public.claim_evidence evidence
join candidate on candidate.id = evidence.claim_id
cross join started
), finished as materialized (
select clock_timestamp() as finished_at, max(row_count) as row_count, min(started_at) as started_at
from observed
)
select jsonb_build_object(
'kind', 'performance',
'query', 'claim_evidence_by_claim_id',
'elapsed_ms', extract(epoch from (finished_at - started_at)) * 1000,
'observed_rows', row_count
)::text
from finished;
with started as materialized (
select clock_timestamp() as at
), candidate as materialized (
select id from public.claims order by id limit 1
), observed as materialized (
select count(*)::bigint as row_count, min(started.at) as started_at
from public.claim_edges edge_row
join candidate on candidate.id in (edge_row.from_claim, edge_row.to_claim)
cross join started
), finished as materialized (
select clock_timestamp() as finished_at, max(row_count) as row_count, min(started_at) as started_at
from observed
)
select jsonb_build_object(
'kind', 'performance',
'query', 'claim_edges_by_claim_id',
'elapsed_ms', extract(epoch from (finished_at - started_at)) * 1000,
'observed_rows', row_count
)::text
from finished;
with started as materialized (
select clock_timestamp() as at
), observed as materialized (
select count(*)::bigint as row_count, min(started.at) as started_at
from (
select id from kb_stage.kb_proposals
where status = 'pending_review'
order by created_at desc
limit 25
) proposal_row
cross join started
), finished as materialized (
select clock_timestamp() as finished_at, max(row_count) as row_count, min(started_at) as started_at
from observed
)
select jsonb_build_object(
'kind', 'performance',
'query', 'pending_proposals_latest',
'elapsed_ms', extract(epoch from (finished_at - started_at)) * 1000,
'observed_rows', row_count
)::text
from finished;
rollback;