
-- Baseline v2 extension: usage body blobs

CREATE TABLE IF NOT EXISTS public.usage_body_blobs (
    body_ref character varying(160) NOT NULL,
    request_id character varying(100) NOT NULL,
    body_field character varying(50) NOT NULL,
    payload_gzip bytea NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT usage_body_blobs_pkey PRIMARY KEY (body_ref),
    CONSTRAINT usage_body_blobs_request_id_field_key UNIQUE (request_id, body_field),
    CONSTRAINT usage_body_blobs_request_id_fkey
        FOREIGN KEY (request_id)
        REFERENCES public.usage(request_id)
        ON DELETE CASCADE
);

CREATE INDEX IF NOT EXISTS ix_usage_body_blobs_request_id
    ON public.usage_body_blobs USING btree (request_id);


-- Baseline v2 extension: usage http audits

CREATE TABLE IF NOT EXISTS public.usage_http_audits (
    request_id character varying(100) NOT NULL,
    request_headers json,
    provider_request_headers json,
    response_headers json,
    client_response_headers json,
    request_body_ref character varying(160),
    provider_request_body_ref character varying(160),
    response_body_ref character varying(160),
    client_response_body_ref character varying(160),
    request_body_state character varying(32),
    provider_request_body_state character varying(32),
    response_body_state character varying(32),
    client_response_body_state character varying(32),
    body_capture_mode character varying(32) DEFAULT 'none' NOT NULL,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT usage_http_audits_pkey PRIMARY KEY (request_id),
    CONSTRAINT usage_http_audits_request_id_fkey
        FOREIGN KEY (request_id)
        REFERENCES public.usage(request_id)
        ON DELETE CASCADE
);

CREATE INDEX IF NOT EXISTS ix_usage_http_audits_updated_at
    ON public.usage_http_audits USING btree (updated_at);


-- Baseline v2 extension: usage routing snapshots

CREATE TABLE IF NOT EXISTS public.usage_routing_snapshots (
    request_id character varying(100) NOT NULL,
    candidate_id character varying(160),
    candidate_index integer,
    key_name character varying(255),
    planner_kind character varying(120),
    route_family character varying(80),
    route_kind character varying(80),
    execution_path character varying(80),
    local_execution_runtime_miss_reason character varying(120),
    selected_provider_id character varying(100),
    selected_endpoint_id character varying(100),
    selected_provider_api_key_id character varying(100),
    has_format_conversion boolean,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT usage_routing_snapshots_pkey PRIMARY KEY (request_id),
    CONSTRAINT usage_routing_snapshots_request_id_fkey
        FOREIGN KEY (request_id)
        REFERENCES public.usage(request_id)
        ON DELETE CASCADE
);

CREATE INDEX IF NOT EXISTS ix_usage_routing_snapshots_route_family_kind
    ON public.usage_routing_snapshots USING btree (route_family, route_kind);

CREATE INDEX IF NOT EXISTS ix_usage_routing_snapshots_candidate_id
    ON public.usage_routing_snapshots USING btree (candidate_id);


CREATE TABLE IF NOT EXISTS public.usage_settlement_snapshots (
    request_id character varying(100) NOT NULL,
    billing_status character varying(20) NOT NULL,
    wallet_id character varying(36),
    wallet_balance_before numeric(20,8),
    wallet_balance_after numeric(20,8),
    wallet_recharge_balance_before numeric(20,8),
    wallet_recharge_balance_after numeric(20,8),
    wallet_gift_balance_before numeric(20,8),
    wallet_gift_balance_after numeric(20,8),
    provider_monthly_used_usd numeric(20,8),
    finalized_at timestamp with time zone,
    created_at timestamp with time zone DEFAULT now() NOT NULL,
    updated_at timestamp with time zone DEFAULT now() NOT NULL,
    CONSTRAINT usage_settlement_snapshots_pkey PRIMARY KEY (request_id),
    CONSTRAINT usage_settlement_snapshots_request_id_fkey
        FOREIGN KEY (request_id)
        REFERENCES public.usage(request_id)
        ON DELETE CASCADE
);

CREATE INDEX IF NOT EXISTS ix_usage_settlement_snapshots_wallet_id
    ON public.usage_settlement_snapshots USING btree (wallet_id);

