\set ON_ERROR_STOP on DO $assertions$ DECLARE actual_columns text[]; default_quota integer; initial_version bigint; updated_version bigint; BEGIN IF current_setting('server_version_num')::integer < 170000 OR current_setting('server_version_num')::integer >= 180000 THEN RAISE EXCEPTION 'T-009 requires PostgreSQL 17.x'; END IF; SELECT array_agg(column_name ORDER BY ordinal_position) INTO actual_columns FROM information_schema.columns WHERE table_schema = 'bell' AND table_name = 'site_quota_v1'; IF actual_columns IS DISTINCT FROM ARRAY[ 'tenant_id', 'site_id', 'max_video_channels', 'source_version', 'source_updated_at' ] THEN RAISE EXCEPTION 'site_quota_v1 signature drift: %', actual_columns; END IF; IF NOT has_table_privilege('sense_app', 'bell.site_quota_v1', 'SELECT') THEN RAISE EXCEPTION 'sense_app lacks SELECT on quota view'; END IF; IF has_table_privilege('sense_app', 'bell.site_quota_v1', 'INSERT') OR has_table_privilege('sense_app', 'bell.site_quota_v1', 'UPDATE') OR has_table_privilege('sense_app', 'bell.site_quota_v1', 'DELETE') THEN RAISE EXCEPTION 'sense_app has forbidden quota-view write privileges'; END IF; IF has_table_privilege('sense_app', 'bell.sites', 'SELECT') OR has_table_privilege('sense_app', 'bell.sites', 'INSERT') OR has_table_privilege('sense_app', 'bell.sites', 'UPDATE') OR has_table_privilege('sense_app', 'bell.sites', 'DELETE') THEN RAISE EXCEPTION 'sense_app has forbidden Bell source-table privileges'; END IF; INSERT INTO bell.sites(tenant_id, id, name) VALUES ('assertion-tenant', 'assertion-site', 'Assertion Site') RETURNING max_video_channels, version INTO default_quota, initial_version; IF default_quota <> 16 OR initial_version <> 1 THEN RAISE EXCEPTION 'Bell site default quota/version drift'; END IF; UPDATE bell.sites SET name = 'Assertion Site Updated' WHERE tenant_id = 'assertion-tenant' AND id = 'assertion-site' RETURNING version INTO updated_version; IF updated_version <> initial_version + 1 THEN RAISE EXCEPTION 'Bell site source_version is not monotonic'; END IF; BEGIN INSERT INTO bell.sites(tenant_id, id, name, max_video_channels) VALUES ('assertion-tenant', 'invalid-site', 'Invalid', 129); RAISE EXCEPTION 'quota 129 unexpectedly accepted'; EXCEPTION WHEN check_violation THEN NULL; END; DELETE FROM bell.sites WHERE tenant_id = 'assertion-tenant' AND id = 'assertion-site'; END $assertions$;