From 3c32a119306fa7840d5ebbbd8c697ef9a25d33eb Mon Sep 17 00:00:00 2001 From: Matin Gathani Date: Sun, 29 Mar 2026 18:37:55 -0700 Subject: [PATCH] Fix enum type existence check to scope lookup to stripe schema The IF NOT EXISTS guards in several migration files checked pg_type by name only, without constraining by schema. If a type with the same name happened to exist in another schema (e.g. public), the check would pass and the migration would skip creating the stripe-schema enum, causing subsequent column definitions that reference it to fail. Joined pg_namespace in all affected checks so the guard is limited to the stripe schema: - 0003_prices.sql: pricing_type, pricing_tiers - 0004_subscriptions.sql: subscription_status - 0005_invoices.sql: invoice_status - 0024_subscription_schedules.sql: subscription_schedule_status Fixes #191 --- packages/sync-engine/src/database/migrations/0003_prices.sql | 4 ++-- .../src/database/migrations/0004_subscriptions.sql | 2 +- .../sync-engine/src/database/migrations/0005_invoices.sql | 2 +- .../src/database/migrations/0024_subscription_schedules.sql | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/sync-engine/src/database/migrations/0003_prices.sql b/packages/sync-engine/src/database/migrations/0003_prices.sql index e133637ab..a6cd19437 100644 --- a/packages/sync-engine/src/database/migrations/0003_prices.sql +++ b/packages/sync-engine/src/database/migrations/0003_prices.sql @@ -1,9 +1,9 @@ DO $$ BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'pricing_type') THEN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'pricing_type' AND n.nspname = 'stripe') THEN create type "stripe"."pricing_type" as enum ('one_time', 'recurring'); END IF; - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'pricing_tiers') THEN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'pricing_tiers' AND n.nspname = 'stripe') THEN create type "stripe"."pricing_tiers" as enum ('graduated', 'volume'); END IF; --more types here... diff --git a/packages/sync-engine/src/database/migrations/0004_subscriptions.sql b/packages/sync-engine/src/database/migrations/0004_subscriptions.sql index bd9e57535..c6e4ea190 100644 --- a/packages/sync-engine/src/database/migrations/0004_subscriptions.sql +++ b/packages/sync-engine/src/database/migrations/0004_subscriptions.sql @@ -1,7 +1,7 @@ DO $$ BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'subscription_status') THEN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'subscription_status' AND n.nspname = 'stripe') THEN create type "stripe"."subscription_status" as enum ( 'trialing', 'active', diff --git a/packages/sync-engine/src/database/migrations/0005_invoices.sql b/packages/sync-engine/src/database/migrations/0005_invoices.sql index 0b664eda9..ba5f6cdf2 100644 --- a/packages/sync-engine/src/database/migrations/0005_invoices.sql +++ b/packages/sync-engine/src/database/migrations/0005_invoices.sql @@ -1,7 +1,7 @@ DO $$ BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'invoice_status') THEN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'invoice_status' AND n.nspname = 'stripe') THEN create type "stripe"."invoice_status" as enum ('draft', 'open', 'paid', 'uncollectible', 'void'); END IF; END diff --git a/packages/sync-engine/src/database/migrations/0024_subscription_schedules.sql b/packages/sync-engine/src/database/migrations/0024_subscription_schedules.sql index a095509bc..6a4e8a31e 100644 --- a/packages/sync-engine/src/database/migrations/0024_subscription_schedules.sql +++ b/packages/sync-engine/src/database/migrations/0024_subscription_schedules.sql @@ -1,6 +1,6 @@ do $$ BEGIN - IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'subscription_schedule_status') THEN + IF NOT EXISTS (SELECT 1 FROM pg_type t JOIN pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'subscription_schedule_status' AND n.nspname = 'stripe') THEN create type "stripe"."subscription_schedule_status" as enum ('not_started', 'active', 'completed', 'released', 'canceled'); END IF; END