CREATE INDEX IF NOT EXISTS ix_usage_settlement_snapshots_billing_status
    ON public.usage_settlement_snapshots USING btree (billing_status);


ALTER TABLE IF EXISTS public.usage_settlement_snapshots
    ADD COLUMN IF NOT EXISTS billing_snapshot_schema_version character varying(20),
    ADD COLUMN IF NOT EXISTS billing_snapshot_status character varying(20),
    ADD COLUMN IF NOT EXISTS rate_multiplier numeric(10,6),
    ADD COLUMN IF NOT EXISTS is_free_tier boolean,
    ADD COLUMN IF NOT EXISTS input_price_per_1m numeric(20,8),
    ADD COLUMN IF NOT EXISTS output_price_per_1m numeric(20,8),
    ADD COLUMN IF NOT EXISTS cache_creation_price_per_1m numeric(20,8),
    ADD COLUMN IF NOT EXISTS cache_read_price_per_1m numeric(20,8),
    ADD COLUMN IF NOT EXISTS price_per_request numeric(20,8),
    ADD COLUMN IF NOT EXISTS settlement_snapshot_schema_version character varying(20),
    ADD COLUMN IF NOT EXISTS settlement_snapshot jsonb,
    ADD COLUMN IF NOT EXISTS billing_dimensions jsonb,
    ADD COLUMN IF NOT EXISTS billing_input_tokens bigint,
    ADD COLUMN IF NOT EXISTS billing_effective_input_tokens bigint,
    ADD COLUMN IF NOT EXISTS billing_output_tokens bigint,
    ADD COLUMN IF NOT EXISTS billing_cache_creation_tokens bigint,
    ADD COLUMN IF NOT EXISTS billing_cache_creation_5m_tokens bigint,
    ADD COLUMN IF NOT EXISTS billing_cache_creation_1h_tokens bigint,
    ADD COLUMN IF NOT EXISTS billing_cache_read_tokens bigint,
    ADD COLUMN IF NOT EXISTS billing_total_input_context bigint,
    ADD COLUMN IF NOT EXISTS billing_cache_creation_cost_usd numeric(20,8),
    ADD COLUMN IF NOT EXISTS billing_cache_read_cost_usd numeric(20,8),
    ADD COLUMN IF NOT EXISTS billing_total_cost_usd numeric(20,8),
    ADD COLUMN IF NOT EXISTS billing_actual_total_cost_usd numeric(20,8),
    ADD COLUMN IF NOT EXISTS billing_pricing_source character varying(50),
    ADD COLUMN IF NOT EXISTS billing_rule_id character varying(100),
    ADD COLUMN IF NOT EXISTS billing_rule_version character varying(50);

CREATE INDEX IF NOT EXISTS ix_usage_settlement_snapshots_schema_version
    ON public.usage_settlement_snapshots USING btree (settlement_snapshot_schema_version);

CREATE INDEX IF NOT EXISTS ix_usage_settlement_snapshots_pricing_source
    ON public.usage_settlement_snapshots USING btree (billing_pricing_source);

