From b7b8dd36f8a0db39d0a86f581d0d4655a12de4a7 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:57:03 -0400 Subject: [PATCH 01/12] Add sequence and trigger for Virginia org ID generation Create sequence and function to generate organization IDs for Virginia. --- .../ddl_organizations_virginia.sql | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 ddl/ddl_changes/ddl_organizations_virginia.sql diff --git a/ddl/ddl_changes/ddl_organizations_virginia.sql b/ddl/ddl_changes/ddl_organizations_virginia.sql new file mode 100644 index 0000000..c47e614 --- /dev/null +++ b/ddl/ddl_changes/ddl_organizations_virginia.sql @@ -0,0 +1,59 @@ +-- ===================================================================== +-- Regional Sequence Generator: ORGANIZATIONS -- VIRGINIA (us-east-1) +-- Primary / base region. Non-EU orgs. + +-- --------------------------------------------------------------------- +-- 1. Sequence: Virginia starts at 1 trillion. +-- NOTE ON RANGE: The ADR reserves 1-trillion..2-trillion for Virginia +-- and 2-trillion.. for Ireland. Starting Virginia AT 1,000,000,000,000 +-- means native Virginia orgs occupy the '001' sub-block. Orgs created +-- in Virginia's OWN region during normal operation carry prefix '001'. +-- --------------------------------------------------------------------- +CREATE SEQUENCE IF NOT EXISTS virginia_dev_saayam_rdbms.seq_org_id + START WITH 1000000000000 + INCREMENT BY 1 + NO MAXVALUE + NO CYCLE; + + +-- --------------------------------------------------------------------- +-- 2. Generator function (hardcoded prefix '001' for Virginia) +-- Output example: ORG-00-001-004-010-003 +-- Layout: ORG-00---- +-- Divisor math is billion-scale to support trillion ranges: +-- seg1 = (seq % 1,000,000,000) / 1,000,000 +-- seg2 = (seq % 1,000,000) / 1,000 +-- seg3 = seq % 1,000 +-- --------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION virginia_dev_saayam_rdbms.generate_org_id() +RETURNS TRIGGER AS $$ +DECLARE + seq_id BIGINT; + new_id TEXT; + region_prefix TEXT := '001'; -- [D3] hardcoded: Virginia +BEGIN + -- Only generate if caller did not supply an org_id explicitly. + IF (NEW.org_id IS NULL) THEN + seq_id := nextval('virginia_dev_saayam_rdbms.seq_org_id'); + + new_id := 'ORG-00-' || region_prefix || '-' || + LPAD(FLOOR((seq_id % 1000000000) / 1000000)::TEXT, 3, '0') || '-' || + LPAD(FLOOR((seq_id % 1000000) / 1000)::TEXT, 3, '0') || '-' || + LPAD((seq_id % 1000)::TEXT, 3, '0'); + + NEW.org_id := new_id; + END IF; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + + +-- --------------------------------------------------------------------- +-- 3. Trigger: fire before INSERT on organizations. +-- [D1] Assumes table virginia_dev_saayam_rdbms.organizations with +-- column org_id as PK. +-- --------------------------------------------------------------------- +CREATE TRIGGER trg_generate_org_id + BEFORE INSERT ON virginia_dev_saayam_rdbms.organizations + FOR EACH ROW EXECUTE FUNCTION virginia_dev_saayam_rdbms.generate_org_id(); From 052f5da8a6c0c6b07883ed6bf36f34b7d620b620 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Wed, 1 Jul 2026 17:58:09 -0400 Subject: [PATCH 02/12] Add sequence and trigger for Ireland organization IDs Create a sequence and trigger for generating organization IDs in Ireland with a starting value of 2 trillion and a hardcoded region prefix. --- .../Scripts/ddl_organizations_ireland.sql | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 ddl/Tables/Scripts/ddl_organizations_ireland.sql diff --git a/ddl/Tables/Scripts/ddl_organizations_ireland.sql b/ddl/Tables/Scripts/ddl_organizations_ireland.sql new file mode 100644 index 0000000..f6a3ea4 --- /dev/null +++ b/ddl/Tables/Scripts/ddl_organizations_ireland.sql @@ -0,0 +1,61 @@ +-- ===================================================================== +-- Regional Sequence Generator: ORGANIZATIONS -- IRELAND (eu-west-1) +-- EU region. +-- +-- Per ADR: organizations are GLOBAL operational tables, so there is +-- NO is_eu split and NO dual generator here. Ireland differs from +-- Virginia ONLY in its sequence start range (2 trillion) and its +-- hardcoded region prefix ('002'), which together guarantee that any +-- org created in Ireland can never collide with a Virginia-native org +-- during disaster recovery / sync-back. +-- +-- DECISION POINTS: identical to the Virginia file. See [D1]-[D4] there. +-- The ONLY differences from Virginia are: +-- - START WITH 2000000000000 (2 trillion) +-- - region_prefix := '002' +-- ===================================================================== + + +-- --------------------------------------------------------------------- +-- 1. Sequence: Ireland starts at 2 trillion. +-- --------------------------------------------------------------------- +CREATE SEQUENCE IF NOT EXISTS ireland_dev_saayam_rdbms.seq_org_id + START WITH 2000000000000 + INCREMENT BY 1 + NO MAXVALUE + NO CYCLE; + + +-- --------------------------------------------------------------------- +-- 2. Generator function (hardcoded prefix '002' for Ireland) +-- Output example: ORG-00-002-004-010-003 +-- --------------------------------------------------------------------- +CREATE OR REPLACE FUNCTION ireland_dev_saayam_rdbms.generate_org_id() +RETURNS TRIGGER AS $$ +DECLARE + seq_id BIGINT; + new_id TEXT; + region_prefix TEXT := '002'; -- [D3] hardcoded: Ireland +BEGIN + IF (NEW.org_id IS NULL) THEN + seq_id := nextval('ireland_dev_saayam_rdbms.seq_org_id'); + + new_id := 'ORG-00-' || region_prefix || '-' || + LPAD(FLOOR((seq_id % 1000000000) / 1000000)::TEXT, 3, '0') || '-' || + LPAD(FLOOR((seq_id % 1000000) / 1000)::TEXT, 3, '0') || '-' || + LPAD((seq_id % 1000)::TEXT, 3, '0'); + + NEW.org_id := new_id; + END IF; + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + + +-- --------------------------------------------------------------------- +-- 3. Trigger: fire before INSERT on organizations. +-- --------------------------------------------------------------------- +CREATE TRIGGER trg_generate_org_id + BEFORE INSERT ON ireland_dev_saayam_rdbms.organizations + FOR EACH ROW EXECUTE FUNCTION ireland_dev_saayam_rdbms.generate_org_id(); From 414b3299a8158c2db58e46c3802a6f2b71e97d81 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Wed, 1 Jul 2026 18:01:16 -0400 Subject: [PATCH 03/12] Add sequence, function, and trigger for org IDs This SQL script creates a sequence for organization IDs, defines a function to generate organization IDs based on that sequence, and sets up a trigger to automatically assign organization IDs during insertions. --- ddl/Tables/ddl_org_seq_virginia.sql | 35 +++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 ddl/Tables/ddl_org_seq_virginia.sql diff --git a/ddl/Tables/ddl_org_seq_virginia.sql b/ddl/Tables/ddl_org_seq_virginia.sql new file mode 100644 index 0000000..6261ac5 --- /dev/null +++ b/ddl/Tables/ddl_org_seq_virginia.sql @@ -0,0 +1,35 @@ + +-- 1. Sequence (create if missing; leave existing untouched) +CREATE SEQUENCE IF NOT EXISTS virginia_dev_saayam_rdbms.seq_org_id + START WITH 1000000000000 + INCREMENT BY 1 + NO MAXVALUE + NO CYCLE; + +-- 2. (Re)create the generator function +CREATE OR REPLACE FUNCTION virginia_dev_saayam_rdbms.generate_org_id() +RETURNS TRIGGER AS $$ +DECLARE + seq_id BIGINT; + new_id TEXT; + region_prefix TEXT := '001'; +BEGIN + IF (NEW.org_id IS NULL) THEN + seq_id := nextval('virginia_dev_saayam_rdbms.seq_org_id'); + new_id := 'ORG-00-' || region_prefix || '-' || + LPAD(FLOOR((seq_id % 1000000000) / 1000000)::TEXT, 3, '0') || '-' || + LPAD(FLOOR((seq_id % 1000000) / 1000)::TEXT, 3, '0') || '-' || + LPAD((seq_id % 1000)::TEXT, 3, '0'); + NEW.org_id := new_id; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- 3. Recreate the trigger (drop first so re-runs don't error) +DROP TRIGGER IF EXISTS trg_generate_org_id + ON virginia_dev_saayam_rdbms.organizations; + +CREATE TRIGGER trg_generate_org_id + BEFORE INSERT ON virginia_dev_saayam_rdbms.organizations + FOR EACH ROW EXECUTE FUNCTION virginia_dev_saayam_rdbms.generate_org_id(); From 0635b3b15e4fa009571f7bedc476d46b26abe577 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Wed, 1 Jul 2026 18:02:30 -0400 Subject: [PATCH 04/12] Add DDL script for Ireland org ID sequence and trigger This script creates a sequence and a trigger for generating organization IDs in the Ireland database. The sequence starts at 2 trillion and includes a specific region prefix. --- ddl/Tables/Scripts/ddl_org_seq_ireland.sql | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 ddl/Tables/Scripts/ddl_org_seq_ireland.sql diff --git a/ddl/Tables/Scripts/ddl_org_seq_ireland.sql b/ddl/Tables/Scripts/ddl_org_seq_ireland.sql new file mode 100644 index 0000000..870d04c --- /dev/null +++ b/ddl/Tables/Scripts/ddl_org_seq_ireland.sql @@ -0,0 +1,37 @@ +-- ===================================================================== +-- DDL CHANGE SCRIPT: Ireland org sequence generator +-- Idempotent migration. Differs from Virginia only in start range +-- (2 trillion) and region prefix ('002'). +-- ===================================================================== + +CREATE SEQUENCE IF NOT EXISTS ireland_dev_saayam_rdbms.seq_org_id + START WITH 2000000000000 + INCREMENT BY 1 + NO MAXVALUE + NO CYCLE; + +CREATE OR REPLACE FUNCTION ireland_dev_saayam_rdbms.generate_org_id() +RETURNS TRIGGER AS $$ +DECLARE + seq_id BIGINT; + new_id TEXT; + region_prefix TEXT := '002'; +BEGIN + IF (NEW.org_id IS NULL) THEN + seq_id := nextval('ireland_dev_saayam_rdbms.seq_org_id'); + new_id := 'ORG-00-' || region_prefix || '-' || + LPAD(FLOOR((seq_id % 1000000000) / 1000000)::TEXT, 3, '0') || '-' || + LPAD(FLOOR((seq_id % 1000000) / 1000)::TEXT, 3, '0') || '-' || + LPAD((seq_id % 1000)::TEXT, 3, '0'); + NEW.org_id := new_id; + END IF; + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +DROP TRIGGER IF EXISTS trg_generate_org_id + ON ireland_dev_saayam_rdbms.organizations; + +CREATE TRIGGER trg_generate_org_id + BEFORE INSERT ON ireland_dev_saayam_rdbms.organizations + FOR EACH ROW EXECUTE FUNCTION ireland_dev_saayam_rdbms.generate_org_id(); From 7242a5481c7a33e855cce638359f8cde568522b1 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Wed, 1 Jul 2026 18:04:59 -0400 Subject: [PATCH 05/12] Add SQL test for Virginia organization ID generation --- .../tests/test_org_seq_virginia.sql | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 script-library/tests/test_org_seq_virginia.sql diff --git a/script-library/tests/test_org_seq_virginia.sql b/script-library/tests/test_org_seq_virginia.sql new file mode 100644 index 0000000..8795935 --- /dev/null +++ b/script-library/tests/test_org_seq_virginia.sql @@ -0,0 +1,49 @@ +DO $$ +DECLARE + v_id1 TEXT; + v_id2 TEXT; +BEGIN + RAISE NOTICE '=== VIRGINIA ORG ID GENERATOR TEST ==='; + + -- 1. Auto-generate on insert (org_id left NULL) + INSERT INTO virginia_dev_saayam_rdbms.organizations (org_name) + VALUES ('Test Org Alpha') + RETURNING org_id INTO v_id1; + RAISE NOTICE 'Generated id #1: %', v_id1; + + INSERT INTO virginia_dev_saayam_rdbms.organizations (org_name) + VALUES ('Test Org Beta') + RETURNING org_id INTO v_id2; + RAISE NOTICE 'Generated id #2: %', v_id2; + + -- 2. Format check: must start with ORG-00-001- + IF v_id1 LIKE 'ORG-00-001-%' THEN + RAISE NOTICE 'PASS: Virginia prefix ORG-00-001- present'; + ELSE + RAISE EXCEPTION 'FAIL: unexpected prefix on %', v_id1; + END IF; + + -- 3. Uniqueness / monotonicity + IF v_id1 <> v_id2 THEN + RAISE NOTICE 'PASS: consecutive ids differ'; + ELSE + RAISE EXCEPTION 'FAIL: duplicate ids generated'; + END IF; + + -- 4. Explicit org_id must be respected (not overwritten) + INSERT INTO virginia_dev_saayam_rdbms.organizations (org_id, org_name) + VALUES ('ORG-00-999-000-000-001', 'Explicit Org'); + PERFORM 1 FROM virginia_dev_saayam_rdbms.organizations + WHERE org_id = 'ORG-00-999-000-000-001'; + IF FOUND THEN + RAISE NOTICE 'PASS: explicit org_id preserved'; + ELSE + RAISE EXCEPTION 'FAIL: explicit org_id was overwritten'; + END IF; + + -- cleanup + DELETE FROM virginia_dev_saayam_rdbms.organizations + WHERE org_id IN (v_id1, v_id2, 'ORG-00-999-000-000-001'); + + RAISE NOTICE '=== ALL VIRGINIA TESTS PASSED ==='; +END $$; From 4e854a295875e9be1327e08216bdc087221f9161 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Wed, 1 Jul 2026 18:07:59 -0400 Subject: [PATCH 06/12] Add test for Ireland organization ID generation --- script-library/tests/test_orq_seq_ireland.sql | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 script-library/tests/test_orq_seq_ireland.sql diff --git a/script-library/tests/test_orq_seq_ireland.sql b/script-library/tests/test_orq_seq_ireland.sql new file mode 100644 index 0000000..222eb99 --- /dev/null +++ b/script-library/tests/test_orq_seq_ireland.sql @@ -0,0 +1,43 @@ +DO $$ +DECLARE + v_id1 TEXT; + v_id2 TEXT; +BEGIN + RAISE NOTICE '=== IRELAND ORG ID GENERATOR TEST ==='; + + INSERT INTO ireland_dev_saayam_rdbms.organizations (org_name) + VALUES ('Test Org Gamma') + RETURNING org_id INTO v_id1; + RAISE NOTICE 'Generated id #1: %', v_id1; + + INSERT INTO ireland_dev_saayam_rdbms.organizations (org_name) + VALUES ('Test Org Delta') + RETURNING org_id INTO v_id2; + RAISE NOTICE 'Generated id #2: %', v_id2; + + -- Format check: must start with ORG-00-002- + IF v_id1 LIKE 'ORG-00-002-%' THEN + RAISE NOTICE 'PASS: Ireland prefix ORG-00-002- present'; + ELSE + RAISE EXCEPTION 'FAIL: unexpected prefix on %', v_id1; + END IF; + + -- Cross-region collision guard: Ireland ids must NOT carry the + -- Virginia 001 prefix. + IF v_id1 NOT LIKE 'ORG-00-001-%' THEN + RAISE NOTICE 'PASS: Ireland id does not collide with Virginia range'; + ELSE + RAISE EXCEPTION 'FAIL: Ireland produced a Virginia-range id'; + END IF; + + IF v_id1 <> v_id2 THEN + RAISE NOTICE 'PASS: consecutive ids differ'; + ELSE + RAISE EXCEPTION 'FAIL: duplicate ids generated'; + END IF; + + DELETE FROM ireland_dev_saayam_rdbms.organizations + WHERE org_id IN (v_id1, v_id2); + + RAISE NOTICE '=== ALL IRELAND TESTS PASSED ==='; +END $$; From f74e07bfab80c27b6a965f5f055f4879110c9ca3 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:22:34 -0400 Subject: [PATCH 07/12] Refactor organization ID sequence and generation Updated the sequence and ID generation logic for Virginia organizations. Changed format and constraints for organization IDs. --- .../ddl_organizations_virginia.sql | 72 ++++++++----------- 1 file changed, 29 insertions(+), 43 deletions(-) diff --git a/ddl/ddl_changes/ddl_organizations_virginia.sql b/ddl/ddl_changes/ddl_organizations_virginia.sql index c47e614..ccf54ac 100644 --- a/ddl/ddl_changes/ddl_organizations_virginia.sql +++ b/ddl/ddl_changes/ddl_organizations_virginia.sql @@ -1,59 +1,45 @@ --- ===================================================================== --- Regional Sequence Generator: ORGANIZATIONS -- VIRGINIA (us-east-1) --- Primary / base region. Non-EU orgs. +-- ---------------------------------------------------------------------------- +-- WHAT CHANGED vs PR #243: +-- - Format: ORG-00-001-XXX-XXX-XXX -> ORG-XXX-XXX-XXX-XXXX (13 digits, 3-3-3-4) +-- * dropped the constant "00" marker (differentiated nothing) +-- * dropped the explicit "001" region sub-block (region now lives in the range) +-- - Formatting: FLOOR/MOD math -> LPAD + SUBSTRING (string slicing) +-- - Sequence range: START 1,000,000,000,000 -> START 1, MAXVALUE 999,999,999,999 +-- (Virginia now owns the 000-band; Ireland-DR owns the 100-band) +-- KEPT / ADDED (not in the raw feedback snippet): +-- - Trust-hook: a pre-supplied org_id (replication / DR copy-back) is not re-minted +-- - Width guard: loud error if a value ever exceeds 13 digits (SUBSTRING contract) +-- ============================================================================ + +CREATE SEQUENCE IF NOT EXISTS virginia_dev_saayam_rdbms.org_id_seq + START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999999 NO CYCLE; --- --------------------------------------------------------------------- --- 1. Sequence: Virginia starts at 1 trillion. --- NOTE ON RANGE: The ADR reserves 1-trillion..2-trillion for Virginia --- and 2-trillion.. for Ireland. Starting Virginia AT 1,000,000,000,000 --- means native Virginia orgs occupy the '001' sub-block. Orgs created --- in Virginia's OWN region during normal operation carry prefix '001'. --- --------------------------------------------------------------------- -CREATE SEQUENCE IF NOT EXISTS virginia_dev_saayam_rdbms.seq_org_id - START WITH 1000000000000 - INCREMENT BY 1 - NO MAXVALUE - NO CYCLE; - - --- --------------------------------------------------------------------- --- 2. Generator function (hardcoded prefix '001' for Virginia) --- Output example: ORG-00-001-004-010-003 --- Layout: ORG-00---- --- Divisor math is billion-scale to support trillion ranges: --- seg1 = (seq % 1,000,000,000) / 1,000,000 --- seg2 = (seq % 1,000,000) / 1,000 --- seg3 = seq % 1,000 --- --------------------------------------------------------------------- CREATE OR REPLACE FUNCTION virginia_dev_saayam_rdbms.generate_org_id() RETURNS TRIGGER AS $$ DECLARE seq_id BIGINT; - new_id TEXT; - region_prefix TEXT := '001'; -- [D3] hardcoded: Virginia + padded TEXT; BEGIN - -- Only generate if caller did not supply an org_id explicitly. - IF (NEW.org_id IS NULL) THEN - seq_id := nextval('virginia_dev_saayam_rdbms.seq_org_id'); + IF NEW.org_id IS NOT NULL THEN -- replication / DR copy-back -> keep id + RETURN NEW; + END IF; - new_id := 'ORG-00-' || region_prefix || '-' || - LPAD(FLOOR((seq_id % 1000000000) / 1000000)::TEXT, 3, '0') || '-' || - LPAD(FLOOR((seq_id % 1000000) / 1000)::TEXT, 3, '0') || '-' || - LPAD((seq_id % 1000)::TEXT, 3, '0'); + seq_id := nextval('virginia_dev_saayam_rdbms.org_id_seq'); + padded := LPAD(seq_id::TEXT, 13, '0'); - NEW.org_id := new_id; + IF length(padded) > 13 THEN -- SUBSTRING width contract + RAISE EXCEPTION 'org_id_seq value % exceeds 13 digits; format would corrupt', seq_id; END IF; + NEW.org_id := 'ORG-' || + SUBSTRING(padded FROM 1 FOR 3) || '-' || + SUBSTRING(padded FROM 4 FOR 3) || '-' || + SUBSTRING(padded FROM 7 FOR 3) || '-' || + SUBSTRING(padded FROM 10 FOR 4); RETURN NEW; END; $$ LANGUAGE plpgsql; - --- --------------------------------------------------------------------- --- 3. Trigger: fire before INSERT on organizations. --- [D1] Assumes table virginia_dev_saayam_rdbms.organizations with --- column org_id as PK. --- --------------------------------------------------------------------- -CREATE TRIGGER trg_generate_org_id +CREATE OR REPLACE TRIGGER before_insert_organizations BEFORE INSERT ON virginia_dev_saayam_rdbms.organizations FOR EACH ROW EXECUTE FUNCTION virginia_dev_saayam_rdbms.generate_org_id(); From 0c52d6f4a5fcaf5d46be151e814d1ae1ebcabd49 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:23:49 -0400 Subject: [PATCH 08/12] Refactor Virginia organization ID generation tests Updated the test script for organizations in Virginia database to include additional tests for sequential ID generation and format checks, while removing redundant code. --- .../tests/test_org_seq_virginia.sql | 104 ++++++++++-------- 1 file changed, 61 insertions(+), 43 deletions(-) diff --git a/script-library/tests/test_org_seq_virginia.sql b/script-library/tests/test_org_seq_virginia.sql index 8795935..192217c 100644 --- a/script-library/tests/test_org_seq_virginia.sql +++ b/script-library/tests/test_org_seq_virginia.sql @@ -1,49 +1,67 @@ -DO $$ -DECLARE - v_id1 TEXT; - v_id2 TEXT; -BEGIN - RAISE NOTICE '=== VIRGINIA ORG ID GENERATOR TEST ==='; - - -- 1. Auto-generate on insert (org_id left NULL) - INSERT INTO virginia_dev_saayam_rdbms.organizations (org_name) - VALUES ('Test Org Alpha') - RETURNING org_id INTO v_id1; - RAISE NOTICE 'Generated id #1: %', v_id1; +-- ============================================================================ +-- test_organizations_virginia.sql — run in the VIRGINIA database +-- Verifies the updated generator (ORG-XXX-XXX-XXX-XXXX, 000-band). +-- Assertions print via RAISE NOTICE (psql output / pgAdmin "Messages" tab). +-- setval/TRUNCATE make it repeatable — TEST DATABASE ONLY. +-- ============================================================================ - INSERT INTO virginia_dev_saayam_rdbms.organizations (org_name) - VALUES ('Test Org Beta') - RETURNING org_id INTO v_id2; - RAISE NOTICE 'Generated id #2: %', v_id2; +TRUNCATE virginia_dev_saayam_rdbms.organizations; +SELECT setval('virginia_dev_saayam_rdbms.org_id_seq', 1, false); -- next = 1 - -- 2. Format check: must start with ORG-00-001- - IF v_id1 LIKE 'ORG-00-001-%' THEN - RAISE NOTICE 'PASS: Virginia prefix ORG-00-001- present'; - ELSE - RAISE EXCEPTION 'FAIL: unexpected prefix on %', v_id1; - END IF; +-- T1 Sequential mint in the 000-band --------------------------------------- +DO $$ +DECLARE a TEXT; b TEXT; +BEGIN + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_name) VALUES ('VA-1') RETURNING org_id INTO a; + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_name) VALUES ('VA-2') RETURNING org_id INTO b; + IF a='ORG-000-000-000-0001' AND b='ORG-000-000-000-0002' + THEN RAISE NOTICE 'T1 PASS Virginia sequential 000-band (%, %)', a, b; + ELSE RAISE NOTICE 'T1 FAIL got %, %', a, b; END IF; +END$$; - -- 3. Uniqueness / monotonicity - IF v_id1 <> v_id2 THEN - RAISE NOTICE 'PASS: consecutive ids differ'; - ELSE - RAISE EXCEPTION 'FAIL: duplicate ids generated'; - END IF; +-- T2 Trust-hook: a pre-supplied id (replica / DR copy-back) is kept, and the +-- local sequence is NOT consumed ----------------------------------------- +DO $$ +DECLARE kept TEXT; nxt TEXT; +BEGIN + PERFORM setval('virginia_dev_saayam_rdbms.org_id_seq', 50, true); -- next mint = 51 + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_id, org_name) + VALUES ('ORG-100-000-000-0000', 'copied-from-ireland') RETURNING org_id INTO kept; + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_name) + VALUES ('next-local') RETURNING org_id INTO nxt; + IF kept='ORG-100-000-000-0000' AND nxt='ORG-000-000-000-0051' + THEN RAISE NOTICE 'T2 PASS pre-supplied id kept (%), sequence not consumed (next=%)', kept, nxt; + ELSE RAISE NOTICE 'T2 FAIL kept=% next=%', kept, nxt; END IF; +END$$; - -- 4. Explicit org_id must be respected (not overwritten) - INSERT INTO virginia_dev_saayam_rdbms.organizations (org_id, org_name) - VALUES ('ORG-00-999-000-000-001', 'Explicit Org'); - PERFORM 1 FROM virginia_dev_saayam_rdbms.organizations - WHERE org_id = 'ORG-00-999-000-000-001'; - IF FOUND THEN - RAISE NOTICE 'PASS: explicit org_id preserved'; - ELSE - RAISE EXCEPTION 'FAIL: explicit org_id was overwritten'; - END IF; +-- T3 Segment-rollover math at 1,000 / 10,000 / 1,000,000 ------------------- +DO $$ +DECLARE a TEXT; b TEXT; c TEXT; +BEGIN + PERFORM setval('virginia_dev_saayam_rdbms.org_id_seq', 999, true); + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_name) VALUES ('r1k') RETURNING org_id INTO a; + PERFORM setval('virginia_dev_saayam_rdbms.org_id_seq', 9999, true); + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_name) VALUES ('r10k') RETURNING org_id INTO b; + PERFORM setval('virginia_dev_saayam_rdbms.org_id_seq', 999999, true); + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_name) VALUES ('r1m') RETURNING org_id INTO c; + IF a='ORG-000-000-000-1000' AND b='ORG-000-000-001-0000' AND c='ORG-000-000-100-0000' + THEN RAISE NOTICE 'T3 PASS rollover correct (%, %, %)', a, b, c; + ELSE RAISE NOTICE 'T3 FAIL got %, %, %', a, b, c; END IF; +END$$; - -- cleanup - DELETE FROM virginia_dev_saayam_rdbms.organizations - WHERE org_id IN (v_id1, v_id2, 'ORG-00-999-000-000-001'); +-- T4 Exhaustion hard wall at MAXVALUE 999,999,999,999 ---------------------- +DO $$ +DECLARE last_id TEXT; +BEGIN + PERFORM setval('virginia_dev_saayam_rdbms.org_id_seq', 999999999998, true); -- next = MAXVALUE + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_name) VALUES ('last') RETURNING org_id INTO last_id; + RAISE NOTICE 'T4 .. last mint at MAXVALUE = %', last_id; + BEGIN + INSERT INTO virginia_dev_saayam_rdbms.organizations(org_name) VALUES ('over'); + RAISE NOTICE 'T4 FAIL sequence did not exhaust'; + EXCEPTION WHEN others THEN + RAISE NOTICE 'T4 PASS hard wall hit as designed: %', SQLERRM; + END; +END$$; - RAISE NOTICE '=== ALL VIRGINIA TESTS PASSED ==='; -END $$; +SELECT org_id, org_name FROM virginia_dev_saayam_rdbms.organizations ORDER BY org_id; From 0c80e78f25805927d07cb7e80bc39ba9aa2783ea Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:24:14 -0400 Subject: [PATCH 09/12] Refactor and enhance Ireland org ID test script Updated test script for Ireland organization ID generation, including new tests for sequence rollover, exhaustion, and collision checks. --- script-library/tests/test_orq_seq_ireland.sql | 96 ++++++++++++------- 1 file changed, 59 insertions(+), 37 deletions(-) diff --git a/script-library/tests/test_orq_seq_ireland.sql b/script-library/tests/test_orq_seq_ireland.sql index 222eb99..8d4e9a7 100644 --- a/script-library/tests/test_orq_seq_ireland.sql +++ b/script-library/tests/test_orq_seq_ireland.sql @@ -1,43 +1,65 @@ -DO $$ -DECLARE - v_id1 TEXT; - v_id2 TEXT; -BEGIN - RAISE NOTICE '=== IRELAND ORG ID GENERATOR TEST ==='; - - INSERT INTO ireland_dev_saayam_rdbms.organizations (org_name) - VALUES ('Test Org Gamma') - RETURNING org_id INTO v_id1; - RAISE NOTICE 'Generated id #1: %', v_id1; +-- ============================================================================ +-- test_organizations_ireland.sql — run in the IRELAND database +-- Verifies the updated DR generator (ORG-XXX-XXX-XXX-XXXX, 100-band). +-- Ireland = DR for Virginia; its sequence lives in the 1,000,000,000,000 band. +-- Assertions print via RAISE NOTICE. setval/TRUNCATE => TEST DATABASE ONLY. +-- ============================================================================ - INSERT INTO ireland_dev_saayam_rdbms.organizations (org_name) - VALUES ('Test Org Delta') - RETURNING org_id INTO v_id2; - RAISE NOTICE 'Generated id #2: %', v_id2; +TRUNCATE ireland_dev_saayam_rdbms.organizations; +SELECT setval('ireland_dev_saayam_rdbms.org_id_dr_seq', 1000000000000, false); -- next = 1e12 - -- Format check: must start with ORG-00-002- - IF v_id1 LIKE 'ORG-00-002-%' THEN - RAISE NOTICE 'PASS: Ireland prefix ORG-00-002- present'; - ELSE - RAISE EXCEPTION 'FAIL: unexpected prefix on %', v_id1; - END IF; +-- T1 Sequential mint in the 100-band --------------------------------------- +DO $$ +DECLARE a TEXT; b TEXT; +BEGIN + INSERT INTO ireland_dev_saayam_rdbms.organizations(org_name) VALUES ('IE-1') RETURNING org_id INTO a; + INSERT INTO ireland_dev_saayam_rdbms.organizations(org_name) VALUES ('IE-2') RETURNING org_id INTO b; + IF a='ORG-100-000-000-0000' AND b='ORG-100-000-000-0001' + THEN RAISE NOTICE 'T1 PASS Ireland-DR sequential 100-band (%, %)', a, b; + ELSE RAISE NOTICE 'T1 FAIL got %, %', a, b; END IF; +END$$; - -- Cross-region collision guard: Ireland ids must NOT carry the - -- Virginia 001 prefix. - IF v_id1 NOT LIKE 'ORG-00-001-%' THEN - RAISE NOTICE 'PASS: Ireland id does not collide with Virginia range'; - ELSE - RAISE EXCEPTION 'FAIL: Ireland produced a Virginia-range id'; - END IF; +-- T2 Trust-hook: a pre-supplied id (e.g. a Virginia 000-band id being +-- replicated in) is kept, and the DR sequence is NOT consumed ----------- +DO $$ +DECLARE kept TEXT; nxt TEXT; +BEGIN + PERFORM setval('ireland_dev_saayam_rdbms.org_id_dr_seq', 1000000000050, true); -- next = ...051 + INSERT INTO ireland_dev_saayam_rdbms.organizations(org_id, org_name) + VALUES ('ORG-000-000-000-0007', 'replicated-from-virginia') RETURNING org_id INTO kept; + INSERT INTO ireland_dev_saayam_rdbms.organizations(org_name) + VALUES ('next-dr') RETURNING org_id INTO nxt; + IF kept='ORG-000-000-000-0007' AND nxt='ORG-100-000-000-0051' + THEN RAISE NOTICE 'T2 PASS pre-supplied id kept (%), DR seq not consumed (next=%)', kept, nxt; + ELSE RAISE NOTICE 'T2 FAIL kept=% next=%', kept, nxt; END IF; +END$$; - IF v_id1 <> v_id2 THEN - RAISE NOTICE 'PASS: consecutive ids differ'; - ELSE - RAISE EXCEPTION 'FAIL: duplicate ids generated'; - END IF; +-- T3 Segment-rollover math inside the 100-band ----------------------------- +DO $$ +DECLARE a TEXT; b TEXT; +BEGIN + PERFORM setval('ireland_dev_saayam_rdbms.org_id_dr_seq', 1000000000999, true); -- next ...1000 + INSERT INTO ireland_dev_saayam_rdbms.organizations(org_name) VALUES ('r1k') RETURNING org_id INTO a; + PERFORM setval('ireland_dev_saayam_rdbms.org_id_dr_seq', 1000000009999, true); -- next ...10000 + INSERT INTO ireland_dev_saayam_rdbms.organizations(org_name) VALUES ('r10k') RETURNING org_id INTO b; + IF a='ORG-100-000-000-1000' AND b='ORG-100-000-001-0000' + THEN RAISE NOTICE 'T3 PASS rollover correct (%, %)', a, b; + ELSE RAISE NOTICE 'T3 FAIL got %, %', a, b; END IF; +END$$; - DELETE FROM ireland_dev_saayam_rdbms.organizations - WHERE org_id IN (v_id1, v_id2); +-- T4 Exhaustion hard wall at MAXVALUE 1,999,999,999,999 -------------------- +DO $$ +DECLARE last_id TEXT; +BEGIN + PERFORM setval('ireland_dev_saayam_rdbms.org_id_dr_seq', 1999999999998, true); -- next = MAXVALUE + INSERT INTO ireland_dev_saayam_rdbms.organizations(org_name) VALUES ('last') RETURNING org_id INTO last_id; + RAISE NOTICE 'T4 .. last mint at MAXVALUE = %', last_id; + BEGIN + INSERT INTO ireland_dev_saayam_rdbms.organizations(org_name) VALUES ('over'); + RAISE NOTICE 'T4 FAIL sequence did not exhaust'; + EXCEPTION WHEN others THEN + RAISE NOTICE 'T4 PASS hard wall hit as designed: %', SQLERRM; + END; +END$$; - RAISE NOTICE '=== ALL IRELAND TESTS PASSED ==='; -END $$; +SELECT org_id, org_name FROM ireland_dev_saayam_rdbms.organizations ORDER BY org_id; From 55aaa39d55268c8476e4cc5d65f9c60ff4cabb3c Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:26:21 -0400 Subject: [PATCH 10/12] Refactor organization ID sequence and generation for Ireland Updated sequence and ID generation logic for Ireland's organizations. Adjusted sequence start, formatting, and trigger for organization ID generation. --- .../Scripts/ddl_organizations_ireland.sql | 73 +++++++------------ 1 file changed, 28 insertions(+), 45 deletions(-) diff --git a/ddl/Tables/Scripts/ddl_organizations_ireland.sql b/ddl/Tables/Scripts/ddl_organizations_ireland.sql index f6a3ea4..305f0b0 100644 --- a/ddl/Tables/Scripts/ddl_organizations_ireland.sql +++ b/ddl/Tables/Scripts/ddl_organizations_ireland.sql @@ -1,61 +1,44 @@ --- ===================================================================== --- Regional Sequence Generator: ORGANIZATIONS -- IRELAND (eu-west-1) --- EU region. --- --- Per ADR: organizations are GLOBAL operational tables, so there is --- NO is_eu split and NO dual generator here. Ireland differs from --- Virginia ONLY in its sequence start range (2 trillion) and its --- hardcoded region prefix ('002'), which together guarantee that any --- org created in Ireland can never collide with a Virginia-native org --- during disaster recovery / sync-back. --- --- DECISION POINTS: identical to the Virginia file. See [D1]-[D4] there. --- The ONLY differences from Virginia are: --- - START WITH 2000000000000 (2 trillion) --- - region_prefix := '002' --- ===================================================================== +WHAT CHANGED vs PR #243: +-- - Format: ORG-00-001-XXX-XXX-XXX -> ORG-XXX-XXX-XXX-XXXX (13 digits, 3-3-3-4) +-- * dropped the constant "00" marker (differentiated nothing) +-- * dropped the explicit "001" region sub-block (region now lives in the range) +-- - Formatting: FLOOR/MOD math -> LPAD + SUBSTRING (string slicing) +-- - Sequence range: START 2,000,000,000,000 -> START 1,000,000,000,000, MAXVALUE 1,999,999,999,999 +-- (Ireland-DR owns the 100-band; Virginia owns the 000-band) +-- KEPT / ADDED (not in the raw feedback snippet): +-- - Trust-hook: a pre-supplied org_id (replication / DR copy-back) is not re-minted +-- - Width guard: loud error if a value ever exceeds 13 digits (SUBSTRING contract) +-- ============================================================================ + +CREATE SEQUENCE IF NOT EXISTS ireland_dev_saayam_rdbms.org_id_dr_seq + START WITH 1000000000000 INCREMENT BY 1 MINVALUE 1000000000000 MAXVALUE 1999999999999 NO CYCLE; - --- --------------------------------------------------------------------- --- 1. Sequence: Ireland starts at 2 trillion. --- --------------------------------------------------------------------- -CREATE SEQUENCE IF NOT EXISTS ireland_dev_saayam_rdbms.seq_org_id - START WITH 2000000000000 - INCREMENT BY 1 - NO MAXVALUE - NO CYCLE; - - --- --------------------------------------------------------------------- --- 2. Generator function (hardcoded prefix '002' for Ireland) --- Output example: ORG-00-002-004-010-003 --- --------------------------------------------------------------------- CREATE OR REPLACE FUNCTION ireland_dev_saayam_rdbms.generate_org_id() RETURNS TRIGGER AS $$ DECLARE seq_id BIGINT; - new_id TEXT; - region_prefix TEXT := '002'; -- [D3] hardcoded: Ireland + padded TEXT; BEGIN - IF (NEW.org_id IS NULL) THEN - seq_id := nextval('ireland_dev_saayam_rdbms.seq_org_id'); + IF NEW.org_id IS NOT NULL THEN -- replication / DR copy-back -> keep id + RETURN NEW; + END IF; - new_id := 'ORG-00-' || region_prefix || '-' || - LPAD(FLOOR((seq_id % 1000000000) / 1000000)::TEXT, 3, '0') || '-' || - LPAD(FLOOR((seq_id % 1000000) / 1000)::TEXT, 3, '0') || '-' || - LPAD((seq_id % 1000)::TEXT, 3, '0'); + seq_id := nextval('ireland_dev_saayam_rdbms.org_id_dr_seq'); + padded := LPAD(seq_id::TEXT, 13, '0'); - NEW.org_id := new_id; + IF length(padded) > 13 THEN -- SUBSTRING width contract + RAISE EXCEPTION 'org_id_dr_seq value % exceeds 13 digits; format would corrupt', seq_id; END IF; + NEW.org_id := 'ORG-' || + SUBSTRING(padded FROM 1 FOR 3) || '-' || + SUBSTRING(padded FROM 4 FOR 3) || '-' || + SUBSTRING(padded FROM 7 FOR 3) || '-' || + SUBSTRING(padded FROM 10 FOR 4); RETURN NEW; END; $$ LANGUAGE plpgsql; - --- --------------------------------------------------------------------- --- 3. Trigger: fire before INSERT on organizations. --- --------------------------------------------------------------------- -CREATE TRIGGER trg_generate_org_id +CREATE OR REPLACE TRIGGER before_insert_organizations BEFORE INSERT ON ireland_dev_saayam_rdbms.organizations FOR EACH ROW EXECUTE FUNCTION ireland_dev_saayam_rdbms.generate_org_id(); From 72ce64659e7a8c65c1b6f72cd5f2e95b45d71179 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:27:16 -0400 Subject: [PATCH 11/12] Update Ireland org ID sequence and trigger This script modifies the organization ID sequence generator for Ireland, updating the sequence range and format. It drops existing triggers, functions, and sequences before recreating them with the new specifications. --- ddl/Tables/Scripts/ddl_org_seq_ireland.sql | 61 ++++++++++++++-------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/ddl/Tables/Scripts/ddl_org_seq_ireland.sql b/ddl/Tables/Scripts/ddl_org_seq_ireland.sql index 870d04c..092ca4a 100644 --- a/ddl/Tables/Scripts/ddl_org_seq_ireland.sql +++ b/ddl/Tables/Scripts/ddl_org_seq_ireland.sql @@ -1,37 +1,52 @@ --- ===================================================================== --- DDL CHANGE SCRIPT: Ireland org sequence generator --- Idempotent migration. Differs from Virginia only in start range --- (2 trillion) and region prefix ('002'). --- ===================================================================== +-- ============================================================================ +-- alter_org_seq_ireland.sql (MIGRATION: old PR format -> new format) +-- ---------------------------------------------------------------------------- +-- Moves an existing deployment from ORG-00-001-XXX-XXX-XXX (PR #243, Ireland = DR for Virginia) +-- to the reviewed format ORG-XXX-XXX-XXX-XXXX. +-- +-- IMPORTANT — this changes BOTH the format AND the sequence range, so a plain +-- "create if missing" cannot update the already-deployed sequence. This script +-- therefore DROPS and RECREATES the sequence, which RESETS the counter. +-- * SAFE pre-launch / in dev, when NO org_id values have been issued yet. +-- * NOT SAFE if ORG ids already exist: resetting would re-issue them, AND the +-- already-stored old-format ids (ORG-00-001-...) would need a separate +-- data back-fill. In that case, migrate data first, then run this. +-- +-- Run as the OWNER of the organizations table. +-- ============================================================================ -CREATE SEQUENCE IF NOT EXISTS ireland_dev_saayam_rdbms.seq_org_id - START WITH 2000000000000 - INCREMENT BY 1 - NO MAXVALUE - NO CYCLE; +-- 1) Remove old objects (order: trigger -> function -> sequence) -------------- +DROP TRIGGER IF EXISTS before_insert_organizations ON ireland_dev_saayam_rdbms.organizations; +DROP FUNCTION IF EXISTS ireland_dev_saayam_rdbms.generate_org_id(); +DROP SEQUENCE IF EXISTS ireland_dev_saayam_rdbms.org_id_dr_seq; -- resets counter (see note) + +-- 2) Recreate with the new range + format ------------------------------------ +CREATE SEQUENCE ireland_dev_saayam_rdbms.org_id_dr_seq + START WITH 1000000000000 INCREMENT BY 1 MINVALUE 1000000000000 MAXVALUE 1999999999999 NO CYCLE; CREATE OR REPLACE FUNCTION ireland_dev_saayam_rdbms.generate_org_id() RETURNS TRIGGER AS $$ DECLARE seq_id BIGINT; - new_id TEXT; - region_prefix TEXT := '002'; + padded TEXT; BEGIN - IF (NEW.org_id IS NULL) THEN - seq_id := nextval('ireland_dev_saayam_rdbms.seq_org_id'); - new_id := 'ORG-00-' || region_prefix || '-' || - LPAD(FLOOR((seq_id % 1000000000) / 1000000)::TEXT, 3, '0') || '-' || - LPAD(FLOOR((seq_id % 1000000) / 1000)::TEXT, 3, '0') || '-' || - LPAD((seq_id % 1000)::TEXT, 3, '0'); - NEW.org_id := new_id; + IF NEW.org_id IS NOT NULL THEN + RETURN NEW; + END IF; + seq_id := nextval('ireland_dev_saayam_rdbms.org_id_dr_seq'); + padded := LPAD(seq_id::TEXT, 13, '0'); + IF length(padded) > 13 THEN + RAISE EXCEPTION 'org_id_dr_seq value % exceeds 13 digits; format would corrupt', seq_id; END IF; + NEW.org_id := 'ORG-' || + SUBSTRING(padded FROM 1 FOR 3) || '-' || + SUBSTRING(padded FROM 4 FOR 3) || '-' || + SUBSTRING(padded FROM 7 FOR 3) || '-' || + SUBSTRING(padded FROM 10 FOR 4); RETURN NEW; END; $$ LANGUAGE plpgsql; -DROP TRIGGER IF EXISTS trg_generate_org_id - ON ireland_dev_saayam_rdbms.organizations; - -CREATE TRIGGER trg_generate_org_id +CREATE OR REPLACE TRIGGER before_insert_organizations BEFORE INSERT ON ireland_dev_saayam_rdbms.organizations FOR EACH ROW EXECUTE FUNCTION ireland_dev_saayam_rdbms.generate_org_id(); From b9e3d677b24efbb212c783e0bcd603d6eadf1374 Mon Sep 17 00:00:00 2001 From: Mohith Seelam <88337483+MohithS04@users.noreply.github.com> Date: Tue, 7 Jul 2026 21:28:41 -0400 Subject: [PATCH 12/12] Migrate organization sequence to new format This script migrates the organization sequence format from the old PR format to the new format, dropping and recreating the sequence and associated trigger and function to reset the counter. It ensures that the new sequence starts from 1 and follows the updated format for organization IDs. --- ddl/Tables/ddl_org_seq_virginia.sql | 59 +++++++++++++++++++---------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/ddl/Tables/ddl_org_seq_virginia.sql b/ddl/Tables/ddl_org_seq_virginia.sql index 6261ac5..b18b65d 100644 --- a/ddl/Tables/ddl_org_seq_virginia.sql +++ b/ddl/Tables/ddl_org_seq_virginia.sql @@ -1,35 +1,52 @@ +-- ============================================================================ +-- alter_org_seq_virginia.sql (MIGRATION: old PR format -> new format) +-- ---------------------------------------------------------------------------- +-- Moves an existing deployment from ORG-00-001-XXX-XXX-XXX (PR #243) +-- to the reviewed format ORG-XXX-XXX-XXX-XXXX. +-- +-- IMPORTANT — this changes BOTH the format AND the sequence range, so a plain +-- "create if missing" cannot update the already-deployed sequence. This script +-- therefore DROPS and RECREATES the sequence, which RESETS the counter. +-- * SAFE pre-launch / in dev, when NO org_id values have been issued yet. +-- * NOT SAFE if ORG ids already exist: resetting would re-issue them, AND the +-- already-stored old-format ids (ORG-00-001-...) would need a separate +-- data back-fill. In that case, migrate data first, then run this. +-- +-- Run as the OWNER of the organizations table. +-- ============================================================================ --- 1. Sequence (create if missing; leave existing untouched) -CREATE SEQUENCE IF NOT EXISTS virginia_dev_saayam_rdbms.seq_org_id - START WITH 1000000000000 - INCREMENT BY 1 - NO MAXVALUE - NO CYCLE; +-- 1) Remove old objects (order: trigger -> function -> sequence) -------------- +DROP TRIGGER IF EXISTS before_insert_organizations ON virginia_dev_saayam_rdbms.organizations; +DROP FUNCTION IF EXISTS virginia_dev_saayam_rdbms.generate_org_id(); +DROP SEQUENCE IF EXISTS virginia_dev_saayam_rdbms.org_id_seq; -- resets counter (see note) + +-- 2) Recreate with the new range + format ------------------------------------ +CREATE SEQUENCE virginia_dev_saayam_rdbms.org_id_seq + START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999999 NO CYCLE; --- 2. (Re)create the generator function CREATE OR REPLACE FUNCTION virginia_dev_saayam_rdbms.generate_org_id() RETURNS TRIGGER AS $$ DECLARE seq_id BIGINT; - new_id TEXT; - region_prefix TEXT := '001'; + padded TEXT; BEGIN - IF (NEW.org_id IS NULL) THEN - seq_id := nextval('virginia_dev_saayam_rdbms.seq_org_id'); - new_id := 'ORG-00-' || region_prefix || '-' || - LPAD(FLOOR((seq_id % 1000000000) / 1000000)::TEXT, 3, '0') || '-' || - LPAD(FLOOR((seq_id % 1000000) / 1000)::TEXT, 3, '0') || '-' || - LPAD((seq_id % 1000)::TEXT, 3, '0'); - NEW.org_id := new_id; + IF NEW.org_id IS NOT NULL THEN + RETURN NEW; + END IF; + seq_id := nextval('virginia_dev_saayam_rdbms.org_id_seq'); + padded := LPAD(seq_id::TEXT, 13, '0'); + IF length(padded) > 13 THEN + RAISE EXCEPTION 'org_id_seq value % exceeds 13 digits; format would corrupt', seq_id; END IF; + NEW.org_id := 'ORG-' || + SUBSTRING(padded FROM 1 FOR 3) || '-' || + SUBSTRING(padded FROM 4 FOR 3) || '-' || + SUBSTRING(padded FROM 7 FOR 3) || '-' || + SUBSTRING(padded FROM 10 FOR 4); RETURN NEW; END; $$ LANGUAGE plpgsql; --- 3. Recreate the trigger (drop first so re-runs don't error) -DROP TRIGGER IF EXISTS trg_generate_org_id - ON virginia_dev_saayam_rdbms.organizations; - -CREATE TRIGGER trg_generate_org_id +CREATE OR REPLACE TRIGGER before_insert_organizations BEFORE INSERT ON virginia_dev_saayam_rdbms.organizations FOR EACH ROW EXECUTE FUNCTION virginia_dev_saayam_rdbms.generate_org_id();