-- ============================================================ -- CANONICAL CURRENT PRODUCTION SCHEMA CONTRACT (L0) -- db: historical · schema: public -- Auto-generated by gen_l0_sql.py from read-only capture -- Modus: CURRENT VERIFIED PRODUCTION TRUTH — NICHT historische Migration -- ============================================================ -- SEMANTIC OVERRIDES (Owner-Canonical) -- last_successful_chunk = timestamp with time zone (Production + Owner decision) -- interrupt_reason = text · PRESERVED CURRENT CONTRACT · origin unknown · do not remove -- technical_quality = text · nullable · default 'VALID' · historical provenance debt OPEN CREATE SEQUENCE IF NOT EXISTS "calendar_event_event_id_seq"; CREATE SEQUENCE IF NOT EXISTS "corporate_action_action_id_seq"; CREATE SEQUENCE IF NOT EXISTS "daily_quality_report_report_id_seq"; CREATE SEQUENCE IF NOT EXISTS "data_gap_gap_id_seq"; CREATE SEQUENCE IF NOT EXISTS "data_ingestion_run_ingestion_id_seq"; CREATE SEQUENCE IF NOT EXISTS "data_quality_issue_issue_id_seq"; CREATE SEQUENCE IF NOT EXISTS "dataset_dataset_id_seq"; CREATE SEQUENCE IF NOT EXISTS "dataset_version_dataset_version_id_seq"; CREATE SEQUENCE IF NOT EXISTS "derived_bar_derived_bar_id_seq"; CREATE SEQUENCE IF NOT EXISTS "historical_bar_bar_id_seq"; CREATE SEQUENCE IF NOT EXISTS "historical_tick_tick_id_seq"; CREATE SEQUENCE IF NOT EXISTS "ingestion_provenance_provenance_id_seq"; CREATE SEQUENCE IF NOT EXISTS "instrument_instrument_id_seq"; CREATE SEQUENCE IF NOT EXISTS "market_calendar_calendar_id_seq"; CREATE SEQUENCE IF NOT EXISTS "provider_provider_id_seq"; -- Table: calendar_event (9 cols) CREATE TABLE IF NOT EXISTS "calendar_event" ( "event_id" bigint NOT NULL DEFAULT nextval('calendar_event_event_id_seq'::regclass), "calendar_id" bigint NOT NULL, "event_date" date NOT NULL, "kind" text NOT NULL, "reason" text, "session_phase_override" text, "source" text, "notes" text, "created_at" timestamp with time zone NOT NULL DEFAULT now() ); -- Table: corporate_action (9 cols) CREATE TABLE IF NOT EXISTS "corporate_action" ( "action_id" bigint NOT NULL DEFAULT nextval('corporate_action_action_id_seq'::regclass), "instrument_id" bigint NOT NULL, "action_type" text NOT NULL, "ex_date" date NOT NULL, "ratio_num" double precision, "ratio_denom" double precision, "dividend" double precision, "currency" text, "provider_id" bigint ); -- Table: daily_quality_report (23 cols) CREATE TABLE IF NOT EXISTS "daily_quality_report" ( "report_id" bigint NOT NULL DEFAULT nextval('daily_quality_report_report_id_seq'::regclass), "instrument_id" bigint NOT NULL, "provider_id" bigint NOT NULL, "report_date" date NOT NULL, "feed_type" text DEFAULT 'REFERENCE'::text, "expected_m1" bigint, "received_m1" bigint, "eligible" bigint, "excluded" bigint, "conditional" bigint, "stale_count" bigint, "zero_volume" bigint, "spread_median_price" double precision, "spread_p95_price" double precision, "spread_p99_price" double precision, "gaps_count" bigint, "coverage_ratio" double precision, "session_anomalies" bigint, "status" text NOT NULL, "quality_model_version" text, "session_model_version" text, "calendar_version" text, "generated_at" timestamp with time zone NOT NULL DEFAULT now() ); -- Table: data_gap (9 cols) CREATE TABLE IF NOT EXISTS "data_gap" ( "gap_id" bigint NOT NULL DEFAULT nextval('data_gap_gap_id_seq'::regclass), "provider_id" bigint NOT NULL, "instrument_id" bigint NOT NULL, "timeframe" text NOT NULL, "start_utc" timestamp with time zone NOT NULL, "end_utc" timestamp with time zone NOT NULL, "kind" text NOT NULL, "backfilled" boolean NOT NULL DEFAULT false, "filled_at" timestamp with time zone ); -- Table: data_ingestion_run (29 cols) CREATE TABLE IF NOT EXISTS "data_ingestion_run" ( "ingestion_id" bigint NOT NULL DEFAULT nextval('data_ingestion_run_ingestion_id_seq'::regclass), "provider_id" bigint NOT NULL, "instrument_id" bigint NOT NULL, "timeframe" text NOT NULL, "start_utc" timestamp with time zone, "end_utc" timestamp with time zone, "rows_inserted" bigint DEFAULT 0, "rows_skipped" bigint DEFAULT 0, "status" text NOT NULL DEFAULT 'RUNNING'::text, "started_at" timestamp with time zone NOT NULL DEFAULT now(), "finished_at" timestamp with time zone, "checkpoint" jsonb, "status_fsm" text DEFAULT 'PENDING'::text, "rows_downloaded" bigint DEFAULT 0, "rows_decoded" bigint DEFAULT 0, "rows_valid" bigint DEFAULT 0, "rows_suspect" bigint DEFAULT 0, "rows_excluded" bigint DEFAULT 0, "rows_derived" bigint DEFAULT 0, "last_successful_chunk" timestamp with time zone, "last_timestamp" timestamp with time zone, "updated_at" timestamp with time zone DEFAULT now(), "interrupt_reason" text, "rows_existing" bigint DEFAULT 0, "rows_deduplicated" bigint DEFAULT 0, "rows_404" bigint DEFAULT 0, "rows_503" bigint DEFAULT 0, "rows_provider_unavailable" bigint DEFAULT 0, "rows_failed" bigint DEFAULT 0 ); -- Table: data_quality_issue (9 cols) CREATE TABLE IF NOT EXISTS "data_quality_issue" ( "issue_id" bigint NOT NULL DEFAULT nextval('data_quality_issue_issue_id_seq'::regclass), "instrument_id" bigint NOT NULL, "timeframe" text NOT NULL, "ts_utc" timestamp with time zone, "severity" text NOT NULL, "issue_type" text NOT NULL, "detail" jsonb, "resolved" boolean NOT NULL DEFAULT false, "created_at" timestamp with time zone NOT NULL DEFAULT now() ); -- Table: dataset (6 cols) CREATE TABLE IF NOT EXISTS "dataset" ( "dataset_id" bigint NOT NULL DEFAULT nextval('dataset_dataset_id_seq'::regclass), "name" text NOT NULL, "provider_id" bigint NOT NULL, "feed_type" text NOT NULL, "description" text, "created_at" timestamp with time zone NOT NULL DEFAULT now() ); -- Table: dataset_version (23 cols) CREATE TABLE IF NOT EXISTS "dataset_version" ( "dataset_version_id" bigint NOT NULL DEFAULT nextval('dataset_version_dataset_version_id_seq'::regclass), "dataset_id" bigint NOT NULL, "version_label" text NOT NULL, "provider_id" bigint NOT NULL, "feed_type" text NOT NULL, "instrument_id" bigint NOT NULL, "timeframe" text NOT NULL, "start_utc" timestamp with time zone NOT NULL, "end_utc" timestamp with time zone NOT NULL, "raw_source" text NOT NULL, "normalization_version" text NOT NULL, "aggregation_version" text, "quality_version" text NOT NULL, "dataset_version_hash" text NOT NULL, "data_as_of" timestamp with time zone NOT NULL, "notes" text, "created_at" timestamp with time zone NOT NULL DEFAULT now(), "quality_model_version" text, "stale_model_version" text, "session_model_version" text, "calendar_version" text, "eligibility_model_version" text, "is_fixture" boolean NOT NULL DEFAULT false ); -- Table: derived_bar (35 cols) CREATE TABLE IF NOT EXISTS "derived_bar" ( "derived_bar_id" bigint NOT NULL DEFAULT nextval('derived_bar_derived_bar_id_seq'::regclass), "provider_id" bigint NOT NULL, "instrument_id" bigint NOT NULL, "feed_type" text NOT NULL DEFAULT 'REFERENCE'::text, "price_basis" text NOT NULL DEFAULT 'bid_ask'::text, "timeframe" text NOT NULL, "ts_utc" timestamp with time zone NOT NULL, "source_timeframe" text NOT NULL, "aggregation_version" text NOT NULL, "bid_open" double precision, "bid_high" double precision, "bid_low" double precision, "bid_close" double precision, "ask_open" double precision, "ask_high" double precision, "ask_low" double precision, "ask_close" double precision, "mid_open" double precision, "mid_high" double precision, "mid_low" double precision, "mid_close" double precision, "volume" double precision, "volume_type" text DEFAULT 'tick'::text, "quality_status" text NOT NULL DEFAULT 'VALID'::text, "quality_flags" _text, "dataset_version_id" bigint NOT NULL, "expected_bar_count" bigint, "actual_bar_count" bigint, "eligible_bar_count" bigint, "excluded_bar_count" bigint, "coverage_ratio" double precision, "aggregation_quality" text, "eligibility_model_version" text DEFAULT 'eligibility_v1'::text, "session_model_version" text DEFAULT 'fx_session_v1'::text, "calendar_version" text DEFAULT 'fx_cal_v1'::text ); -- Table: historical_bar (41 cols) CREATE TABLE IF NOT EXISTS "historical_bar" ( "bar_id" bigint NOT NULL DEFAULT nextval('historical_bar_bar_id_seq'::regclass), "provider_id" bigint NOT NULL, "instrument_id" bigint NOT NULL, "feed_type" text NOT NULL DEFAULT 'REFERENCE'::text, "price_basis" text NOT NULL DEFAULT 'bid_ask'::text, "timeframe" text NOT NULL, "ts_utc" timestamp with time zone NOT NULL, "raw_or_derived" text NOT NULL DEFAULT 'raw'::text, "source_timeframe" text, "aggregation_version" text, "bid_open" double precision, "bid_high" double precision, "bid_low" double precision, "bid_close" double precision, "ask_open" double precision, "ask_high" double precision, "ask_low" double precision, "ask_close" double precision, "mid_open" double precision, "mid_high" double precision, "mid_low" double precision, "mid_close" double precision, "volume" double precision, "volume_type" text DEFAULT 'tick'::text, "quality_status" text NOT NULL DEFAULT 'VALID'::text, "quality_flags" _text, "source_timestamp" timestamp with time zone, "ingested_at" timestamp with time zone NOT NULL DEFAULT now(), "dataset_version_id" bigint NOT NULL, "technical_quality" text DEFAULT 'VALID'::text, "market_quality" text, "session_state" text, "session_phase" text, "eligibility" text DEFAULT 'ELIGIBLE'::text, "exclusion_reason" text, "quality_model_version" text DEFAULT 'quality_v1'::text, "session_model_version" text, "calendar_version" text, "eligibility_model_version" text DEFAULT 'eligibility_v1'::text, "effective_eligibility" text, "stale_model_version" text ); -- Table: historical_tick (10 cols) CREATE TABLE IF NOT EXISTS "historical_tick" ( "tick_id" bigint NOT NULL DEFAULT nextval('historical_tick_tick_id_seq'::regclass), "provider_id" bigint NOT NULL, "instrument_id" bigint NOT NULL, "feed_type" text NOT NULL DEFAULT 'REFERENCE'::text, "ts_utc" timestamp with time zone NOT NULL, "bid" double precision, "ask" double precision, "last" double precision, "volume" double precision, "dataset_version_id" bigint NOT NULL ); -- Table: ingestion_provenance (41 cols) CREATE TABLE IF NOT EXISTS "ingestion_provenance" ( "provenance_id" bigint NOT NULL, "ingestion_run_id" bigint NOT NULL, "provider_id" bigint NOT NULL, "provider_name_snapshot" text NOT NULL, "provider_environment_class" text NOT NULL, "provider_dataset" text NOT NULL, "provider_feed" text NOT NULL, "provider_instrument_id" text NOT NULL, "canonical_instrument_id" bigint NOT NULL, "asset_class" text NOT NULL, "request_start" timestamp with time zone NOT NULL, "request_end" timestamp with time zone NOT NULL, "actual_start" timestamp with time zone NOT NULL, "actual_end" timestamp with time zone NOT NULL, "request_timestamp" timestamp with time zone NOT NULL, "response_timestamp" timestamp with time zone NOT NULL, "http_status" integer NOT NULL, "provider_metadata" jsonb, "provider_version" text, "raw_payload_sha256" text NOT NULL, "raw_content_length" bigint NOT NULL, "compression" text NOT NULL, "content_type" text, "parser_version" text NOT NULL, "adapter_version" text NOT NULL, "normalization_version" text NOT NULL, "timezone_source" text NOT NULL, "timezone_target" text NOT NULL, "timezone_transform_version" text NOT NULL, "price_type" text NOT NULL, "granularity" text NOT NULL, "correction_status" text NOT NULL DEFAULT 'ORIGINAL'::text, "license_class" text NOT NULL DEFAULT 'UNKNOWN'::text, "software_git_commit" text NOT NULL, "software_image_id" text NOT NULL, "software_build_input_sha" text, "request_identity_hash" text NOT NULL, "supersedes_provenance_id" bigint, "raw_storage_ref" text, "extra" jsonb, "created_at" timestamp with time zone NOT NULL DEFAULT now() ); -- Table: instrument (13 cols) CREATE TABLE IF NOT EXISTS "instrument" ( "instrument_id" bigint NOT NULL DEFAULT nextval('instrument_instrument_id_seq'::regclass), "symbol" text NOT NULL, "asset_class" text NOT NULL, "name" text, "currency" text, "exchange" text, "mic" text, "isin" text, "tick_size" double precision, "contract_size" double precision, "min_deal_size" double precision, "active" boolean NOT NULL DEFAULT true, "created_at" timestamp with time zone NOT NULL DEFAULT now() ); -- Table: market_calendar (13 cols) CREATE TABLE IF NOT EXISTS "market_calendar" ( "calendar_id" bigint NOT NULL DEFAULT nextval('market_calendar_calendar_id_seq'::regclass), "calendar_name" text NOT NULL, "asset_class" text NOT NULL, "venue_exchange" text, "timezone" text NOT NULL, "week_open_utc" text, "week_close_utc" text, "rollover_utc" text, "session_open_utc" text, "session_close_utc" text, "notes" text, "calendar_version" text NOT NULL, "created_at" timestamp with time zone NOT NULL DEFAULT now() ); -- Table: provider (6 cols) CREATE TABLE IF NOT EXISTS "provider" ( "provider_id" bigint NOT NULL DEFAULT nextval('provider_provider_id_seq'::regclass), "provider_key" text NOT NULL, "name" text NOT NULL, "data_type" text NOT NULL, "pricing_plan" text, "license_terms" text ); -- Table: provider_instrument (6 cols) CREATE TABLE IF NOT EXISTS "provider_instrument" ( "provider_id" bigint NOT NULL, "instrument_id" bigint NOT NULL, "provider_symbol" text NOT NULL, "broker_epic" text, "extra_metadata" jsonb, "active" boolean NOT NULL DEFAULT true ); ALTER TABLE "calendar_event" ADD CONSTRAINT "calendar_event_pkey" PRIMARY KEY ("event_id"); ALTER TABLE "corporate_action" ADD CONSTRAINT "corporate_action_pkey" PRIMARY KEY ("action_id"); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "daily_quality_report_pkey" PRIMARY KEY ("report_id"); ALTER TABLE "data_gap" ADD CONSTRAINT "data_gap_pkey" PRIMARY KEY ("gap_id"); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "data_ingestion_run_pkey" PRIMARY KEY ("ingestion_id"); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "data_quality_issue_pkey" PRIMARY KEY ("issue_id"); ALTER TABLE "dataset" ADD CONSTRAINT "dataset_pkey" PRIMARY KEY ("dataset_id"); ALTER TABLE "dataset_version" ADD CONSTRAINT "dataset_version_pkey" PRIMARY KEY ("dataset_version_id"); ALTER TABLE "derived_bar" ADD CONSTRAINT "derived_bar_pkey" PRIMARY KEY ("derived_bar_id"); ALTER TABLE "historical_bar" ADD CONSTRAINT "historical_bar_pkey" PRIMARY KEY ("bar_id"); ALTER TABLE "historical_tick" ADD CONSTRAINT "historical_tick_pkey" PRIMARY KEY ("tick_id"); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "ingestion_provenance_pkey" PRIMARY KEY ("provenance_id"); ALTER TABLE "instrument" ADD CONSTRAINT "instrument_pkey" PRIMARY KEY ("instrument_id"); ALTER TABLE "market_calendar" ADD CONSTRAINT "market_calendar_pkey" PRIMARY KEY ("calendar_id"); ALTER TABLE "provider" ADD CONSTRAINT "provider_pkey" PRIMARY KEY ("provider_id"); ALTER TABLE "provider_instrument" ADD CONSTRAINT "provider_instrument_pkey" PRIMARY KEY ("provider_id", "instrument_id"); ALTER TABLE "calendar_event" ADD CONSTRAINT "calendar_event_calendar_id_event_date_kind_key" UNIQUE ("calendar_id", "event_date", "kind"); ALTER TABLE "corporate_action" ADD CONSTRAINT "corporate_action_instrument_id_action_type_ex_date_provider_key" UNIQUE ("instrument_id", "action_type", "ex_date", "provider_id"); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "daily_quality_report_instrument_id_provider_id_report_date__key" UNIQUE ("instrument_id", "provider_id", "report_date", "feed_type"); ALTER TABLE "data_gap" ADD CONSTRAINT "data_gap_unique" UNIQUE ("provider_id", "instrument_id", "timeframe", "start_utc", "end_utc", "kind"); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "data_ingestion_run_provider_id_instrument_id_timeframe_star_key" UNIQUE ("provider_id", "instrument_id", "timeframe", "started_at"); ALTER TABLE "dataset" ADD CONSTRAINT "dataset_name_key" UNIQUE ("name"); ALTER TABLE "dataset_version" ADD CONSTRAINT "dataset_version_dataset_version_hash_key" UNIQUE ("dataset_version_hash"); ALTER TABLE "derived_bar" ADD CONSTRAINT "derived_bar_provider_id_instrument_id_feed_type_price_basis_key" UNIQUE ("provider_id", "instrument_id", "feed_type", "price_basis", "timeframe", "ts_utc", "aggregation_version"); ALTER TABLE "historical_bar" ADD CONSTRAINT "historical_bar_provider_id_instrument_id_feed_type_price_ba_key" UNIQUE ("provider_id", "instrument_id", "feed_type", "price_basis", "timeframe", "ts_utc", "raw_or_derived"); ALTER TABLE "historical_tick" ADD CONSTRAINT "historical_tick_provider_id_instrument_id_feed_type_ts_utc__key" UNIQUE ("provider_id", "instrument_id", "feed_type", "ts_utc", "bid", "ask"); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "ingestion_provenance_ingestion_run_id_key" UNIQUE ("ingestion_run_id"); ALTER TABLE "instrument" ADD CONSTRAINT "instrument_symbol_key" UNIQUE ("symbol"); ALTER TABLE "market_calendar" ADD CONSTRAINT "market_calendar_calendar_name_key" UNIQUE ("calendar_name"); ALTER TABLE "provider" ADD CONSTRAINT "provider_provider_key_key" UNIQUE ("provider_key"); ALTER TABLE "provider_instrument" ADD CONSTRAINT "provider_instrument_provider_id_provider_symbol_key" UNIQUE ("provider_id", "provider_symbol"); ALTER TABLE "calendar_event" ADD CONSTRAINT "calendar_event_calendar_id_fkey" FOREIGN KEY ("calendar_id") REFERENCES "market_calendar" ("calendar_id"); ALTER TABLE "corporate_action" ADD CONSTRAINT "corporate_action_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "corporate_action" ADD CONSTRAINT "corporate_action_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "daily_quality_report_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "daily_quality_report_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "data_gap" ADD CONSTRAINT "data_gap_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "data_gap" ADD CONSTRAINT "data_gap_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "data_ingestion_run_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "data_ingestion_run_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "data_quality_issue_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "dataset" ADD CONSTRAINT "dataset_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "dataset_version" ADD CONSTRAINT "dataset_version_dataset_id_fkey" FOREIGN KEY ("dataset_id") REFERENCES "dataset" ("dataset_id"); ALTER TABLE "dataset_version" ADD CONSTRAINT "dataset_version_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "dataset_version" ADD CONSTRAINT "dataset_version_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "derived_bar" ADD CONSTRAINT "derived_bar_dataset_version_id_fkey" FOREIGN KEY ("dataset_version_id") REFERENCES "dataset_version" ("dataset_version_id"); ALTER TABLE "derived_bar" ADD CONSTRAINT "derived_bar_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "derived_bar" ADD CONSTRAINT "derived_bar_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "historical_bar" ADD CONSTRAINT "historical_bar_dataset_version_id_fkey" FOREIGN KEY ("dataset_version_id") REFERENCES "dataset_version" ("dataset_version_id"); ALTER TABLE "historical_bar" ADD CONSTRAINT "historical_bar_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "historical_bar" ADD CONSTRAINT "historical_bar_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "historical_tick" ADD CONSTRAINT "historical_tick_dataset_version_id_fkey" FOREIGN KEY ("dataset_version_id") REFERENCES "dataset_version" ("dataset_version_id"); ALTER TABLE "historical_tick" ADD CONSTRAINT "historical_tick_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "historical_tick" ADD CONSTRAINT "historical_tick_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "ingestion_provenance_canonical_instrument_id_fkey" FOREIGN KEY ("canonical_instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "ingestion_provenance_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "ingestion_provenance_supersedes_fkey" FOREIGN KEY ("supersedes_provenance_id") REFERENCES "ingestion_provenance" ("provenance_id"); ALTER TABLE "provider_instrument" ADD CONSTRAINT "provider_instrument_instrument_id_fkey" FOREIGN KEY ("instrument_id") REFERENCES "instrument" ("instrument_id"); ALTER TABLE "provider_instrument" ADD CONSTRAINT "provider_instrument_provider_id_fkey" FOREIGN KEY ("provider_id") REFERENCES "provider" ("provider_id"); ALTER TABLE "calendar_event" ADD CONSTRAINT "2200_16679_1_not_null" CHECK (event_id IS NOT NULL); ALTER TABLE "calendar_event" ADD CONSTRAINT "2200_16679_2_not_null" CHECK (calendar_id IS NOT NULL); ALTER TABLE "calendar_event" ADD CONSTRAINT "2200_16679_3_not_null" CHECK (event_date IS NOT NULL); ALTER TABLE "calendar_event" ADD CONSTRAINT "2200_16679_4_not_null" CHECK (kind IS NOT NULL); ALTER TABLE "calendar_event" ADD CONSTRAINT "2200_16679_9_not_null" CHECK (created_at IS NOT NULL); ALTER TABLE "corporate_action" ADD CONSTRAINT "2200_16567_1_not_null" CHECK (action_id IS NOT NULL); ALTER TABLE "corporate_action" ADD CONSTRAINT "2200_16567_2_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "corporate_action" ADD CONSTRAINT "2200_16567_3_not_null" CHECK (action_type IS NOT NULL); ALTER TABLE "corporate_action" ADD CONSTRAINT "2200_16567_4_not_null" CHECK (ex_date IS NOT NULL); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "2200_16696_19_not_null" CHECK (status IS NOT NULL); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "2200_16696_1_not_null" CHECK (report_id IS NOT NULL); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "2200_16696_23_not_null" CHECK (generated_at IS NOT NULL); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "2200_16696_2_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "2200_16696_3_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "daily_quality_report" ADD CONSTRAINT "2200_16696_4_not_null" CHECK (report_date IS NOT NULL); ALTER TABLE "data_gap" ADD CONSTRAINT "2200_16613_1_not_null" CHECK (gap_id IS NOT NULL); ALTER TABLE "data_gap" ADD CONSTRAINT "2200_16613_2_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "data_gap" ADD CONSTRAINT "2200_16613_3_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "data_gap" ADD CONSTRAINT "2200_16613_4_not_null" CHECK (timeframe IS NOT NULL); ALTER TABLE "data_gap" ADD CONSTRAINT "2200_16613_5_not_null" CHECK (start_utc IS NOT NULL); ALTER TABLE "data_gap" ADD CONSTRAINT "2200_16613_6_not_null" CHECK (end_utc IS NOT NULL); ALTER TABLE "data_gap" ADD CONSTRAINT "2200_16613_7_not_null" CHECK (kind IS NOT NULL); ALTER TABLE "data_gap" ADD CONSTRAINT "2200_16613_8_not_null" CHECK (backfilled IS NOT NULL); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "2200_16588_10_not_null" CHECK (started_at IS NOT NULL); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "2200_16588_1_not_null" CHECK (ingestion_id IS NOT NULL); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "2200_16588_2_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "2200_16588_3_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "2200_16588_4_not_null" CHECK (timeframe IS NOT NULL); ALTER TABLE "data_ingestion_run" ADD CONSTRAINT "2200_16588_9_not_null" CHECK (status IS NOT NULL); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "2200_16633_1_not_null" CHECK (issue_id IS NOT NULL); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "2200_16633_2_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "2200_16633_3_not_null" CHECK (timeframe IS NOT NULL); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "2200_16633_5_not_null" CHECK (severity IS NOT NULL); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "2200_16633_6_not_null" CHECK (issue_type IS NOT NULL); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "2200_16633_8_not_null" CHECK (resolved IS NOT NULL); ALTER TABLE "data_quality_issue" ADD CONSTRAINT "2200_16633_9_not_null" CHECK (created_at IS NOT NULL); ALTER TABLE "dataset" ADD CONSTRAINT "2200_16430_1_not_null" CHECK (dataset_id IS NOT NULL); ALTER TABLE "dataset" ADD CONSTRAINT "2200_16430_2_not_null" CHECK (name IS NOT NULL); ALTER TABLE "dataset" ADD CONSTRAINT "2200_16430_3_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "dataset" ADD CONSTRAINT "2200_16430_4_not_null" CHECK (feed_type IS NOT NULL); ALTER TABLE "dataset" ADD CONSTRAINT "2200_16430_6_not_null" CHECK (created_at IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_10_not_null" CHECK (raw_source IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_11_not_null" CHECK (normalization_version IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_13_not_null" CHECK (quality_version IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_14_not_null" CHECK (dataset_version_hash IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_15_not_null" CHECK (data_as_of IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_17_not_null" CHECK (created_at IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_1_not_null" CHECK (dataset_version_id IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_23_not_null" CHECK (is_fixture IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_2_not_null" CHECK (dataset_id IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_3_not_null" CHECK (version_label IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_4_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_5_not_null" CHECK (feed_type IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_6_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_7_not_null" CHECK (timeframe IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_8_not_null" CHECK (start_utc IS NOT NULL); ALTER TABLE "dataset_version" ADD CONSTRAINT "2200_16447_9_not_null" CHECK (end_utc IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_1_not_null" CHECK (derived_bar_id IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_24_not_null" CHECK (quality_status IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_26_not_null" CHECK (dataset_version_id IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_2_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_3_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_4_not_null" CHECK (feed_type IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_5_not_null" CHECK (price_basis IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_6_not_null" CHECK (timeframe IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_7_not_null" CHECK (ts_utc IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_8_not_null" CHECK (source_timeframe IS NOT NULL); ALTER TABLE "derived_bar" ADD CONSTRAINT "2200_16508_9_not_null" CHECK (aggregation_version IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_1_not_null" CHECK (bar_id IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_25_not_null" CHECK (quality_status IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_28_not_null" CHECK (ingested_at IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_29_not_null" CHECK (dataset_version_id IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_2_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_3_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_4_not_null" CHECK (feed_type IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_5_not_null" CHECK (price_basis IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_6_not_null" CHECK (timeframe IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_7_not_null" CHECK (ts_utc IS NOT NULL); ALTER TABLE "historical_bar" ADD CONSTRAINT "2200_16474_8_not_null" CHECK (raw_or_derived IS NOT NULL); ALTER TABLE "historical_tick" ADD CONSTRAINT "2200_16539_10_not_null" CHECK (dataset_version_id IS NOT NULL); ALTER TABLE "historical_tick" ADD CONSTRAINT "2200_16539_1_not_null" CHECK (tick_id IS NOT NULL); ALTER TABLE "historical_tick" ADD CONSTRAINT "2200_16539_2_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "historical_tick" ADD CONSTRAINT "2200_16539_3_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "historical_tick" ADD CONSTRAINT "2200_16539_4_not_null" CHECK (feed_type IS NOT NULL); ALTER TABLE "historical_tick" ADD CONSTRAINT "2200_16539_5_not_null" CHECK (ts_utc IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_10_not_null" CHECK (asset_class IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_11_not_null" CHECK (request_start IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_12_not_null" CHECK (request_end IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_13_not_null" CHECK (actual_start IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_14_not_null" CHECK (actual_end IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_15_not_null" CHECK (request_timestamp IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_16_not_null" CHECK (response_timestamp IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_17_not_null" CHECK (http_status IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_1_not_null" CHECK (provenance_id IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_20_not_null" CHECK (raw_payload_sha256 IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_21_not_null" CHECK (raw_content_length IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_22_not_null" CHECK (compression IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_24_not_null" CHECK (parser_version IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_25_not_null" CHECK (adapter_version IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_26_not_null" CHECK (normalization_version IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_27_not_null" CHECK (timezone_source IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_28_not_null" CHECK (timezone_target IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_29_not_null" CHECK (timezone_transform_version IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_2_not_null" CHECK (ingestion_run_id IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_30_not_null" CHECK (price_type IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_31_not_null" CHECK (granularity IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_32_not_null" CHECK (correction_status IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_33_not_null" CHECK (license_class IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_34_not_null" CHECK (software_git_commit IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_35_not_null" CHECK (software_image_id IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_37_not_null" CHECK (request_identity_hash IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_3_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_41_not_null" CHECK (created_at IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_4_not_null" CHECK (provider_name_snapshot IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_5_not_null" CHECK (provider_environment_class IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_6_not_null" CHECK (provider_dataset IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_7_not_null" CHECK (provider_feed IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_8_not_null" CHECK (provider_instrument_id IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "2200_16741_9_not_null" CHECK (canonical_instrument_id IS NOT NULL); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_actual_range" CHECK (((actual_end >= actual_start))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_compression" CHECK (((compression = ANY (ARRAY['none'::text, 'lzma'::text, 'gzip'::text, 'zstd'::text, 'deflate'::text, 'unknown'::text])))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_content_length" CHECK (((raw_content_length >= 0))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_correction" CHECK (((correction_status = ANY (ARRAY['ORIGINAL'::text, 'CORRECTED'::text, 'SUPERSEDED'::text, 'UNKNOWN'::text])))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_env_class" CHECK (((provider_environment_class = ANY (ARRAY['PROD'::text, 'SANDBOX'::text, 'TEST'::text, 'UNKNOWN'::text])))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_http_status" CHECK ((((http_status >= 100) AND (http_status <= 599)))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_license" CHECK (((license_class = ANY (ARRAY['UNKNOWN'::text, 'PRIVATE_INTERNAL'::text, 'INTERNAL_DERIVED_ALLOWED'::text, 'STORAGE_RESTRICTED'::text, 'REDISTRIBUTION_RESTRICTED'::text, 'EXPIRED'::text, 'REVOKED'::text])))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_price_type" CHECK (((price_type = ANY (ARRAY['bid'::text, 'ask'::text, 'mid'::text, 'bid_ask'::text, 'last'::text, 'unknown'::text])))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_sha256" CHECK (((raw_payload_sha256 ~ '^[0-9a-f]{64}$'::text))); ALTER TABLE "ingestion_provenance" ADD CONSTRAINT "chk_prov_time_range" CHECK (((request_end >= request_start))); ALTER TABLE "instrument" ADD CONSTRAINT "2200_16386_12_not_null" CHECK (active IS NOT NULL); ALTER TABLE "instrument" ADD CONSTRAINT "2200_16386_13_not_null" CHECK (created_at IS NOT NULL); ALTER TABLE "instrument" ADD CONSTRAINT "2200_16386_1_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "instrument" ADD CONSTRAINT "2200_16386_2_not_null" CHECK (symbol IS NOT NULL); ALTER TABLE "instrument" ADD CONSTRAINT "2200_16386_3_not_null" CHECK (asset_class IS NOT NULL); ALTER TABLE "market_calendar" ADD CONSTRAINT "2200_16667_12_not_null" CHECK (calendar_version IS NOT NULL); ALTER TABLE "market_calendar" ADD CONSTRAINT "2200_16667_13_not_null" CHECK (created_at IS NOT NULL); ALTER TABLE "market_calendar" ADD CONSTRAINT "2200_16667_1_not_null" CHECK (calendar_id IS NOT NULL); ALTER TABLE "market_calendar" ADD CONSTRAINT "2200_16667_2_not_null" CHECK (calendar_name IS NOT NULL); ALTER TABLE "market_calendar" ADD CONSTRAINT "2200_16667_3_not_null" CHECK (asset_class IS NOT NULL); ALTER TABLE "market_calendar" ADD CONSTRAINT "2200_16667_5_not_null" CHECK (timezone IS NOT NULL); ALTER TABLE "provider" ADD CONSTRAINT "2200_16399_1_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "provider" ADD CONSTRAINT "2200_16399_2_not_null" CHECK (provider_key IS NOT NULL); ALTER TABLE "provider" ADD CONSTRAINT "2200_16399_3_not_null" CHECK (name IS NOT NULL); ALTER TABLE "provider" ADD CONSTRAINT "2200_16399_4_not_null" CHECK (data_type IS NOT NULL); ALTER TABLE "provider_instrument" ADD CONSTRAINT "2200_16409_1_not_null" CHECK (provider_id IS NOT NULL); ALTER TABLE "provider_instrument" ADD CONSTRAINT "2200_16409_2_not_null" CHECK (instrument_id IS NOT NULL); ALTER TABLE "provider_instrument" ADD CONSTRAINT "2200_16409_3_not_null" CHECK (provider_symbol IS NOT NULL); ALTER TABLE "provider_instrument" ADD CONSTRAINT "2200_16409_6_not_null" CHECK (active IS NOT NULL); CREATE INDEX idx_bar_dsver ON public.historical_bar USING btree (dataset_version_id); CREATE INDEX idx_bar_elig ON public.historical_bar USING btree (eligibility); CREATE INDEX idx_bar_inst_tf_ts ON public.historical_bar USING btree (instrument_id, timeframe, ts_utc); CREATE INDEX idx_bar_sess_ts ON public.historical_bar USING btree (session_state, instrument_id, ts_utc); CREATE INDEX idx_bar_session ON public.historical_bar USING btree (session_state, session_phase); CREATE INDEX idx_bar_techq ON public.historical_bar USING btree (technical_quality); CREATE INDEX idx_derived_inst_tf_ts ON public.derived_bar USING btree (instrument_id, timeframe, ts_utc); CREATE INDEX idx_historical_bar_market_quality ON public.historical_bar USING btree (instrument_id, market_quality); CREATE INDEX idx_historical_bar_session_state ON public.historical_bar USING btree (instrument_id, session_state); CREATE INDEX idx_prov_adapter_version ON public.ingestion_provenance USING btree (adapter_version); CREATE INDEX idx_prov_instrument ON public.ingestion_provenance USING btree (canonical_instrument_id); CREATE INDEX idx_prov_provider_feed ON public.ingestion_provenance USING btree (provider_id, provider_feed); CREATE INDEX idx_prov_raw_sha ON public.ingestion_provenance USING btree (raw_payload_sha256); CREATE INDEX idx_prov_request_identity ON public.ingestion_provenance USING btree (request_identity_hash); CREATE INDEX idx_prov_time_range ON public.ingestion_provenance USING btree (request_start, request_end); CREATE INDEX idx_tick_inst_ts ON public.historical_tick USING btree (instrument_id, ts_utc);