CREATE OR REPLACE VIEW public.usage_billing_facts AS
SELECT
  usage_rows.id,
  usage_rows.request_id,
  usage_rows.user_id,
  usage_rows.api_key_id,
  usage_rows.username,
  usage_rows.api_key_name,
  usage_rows.provider_name,
  usage_rows.model,
  usage_rows.target_model,
  usage_rows.provider_id,
  usage_rows.provider_endpoint_id,
  usage_rows.provider_api_key_id,
  usage_rows.request_type,
  usage_rows.api_format,
  usage_rows.api_family,
  usage_rows.endpoint_kind,
  usage_rows.endpoint_api_format,
  usage_rows.provider_api_family,
  usage_rows.provider_endpoint_kind,
  COALESCE(usage_rows.has_format_conversion, FALSE) AS has_format_conversion,
  COALESCE(usage_rows.is_stream, FALSE) AS is_stream,
  usage_rows.status_code,
  usage_rows.error_message,
  usage_rows.error_category,
  usage_rows.response_time_ms,
  usage_rows.first_byte_time_ms,
  usage_rows.status,
  COALESCE(settlement.billing_status, usage_rows.billing_status) AS billing_status,
  usage_rows.created_at,
  COALESCE(settlement.finalized_at, usage_rows.finalized_at) AS finalized_at,
  GREATEST(COALESCE(settlement.billing_input_tokens, usage_rows.input_tokens, 0), 0)::bigint
    AS input_tokens,
  GREATEST(
    COALESCE(
      settlement.billing_effective_input_tokens,
      CASE
        WHEN GREATEST(COALESCE(usage_rows.input_tokens, 0), 0) <= 0 THEN 0
        WHEN GREATEST(COALESCE(usage_rows.cache_read_input_tokens, 0), 0) <= 0
        THEN GREATEST(COALESCE(usage_rows.input_tokens, 0), 0)
        WHEN split_part(lower(COALESCE(COALESCE(usage_rows.endpoint_api_format, usage_rows.api_format), '')), ':', 1)
             IN ('openai', 'gemini', 'google')
        THEN GREATEST(
          GREATEST(COALESCE(usage_rows.input_tokens, 0), 0)
            - GREATEST(COALESCE(usage_rows.cache_read_input_tokens, 0), 0),
          0
        )
        ELSE GREATEST(COALESCE(usage_rows.input_tokens, 0), 0)
      END
    ),
    0
  )::bigint AS effective_input_tokens,
  GREATEST(COALESCE(settlement.billing_output_tokens, usage_rows.output_tokens, 0), 0)::bigint
    AS output_tokens,
  GREATEST(
    COALESCE(
      settlement.billing_cache_creation_tokens,
      CASE
        WHEN COALESCE(usage_rows.cache_creation_input_tokens, 0) = 0
             AND (
               COALESCE(usage_rows.cache_creation_input_tokens_5m, 0)
               + COALESCE(usage_rows.cache_creation_input_tokens_1h, 0)
             ) > 0
        THEN COALESCE(usage_rows.cache_creation_input_tokens_5m, 0)
           + COALESCE(usage_rows.cache_creation_input_tokens_1h, 0)
        ELSE COALESCE(usage_rows.cache_creation_input_tokens, 0)
      END,
      0
    ),
    0
  )::bigint AS cache_creation_input_tokens,
  GREATEST(
    COALESCE(
      settlement.billing_cache_creation_5m_tokens,
      usage_rows.cache_creation_input_tokens_5m,
      0
    ),
    0
  )::bigint AS cache_creation_input_tokens_5m,
  GREATEST(
    COALESCE(
      settlement.billing_cache_creation_1h_tokens,
      usage_rows.cache_creation_input_tokens_1h,
      0
    ),
    0
  )::bigint AS cache_creation_input_tokens_1h,
  GREATEST(COALESCE(settlement.billing_cache_read_tokens, usage_rows.cache_read_input_tokens, 0), 0)::bigint
    AS cache_read_input_tokens,
  GREATEST(
    COALESCE(
      CASE
        WHEN settlement.billing_input_tokens IS NOT NULL
          OR settlement.billing_output_tokens IS NOT NULL
          OR settlement.billing_cache_creation_tokens IS NOT NULL
          OR settlement.billing_cache_creation_5m_tokens IS NOT NULL
          OR settlement.billing_cache_creation_1h_tokens IS NOT NULL
          OR settlement.billing_cache_read_tokens IS NOT NULL
        THEN COALESCE(settlement.billing_input_tokens, 0)
          + COALESCE(settlement.billing_output_tokens, 0)
          + COALESCE(
              settlement.billing_cache_creation_tokens,
              COALESCE(settlement.billing_cache_creation_5m_tokens, 0)
                + COALESCE(settlement.billing_cache_creation_1h_tokens, 0),
              0
            )
          + COALESCE(settlement.billing_cache_read_tokens, 0)
      END,
      usage_rows.total_tokens,
      0
    ),
    0
  )::bigint AS total_tokens,
  GREATEST(
    COALESCE(
      settlement.billing_total_input_context,
      CASE
        WHEN split_part(lower(COALESCE(COALESCE(usage_rows.endpoint_api_format, usage_rows.api_format), '')), ':', 1)
             IN ('claude', 'anthropic')
        THEN GREATEST(COALESCE(usage_rows.input_tokens, 0), 0)
           + CASE
               WHEN COALESCE(usage_rows.cache_creation_input_tokens, 0) = 0
                    AND (
                      COALESCE(usage_rows.cache_creation_input_tokens_5m, 0)
                      + COALESCE(usage_rows.cache_creation_input_tokens_1h, 0)
                    ) > 0
               THEN COALESCE(usage_rows.cache_creation_input_tokens_5m, 0)
                  + COALESCE(usage_rows.cache_creation_input_tokens_1h, 0)
               ELSE COALESCE(usage_rows.cache_creation_input_tokens, 0)
             END
           + GREATEST(COALESCE(usage_rows.cache_read_input_tokens, 0), 0)
        WHEN split_part(lower(COALESCE(COALESCE(usage_rows.endpoint_api_format, usage_rows.api_format), '')), ':', 1)
             IN ('openai', 'gemini', 'google')
        THEN CASE
               WHEN GREATEST(COALESCE(usage_rows.input_tokens, 0), 0) <= 0 THEN 0
               WHEN GREATEST(COALESCE(usage_rows.cache_read_input_tokens, 0), 0) <= 0
               THEN GREATEST(COALESCE(usage_rows.input_tokens, 0), 0)
               ELSE GREATEST(
                 GREATEST(COALESCE(usage_rows.input_tokens, 0), 0)
                   - GREATEST(COALESCE(usage_rows.cache_read_input_tokens, 0), 0),
                 0
               )
             END
           + GREATEST(COALESCE(usage_rows.cache_read_input_tokens, 0), 0)
        ELSE GREATEST(COALESCE(usage_rows.input_tokens, 0), 0)
           + CASE
               WHEN COALESCE(usage_rows.cache_creation_input_tokens, 0) = 0
                    AND (
                      COALESCE(usage_rows.cache_creation_input_tokens_5m, 0)
                      + COALESCE(usage_rows.cache_creation_input_tokens_1h, 0)
                    ) > 0
               THEN COALESCE(usage_rows.cache_creation_input_tokens_5m, 0)
                  + COALESCE(usage_rows.cache_creation_input_tokens_1h, 0)
               ELSE COALESCE(usage_rows.cache_creation_input_tokens, 0)
             END
           + GREATEST(COALESCE(usage_rows.cache_read_input_tokens, 0), 0)
      END,
      0
    ),
    0
  )::bigint AS total_input_context,
  COALESCE(CAST(usage_rows.input_cost_usd AS DOUBLE PRECISION), 0) AS input_cost_usd,
  COALESCE(CAST(usage_rows.output_cost_usd AS DOUBLE PRECISION), 0) AS output_cost_usd,
  COALESCE(
    CAST(settlement.billing_cache_creation_cost_usd AS DOUBLE PRECISION),
    CAST(usage_rows.cache_creation_cost_usd AS DOUBLE PRECISION),
    0
  ) AS cache_creation_cost_usd,
  COALESCE(
    CAST(settlement.billing_cache_read_cost_usd AS DOUBLE PRECISION),
    CAST(usage_rows.cache_read_cost_usd AS DOUBLE PRECISION),
    0
  ) AS cache_read_cost_usd,
  COALESCE(
    CAST(settlement.billing_total_cost_usd AS DOUBLE PRECISION),
    CAST(usage_rows.total_cost_usd AS DOUBLE PRECISION),
    0
  ) AS total_cost_usd,
  COALESCE(
    CAST(settlement.billing_actual_total_cost_usd AS DOUBLE PRECISION),
    CAST(usage_rows.actual_total_cost_usd AS DOUBLE PRECISION),
    0
  ) AS actual_total_cost_usd,
  COALESCE(
    CAST(settlement.output_price_per_1m AS DOUBLE PRECISION),
    CAST(usage_rows.output_price_per_1m AS DOUBLE PRECISION)
  ) AS output_price_per_1m,
  COALESCE(
    CAST(settlement.input_price_per_1m AS DOUBLE PRECISION),
    CAST(usage_rows.input_price_per_1m AS DOUBLE PRECISION)
  ) AS input_price_per_1m,
  COALESCE(
    CAST(settlement.cache_creation_price_per_1m AS DOUBLE PRECISION),
    CAST(usage_rows.cache_creation_price_per_1m AS DOUBLE PRECISION)
  ) AS cache_creation_price_per_1m,
  COALESCE(
    CAST(settlement.cache_read_price_per_1m AS DOUBLE PRECISION),
    CAST(usage_rows.cache_read_price_per_1m AS DOUBLE PRECISION)
  ) AS cache_read_price_per_1m,
  COALESCE(
    CAST(settlement.price_per_request AS DOUBLE PRECISION),
    CAST(usage_rows.price_per_request AS DOUBLE PRECISION)
  ) AS price_per_request,
  settlement.billing_pricing_source,
  settlement.billing_rule_id,
  settlement.billing_rule_version
