Skip to content

Commit 2eec575

Browse files
committed
fix(tg-bot): safe SQL migration for tg_bot_validations.is_valid
Made-with: Cursor
1 parent b71928a commit 2eec575

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

  • prisma/migrations/20260327_tg_bot_validations_is_valid_boolean_compat
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
-- Safe migration: tg_bot_validations.is_valid (int/bool -> boolean)
2+
-- Goal:
3+
-- - Preserve all existing rows
4+
-- - Avoid reset/drop-data migration flow
5+
-- - Handle both legacy integer-like and boolean source column types
6+
--
7+
-- Notes:
8+
-- - Run on the target Supabase database in a maintenance window.
9+
-- - This migration does NOT delete rows; it copies/converts values first.
10+
-- - If is_valid is already boolean, this is idempotent and only normalizes null/default.
11+
12+
BEGIN;
13+
14+
LOCK TABLE tg_bot_validations IN ACCESS EXCLUSIVE MODE;
15+
16+
DO $$
17+
DECLARE
18+
col_type text;
19+
BEGIN
20+
SELECT data_type
21+
INTO col_type
22+
FROM information_schema.columns
23+
WHERE table_schema = 'public'
24+
AND table_name = 'tg_bot_validations'
25+
AND column_name = 'is_valid';
26+
27+
IF col_type IS NULL THEN
28+
RAISE EXCEPTION 'Column public.tg_bot_validations.is_valid does not exist.';
29+
END IF;
30+
31+
-- Already boolean: just normalize constraints/default and null values.
32+
IF col_type = 'boolean' THEN
33+
EXECUTE 'UPDATE public.tg_bot_validations SET is_valid = FALSE WHERE is_valid IS NULL';
34+
EXECUTE 'ALTER TABLE public.tg_bot_validations ALTER COLUMN is_valid SET DEFAULT FALSE';
35+
EXECUTE 'ALTER TABLE public.tg_bot_validations ALTER COLUMN is_valid SET NOT NULL';
36+
RETURN;
37+
END IF;
38+
39+
-- Legacy integer/numeric-like values: convert safely through a temp column.
40+
IF col_type IN ('smallint', 'integer', 'bigint', 'numeric', 'real', 'double precision') THEN
41+
IF EXISTS (
42+
SELECT 1
43+
FROM information_schema.columns
44+
WHERE table_schema = 'public'
45+
AND table_name = 'tg_bot_validations'
46+
AND column_name = 'is_valid_tmp_bool'
47+
) THEN
48+
EXECUTE 'ALTER TABLE public.tg_bot_validations DROP COLUMN is_valid_tmp_bool';
49+
END IF;
50+
51+
EXECUTE 'ALTER TABLE public.tg_bot_validations ADD COLUMN is_valid_tmp_bool boolean';
52+
53+
-- Preserve semantics:
54+
-- 1 / true-like => TRUE
55+
-- everything else (0, null, invalid) => FALSE
56+
EXECUTE $sql$
57+
UPDATE public.tg_bot_validations
58+
SET is_valid_tmp_bool = CASE
59+
WHEN is_valid IS NULL THEN FALSE
60+
WHEN is_valid::text IN ('1', 't', 'true', 'TRUE') THEN TRUE
61+
ELSE FALSE
62+
END
63+
$sql$;
64+
65+
EXECUTE 'ALTER TABLE public.tg_bot_validations ALTER COLUMN is_valid_tmp_bool SET DEFAULT FALSE';
66+
EXECUTE 'ALTER TABLE public.tg_bot_validations ALTER COLUMN is_valid_tmp_bool SET NOT NULL';
67+
68+
EXECUTE 'ALTER TABLE public.tg_bot_validations DROP COLUMN is_valid';
69+
EXECUTE 'ALTER TABLE public.tg_bot_validations RENAME COLUMN is_valid_tmp_bool TO is_valid';
70+
71+
RETURN;
72+
END IF;
73+
74+
RAISE EXCEPTION 'Unsupported source type for tg_bot_validations.is_valid: %', col_type;
75+
END $$;
76+
77+
COMMIT;

0 commit comments

Comments
 (0)