FROM public."usage" AS usage_rows
LEFT JOIN public.usage_settlement_snapshots AS settlement
  ON settlement.request_id = usage_rows.request_id;

COMMENT ON VIEW public.usage_billing_facts IS
  'Canonical billing read model. Token/cost fields prefer usage_settlement_snapshots.billing_* and fall back to deprecated usage mirrors for legacy rows.';

COMMENT ON COLUMN public.usage.input_tokens IS
  'DEPRECATED: billing dimension mirror. Use public.usage_settlement_snapshots.billing_input_tokens or public.usage_billing_facts.input_tokens.';
COMMENT ON COLUMN public.usage.output_tokens IS
  'DEPRECATED: billing dimension mirror. Use public.usage_settlement_snapshots.billing_output_tokens or public.usage_billing_facts.output_tokens.';
COMMENT ON COLUMN public.usage.total_tokens IS
  'DEPRECATED: billing dimension mirror. Use public.usage_billing_facts.total_tokens.';
COMMENT ON COLUMN public.usage.cache_creation_input_tokens IS
  'DEPRECATED: billing dimension mirror. Use public.usage_settlement_snapshots.billing_cache_creation_tokens or public.usage_billing_facts.cache_creation_input_tokens.';
COMMENT ON COLUMN public.usage.cache_creation_input_tokens_5m IS
  'DEPRECATED: billing dimension mirror. Use public.usage_settlement_snapshots.billing_cache_creation_5m_tokens or public.usage_billing_facts.cache_creation_input_tokens_5m.';
COMMENT ON COLUMN public.usage.cache_creation_input_tokens_1h IS
  'DEPRECATED: billing dimension mirror. Use public.usage_settlement_snapshots.billing_cache_creation_1h_tokens or public.usage_billing_facts.cache_creation_input_tokens_1h.';
COMMENT ON COLUMN public.usage.cache_read_input_tokens IS
  'DEPRECATED: billing dimension mirror. Use public.usage_settlement_snapshots.billing_cache_read_tokens or public.usage_billing_facts.cache_read_input_tokens.';
COMMENT ON COLUMN public.usage.cache_creation_cost_usd IS
  'DEPRECATED: billing cost mirror. Use public.usage_settlement_snapshots.billing_cache_creation_cost_usd or public.usage_billing_facts.cache_creation_cost_usd.';
COMMENT ON COLUMN public.usage.cache_read_cost_usd IS
  'DEPRECATED: billing cost mirror. Use public.usage_settlement_snapshots.billing_cache_read_cost_usd or public.usage_billing_facts.cache_read_cost_usd.';
COMMENT ON COLUMN public.usage.total_cost_usd IS
  'DEPRECATED: billing cost mirror. Use public.usage_settlement_snapshots.billing_total_cost_usd or public.usage_billing_facts.total_cost_usd.';
COMMENT ON COLUMN public.usage.actual_total_cost_usd IS
  'DEPRECATED: billing cost mirror. Use public.usage_settlement_snapshots.billing_actual_total_cost_usd or public.usage_billing_facts.actual_total_cost_usd.';

COMMENT ON COLUMN public.usage.wallet_id IS
  'DEPRECATED: settlement owner moved to public.usage_settlement_snapshots.wallet_id. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.wallet_balance_before IS
  'DEPRECATED: settlement owner moved to public.usage_settlement_snapshots.wallet_balance_before. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.wallet_balance_after IS
  'DEPRECATED: settlement owner moved to public.usage_settlement_snapshots.wallet_balance_after. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.wallet_recharge_balance_before IS
  'DEPRECATED: settlement owner moved to public.usage_settlement_snapshots.wallet_recharge_balance_before. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.wallet_recharge_balance_after IS
  'DEPRECATED: settlement owner moved to public.usage_settlement_snapshots.wallet_recharge_balance_after. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.wallet_gift_balance_before IS
  'DEPRECATED: settlement owner moved to public.usage_settlement_snapshots.wallet_gift_balance_before. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.wallet_gift_balance_after IS
  'DEPRECATED: settlement owner moved to public.usage_settlement_snapshots.wallet_gift_balance_after. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.rate_multiplier IS
  'DEPRECATED: settlement pricing owner moved to public.usage_settlement_snapshots.rate_multiplier. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.input_price_per_1m IS
  'DEPRECATED: settlement pricing owner moved to public.usage_settlement_snapshots.input_price_per_1m. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.output_price_per_1m IS
  'DEPRECATED: settlement pricing owner moved to public.usage_settlement_snapshots.output_price_per_1m. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.cache_creation_price_per_1m IS
  'DEPRECATED: settlement pricing owner moved to public.usage_settlement_snapshots.cache_creation_price_per_1m. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.cache_read_price_per_1m IS
  'DEPRECATED: settlement pricing owner moved to public.usage_settlement_snapshots.cache_read_price_per_1m. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.price_per_request IS
  'DEPRECATED: settlement pricing owner moved to public.usage_settlement_snapshots.price_per_request. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.username IS
  'DEPRECATED: display cache only. Prefer join-time lookup from user/auth records. Legacy compatibility only.';
COMMENT ON COLUMN public.usage.api_key_name IS
  'DEPRECATED: display cache only. Prefer join-time lookup from API key records. Legacy compatibility only.';
COMMENT ON COLUMN public.usage.billing_status IS
  'DEPRECATED: authoritative owner moved to public.usage_settlement_snapshots.billing_status. Compatibility/index mirror only; do not write new values.';
COMMENT ON COLUMN public.usage.finalized_at IS
  'DEPRECATED: authoritative owner moved to public.usage_settlement_snapshots.finalized_at. Compatibility/index mirror only; do not write new values.';
COMMENT ON COLUMN public.usage.request_headers IS
  'DEPRECATED: HTTP audit owner moved to public.usage_http_audits.request_headers. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.provider_request_headers IS
  'DEPRECATED: HTTP audit owner moved to public.usage_http_audits.provider_request_headers. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.response_headers IS
  'DEPRECATED: HTTP audit owner moved to public.usage_http_audits.response_headers. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.client_response_headers IS
  'DEPRECATED: HTTP audit owner moved to public.usage_http_audits.client_response_headers. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.request_body IS
  'DEPRECATED: HTTP body owner moved to public.usage_body_blobs plus public.usage_http_audits.request_body_ref. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.request_body_compressed IS
  'DEPRECATED: HTTP body owner moved to public.usage_body_blobs plus public.usage_http_audits.request_body_ref. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.provider_request_body IS
  'DEPRECATED: HTTP body owner moved to public.usage_body_blobs plus public.usage_http_audits.provider_request_body_ref. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.provider_request_body_compressed IS
  'DEPRECATED: HTTP body owner moved to public.usage_body_blobs plus public.usage_http_audits.provider_request_body_ref. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.response_body IS
  'DEPRECATED: HTTP body owner moved to public.usage_body_blobs plus public.usage_http_audits.response_body_ref. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.response_body_compressed IS
  'DEPRECATED: HTTP body owner moved to public.usage_body_blobs plus public.usage_http_audits.response_body_ref. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.client_response_body IS
  'DEPRECATED: HTTP body owner moved to public.usage_body_blobs plus public.usage_http_audits.client_response_body_ref. Legacy compatibility only; do not write new values.';
COMMENT ON COLUMN public.usage.client_response_body_compressed IS
  'DEPRECATED: HTTP body owner moved to public.usage_body_blobs plus public.usage_http_audits.client_response_body_ref. Legacy compatibility only; do not write new values.';

