continual experimentation with script
authorChris Sharp <csharp@georgialibraries.org>
Fri, 14 Sep 2012 15:49:30 +0000 (11:49 -0400)
committerChris Sharp <csharp@georgialibraries.org>
Sat, 16 Feb 2013 13:27:04 +0000 (08:27 -0500)
Open-ILS/src/sql/Pg/version-upgrade/2.1-2.2-upgrade-db.sql
Open-ILS/src/sql/Pg/version-upgrade/pines-blu-ray.sql
Open-ILS/src/sql/Pg/version-upgrade/pines-pre-2.1-2.2-upgrade.sql
Open-ILS/src/sql/Pg/version-upgrade/pines-upgrade-dep-tracking.sql [new file with mode: 0644]

index d098d0e..ee68dca 100644 (file)
 -- Don't require use of -vegversion=something
 \set eg_version '''2.2.0'''
 
--- DROP objects that might have existed from a prior run of 0526
--- Yes this is ironic.
-DROP TABLE IF EXISTS config.db_patch_dependencies;
-ALTER TABLE config.upgrade_log DROP COLUMN IF EXISTS applied_to;
-DROP FUNCTION IF EXISTS evergreen.upgrade_list_applied_deprecates(TEXT);
-DROP FUNCTION IF EXISTS evergreen.upgrade_list_applied_supersedes(TEXT);
-
-BEGIN;
-INSERT INTO config.upgrade_log (version) VALUES ('2.2.0');
-
-INSERT INTO config.upgrade_log (version) VALUES ('0526'); --miker
-
-CREATE TABLE config.db_patch_dependencies (
-  db_patch      TEXT PRIMARY KEY,
-  supersedes    TEXT[],
-  deprecates    TEXT[]
-);
-
-CREATE OR REPLACE FUNCTION evergreen.array_overlap_check (/* field */) RETURNS TRIGGER AS $$
-DECLARE
-    fld     TEXT;
-    cnt     INT;
-BEGIN
-    fld := TG_ARGV[1];
-    EXECUTE 'SELECT COUNT(*) FROM '|| TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME ||' WHERE '|| fld ||' && ($1).'|| fld INTO cnt USING NEW;
-    IF cnt > 0 THEN
-        RAISE EXCEPTION 'Cannot insert duplicate array into field % of table %', fld, TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME;
-    END IF;
-    RETURN NEW;
-END;
-$$ LANGUAGE PLPGSQL;
-
-CREATE TRIGGER no_overlapping_sups
-    BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
-    FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('supersedes');
-
-CREATE TRIGGER no_overlapping_deps
-    BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
-    FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
-
-ALTER TABLE config.upgrade_log
-    ADD COLUMN applied_to TEXT;
-
--- Provide a named type for patching functions
-CREATE TYPE evergreen.patch AS (patch TEXT);
-
--- List applied db patches that are deprecated by (and block the application of) my_db_patch
-CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecates ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
-    SELECT  DISTINCT l.version
-      FROM  config.upgrade_log l
-            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.deprecates)
-      WHERE d.db_patch = $1
-$$ LANGUAGE SQL;
-
--- List applied db patches that are superseded by (and block the application of) my_db_patch
-CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_supersedes ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
-    SELECT  DISTINCT l.version
-      FROM  config.upgrade_log l
-            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.supersedes)
-      WHERE d.db_patch = $1
-$$ LANGUAGE SQL;
-
--- List applied db patches that deprecates (and block the application of) my_db_patch
-CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecated ( my_db_patch TEXT ) RETURNS TEXT AS $$
-    SELECT  db_patch
-      FROM  config.db_patch_dependencies
-      WHERE ARRAY[$1]::TEXT[] && deprecates
-$$ LANGUAGE SQL;
-
--- List applied db patches that supersedes (and block the application of) my_db_patch
-CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_superseded ( my_db_patch TEXT ) RETURNS TEXT AS $$
-    SELECT  db_patch
-      FROM  config.db_patch_dependencies
-      WHERE ARRAY[$1]::TEXT[] && supersedes
-$$ LANGUAGE SQL;
-
--- Make sure that no deprecated or superseded db patches are currently applied
-CREATE OR REPLACE FUNCTION evergreen.upgrade_verify_no_dep_conflicts ( my_db_patch TEXT ) RETURNS BOOL AS $$
-    SELECT  COUNT(*) = 0
-      FROM  (SELECT * FROM evergreen.upgrade_list_applied_deprecates( $1 )
-                UNION
-             SELECT * FROM evergreen.upgrade_list_applied_supersedes( $1 )
-                UNION
-             SELECT * FROM evergreen.upgrade_list_applied_deprecated( $1 )
-                UNION
-             SELECT * FROM evergreen.upgrade_list_applied_superseded( $1 ))x
-$$ LANGUAGE SQL;
-
--- Raise an exception if there are, in fact, dep/sup confilct
-CREATE OR REPLACE FUNCTION evergreen.upgrade_deps_block_check ( my_db_patch TEXT, my_applied_to TEXT ) RETURNS BOOL AS $$
-DECLARE 
-    deprecates TEXT;
-    supersedes TEXT;
-BEGIN
-    IF NOT evergreen.upgrade_verify_no_dep_conflicts( my_db_patch ) THEN
-        SELECT  STRING_AGG(patch, ', ') INTO deprecates FROM evergreen.upgrade_list_applied_deprecates(my_db_patch);
-        SELECT  STRING_AGG(patch, ', ') INTO supersedes FROM evergreen.upgrade_list_applied_supersedes(my_db_patch);
-        RAISE EXCEPTION '
-Upgrade script % can not be applied:
-  applied deprecated scripts %
-  applied superseded scripts %
-  deprecated by %
-  superseded by %',
-            my_db_patch,
-            ARRAY_AGG(evergreen.upgrade_list_applied_deprecates(my_db_patch)),
-            ARRAY_AGG(evergreen.upgrade_list_applied_supersedes(my_db_patch)),
-            evergreen.upgrade_list_applied_deprecated(my_db_patch),
-            evergreen.upgrade_list_applied_superseded(my_db_patch);
-    END IF;
-
-    INSERT INTO config.upgrade_log (version, applied_to) VALUES (my_db_patch, my_applied_to);
-    RETURN TRUE;
-END;
-$$ LANGUAGE PLPGSQL;
+---- DROP objects that might have existed from a prior run of 0526
+---- Yes this is ironic.
+--DROP TABLE IF EXISTS config.db_patch_dependencies;
+--ALTER TABLE config.upgrade_log DROP COLUMN IF EXISTS applied_to;
+--DROP FUNCTION IF EXISTS evergreen.upgrade_list_applied_deprecates(TEXT);
+--DROP FUNCTION IF EXISTS evergreen.upgrade_list_applied_supersedes(TEXT);
+--
+--BEGIN;
+--INSERT INTO config.upgrade_log (version) VALUES ('2.2.0');
+--
+--INSERT INTO config.upgrade_log (version) VALUES ('0526'); --miker
+--
+--CREATE TABLE config.db_patch_dependencies (
+--  db_patch      TEXT PRIMARY KEY,
+--  supersedes    TEXT[],
+--  deprecates    TEXT[]
+--);
+--
+--CREATE OR REPLACE FUNCTION evergreen.array_overlap_check (/* field */) RETURNS TRIGGER AS $$
+--DECLARE
+--    fld     TEXT;
+--    cnt     INT;
+--BEGIN
+--    fld := TG_ARGV[1];
+--    EXECUTE 'SELECT COUNT(*) FROM '|| TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME ||' WHERE '|| fld ||' && ($1).'|| fld INTO cnt USING NEW;
+--    IF cnt > 0 THEN
+--        RAISE EXCEPTION 'Cannot insert duplicate array into field % of table %', fld, TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME;
+--    END IF;
+--    RETURN NEW;
+--END;
+--$$ LANGUAGE PLPGSQL;
+--
+--CREATE TRIGGER no_overlapping_sups
+--    BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
+--    FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('supersedes');
+--
+--CREATE TRIGGER no_overlapping_deps
+--    BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
+--    FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
+--
+--ALTER TABLE config.upgrade_log
+--    ADD COLUMN applied_to TEXT;
+--
+---- Provide a named type for patching functions
+--CREATE TYPE evergreen.patch AS (patch TEXT);
+--
+---- List applied db patches that are deprecated by (and block the application of) my_db_patch
+--CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecates ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
+--    SELECT  DISTINCT l.version
+--      FROM  config.upgrade_log l
+--            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.deprecates)
+--      WHERE d.db_patch = $1
+--$$ LANGUAGE SQL;
+--
+---- List applied db patches that are superseded by (and block the application of) my_db_patch
+--CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_supersedes ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
+--    SELECT  DISTINCT l.version
+--      FROM  config.upgrade_log l
+--            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.supersedes)
+--      WHERE d.db_patch = $1
+--$$ LANGUAGE SQL;
+--
+---- List applied db patches that deprecates (and block the application of) my_db_patch
+--CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecated ( my_db_patch TEXT ) RETURNS TEXT AS $$
+--    SELECT  db_patch
+--      FROM  config.db_patch_dependencies
+--      WHERE ARRAY[$1]::TEXT[] && deprecates
+--$$ LANGUAGE SQL;
+--
+---- List applied db patches that supersedes (and block the application of) my_db_patch
+--CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_superseded ( my_db_patch TEXT ) RETURNS TEXT AS $$
+--    SELECT  db_patch
+--      FROM  config.db_patch_dependencies
+--      WHERE ARRAY[$1]::TEXT[] && supersedes
+--$$ LANGUAGE SQL;
+--
+---- Make sure that no deprecated or superseded db patches are currently applied
+--CREATE OR REPLACE FUNCTION evergreen.upgrade_verify_no_dep_conflicts ( my_db_patch TEXT ) RETURNS BOOL AS $$
+--    SELECT  COUNT(*) = 0
+--      FROM  (SELECT * FROM evergreen.upgrade_list_applied_deprecates( $1 )
+--                UNION
+--             SELECT * FROM evergreen.upgrade_list_applied_supersedes( $1 )
+--                UNION
+--             SELECT * FROM evergreen.upgrade_list_applied_deprecated( $1 )
+--                UNION
+--             SELECT * FROM evergreen.upgrade_list_applied_superseded( $1 ))x
+--$$ LANGUAGE SQL;
+--
+---- Raise an exception if there are, in fact, dep/sup confilct
+--CREATE OR REPLACE FUNCTION evergreen.upgrade_deps_block_check ( my_db_patch TEXT, my_applied_to TEXT ) RETURNS BOOL AS $$
+--DECLARE 
+--    deprecates TEXT;
+--    supersedes TEXT;
+--BEGIN
+--    IF NOT evergreen.upgrade_verify_no_dep_conflicts( my_db_patch ) THEN
+--        SELECT  STRING_AGG(patch, ', ') INTO deprecates FROM evergreen.upgrade_list_applied_deprecates(my_db_patch);
+--        SELECT  STRING_AGG(patch, ', ') INTO supersedes FROM evergreen.upgrade_list_applied_supersedes(my_db_patch);
+--        RAISE EXCEPTION '
+--Upgrade script % can not be applied:
+--  applied deprecated scripts %
+--  applied superseded scripts %
+--  deprecated by %
+--  superseded by %',
+--            my_db_patch,
+--            ARRAY_AGG(evergreen.upgrade_list_applied_deprecates(my_db_patch)),
+--            ARRAY_AGG(evergreen.upgrade_list_applied_supersedes(my_db_patch)),
+--            evergreen.upgrade_list_applied_deprecated(my_db_patch),
+--            evergreen.upgrade_list_applied_superseded(my_db_patch);
+--    END IF;
+--
+--    INSERT INTO config.upgrade_log (version, applied_to) VALUES (my_db_patch, my_applied_to);
+--    RETURN TRUE;
+--END;
+--$$ LANGUAGE PLPGSQL;
 
 -- Evergreen DB patch 0536.schema.lazy_circ-barcode_lookup.sql
 --
@@ -9749,49 +9749,50 @@ INSERT INTO vandelay.import_error ( code, description )
 
 
 
----- Evergreen DB patch 0685.data.bluray_vr_format.sql
-----
----- FIXME: insert description of change, if needed
-----
---
---
----- check whether patch can be applied
---SELECT evergreen.upgrade_deps_block_check('0685', :eg_version);
---
----- FIXME: add/check SQL statements to perform the upgrade
---DO $FUNC$
---DECLARE
---    same_marc BOOL;
---BEGIN
---    -- Check if it is already there
---    PERFORM * FROM config.marc21_physical_characteristic_value_map v
---        JOIN config.marc21_physical_characteristic_subfield_map s ON v.ptype_subfield = s.id
---        WHERE s.ptype_key = 'v' AND s.subfield = 'e' AND s.start_pos = '4' AND s.length = '1'
---            AND v.value = 's';
---
---    -- If it is, bail.
---    IF FOUND THEN
---        RETURN;
---    END IF;
+-- Evergreen DB patch 0685.data.bluray_vr_format.sql
 --
---    -- Otherwise, insert it
---    INSERT INTO config.marc21_physical_characteristic_value_map (value,ptype_subfield,label)
---    SELECT 's',id,'Blu-ray'
---        FROM config.marc21_physical_characteristic_subfield_map
---        WHERE ptype_key = 'v' AND subfield = 'e' AND start_pos = '4' AND length = '1';
+-- FIXME: insert description of change, if needed
 --
---    -- And reingest the blue-ray items so that things see the new value
---    SELECT INTO same_marc enabled FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc';
---    UPDATE config.internal_flag SET enabled = true WHERE name = 'ingest.reingest.force_on_same_marc';
---    UPDATE biblio.record_entry SET marc=marc WHERE id IN (SELECT record
---        FROM
---            metabib.full_rec a JOIN metabib.full_rec b USING (record)
---        WHERE
---            a.tag = 'LDR' AND a.value LIKE '______g%'
---        AND b.tag = '007' AND b.value LIKE 'v___s%');
---    UPDATE config.internal_flag SET enabled = same_marc WHERE name = 'ingest.reingest.force_on_same_marc';
---END;
---$FUNC$;
+
+
+-- check whether patch can be applied
+SELECT evergreen.upgrade_deps_block_check('0685', :eg_version);
+
+-- FIXME: add/check SQL statements to perform the upgrade
+DO $FUNC$
+DECLARE
+    same_marc BOOL;
+BEGIN
+    -- Check if it is already there
+    PERFORM * FROM config.marc21_physical_characteristic_value_map v
+        JOIN config.marc21_physical_characteristic_subfield_map s ON v.ptype_subfield = s.id
+        WHERE s.ptype_key = 'v' AND s.subfield = 'e' AND s.start_pos = '4' AND s.length = '1'
+            AND v.value = 's';
+
+    -- If it is, bail.
+    IF FOUND THEN
+        RETURN;
+    END IF;
+
+    -- Otherwise, insert it
+    INSERT INTO config.marc21_physical_characteristic_value_map (value,ptype_subfield,label)
+    SELECT 's',id,'Blu-ray'
+        FROM config.marc21_physical_characteristic_subfield_map
+        WHERE ptype_key = 'v' AND subfield = 'e' AND start_pos = '4' AND length = '1';
+
+    -- And reingest the blue-ray items so that things see the new value
+    SELECT INTO same_marc enabled FROM config.internal_flag WHERE name = 'ingest.reingest.force_on_same_marc';
+    UPDATE config.internal_flag SET enabled = true WHERE name = 'ingest.reingest.force_on_same_marc';
+    UPDATE biblio.record_entry SET marc=marc WHERE id IN (SELECT record
+        FROM
+            metabib.full_rec a JOIN metabib.full_rec b USING (record)
+        WHERE
+            a.tag = 'LDR' AND a.value LIKE '______g%'
+        AND b.tag = '007' AND b.value LIKE 'v___s%')
+       AND NOT deleted; -- csharp
+    UPDATE config.internal_flag SET enabled = same_marc WHERE name = 'ingest.reingest.force_on_same_marc';
+END;
+$FUNC$;
 
 
 -- Evergreen DB patch 0686.schema.auditor_boost.sql
index 95dda74..eb15668 100644 (file)
@@ -4,7 +4,7 @@
 --
 BEGIN;
 
-
+\set eg_version '''2.2.0'''
 -- check whether patch can be applied
 SELECT evergreen.upgrade_deps_block_check('0685', :eg_version);
 
@@ -38,7 +38,8 @@ BEGIN
             metabib.full_rec a JOIN metabib.full_rec b USING (record)
         WHERE
             a.tag = 'LDR' AND a.value LIKE '______g%'
-        AND b.tag = '007' AND b.value LIKE 'v___s%');
+        AND b.tag = '007' AND b.value LIKE 'v___s%')
+       AND NOT deleted;
     UPDATE config.internal_flag SET enabled = same_marc WHERE name = 'ingest.reingest.force_on_same_marc';
 END;
 $FUNC$;
index 06c6180..ebcb22c 100644 (file)
@@ -45,5 +45,6 @@ ALTER TABLE biblio.record_entry ENABLE TRIGGER ALL;
 ALTER TABLE asset.copy DISABLE TRIGGER ALL;
 
 -- go ahead and find problem records if any exist because we don't want them to interfere with progress
+\o /tmp/problem-bib-records.out
 SELECT id FROM biblio.record_entry WHERE is_valid_marcxml(marc) IS FALSE;
-
+\o
diff --git a/Open-ILS/src/sql/Pg/version-upgrade/pines-upgrade-dep-tracking.sql b/Open-ILS/src/sql/Pg/version-upgrade/pines-upgrade-dep-tracking.sql
new file mode 100644 (file)
index 0000000..16ff50d
--- /dev/null
@@ -0,0 +1,115 @@
+-- DROP objects that might have existed from a prior run of 0526
+-- Yes this is ironic.
+DROP TABLE IF EXISTS config.db_patch_dependencies;
+ALTER TABLE config.upgrade_log DROP COLUMN applied_to;
+DROP FUNCTION evergreen.upgrade_list_applied_deprecates(TEXT);
+DROP FUNCTION evergreen.upgrade_list_applied_supersedes(TEXT);
+
+BEGIN;
+
+INSERT INTO config.upgrade_log (version) VALUES ('0526'); --miker
+
+CREATE TABLE config.db_patch_dependencies (
+  db_patch      TEXT PRIMARY KEY,
+  supersedes    TEXT[],
+  deprecates    TEXT[]
+);
+
+CREATE OR REPLACE FUNCTION evergreen.array_overlap_check (/* field */) RETURNS TRIGGER AS $$
+DECLARE
+    fld     TEXT;
+    cnt     INT;
+BEGIN
+    fld := TG_ARGV[1];
+    EXECUTE 'SELECT COUNT(*) FROM '|| TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME ||' WHERE '|| fld ||' && ($1).'|| fld INTO cnt USING NEW;
+    IF cnt > 0 THEN
+        RAISE EXCEPTION 'Cannot insert duplicate array into field % of table %', fld, TG_TABLE_SCHEMA ||'.'|| TG_TABLE_NAME;
+    END IF;
+    RETURN NEW;
+END;
+$$ LANGUAGE PLPGSQL;
+
+CREATE TRIGGER no_overlapping_sups
+    BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
+    FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('supersedes');
+
+CREATE TRIGGER no_overlapping_deps
+    BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
+    FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
+
+ALTER TABLE config.upgrade_log
+    ADD COLUMN applied_to TEXT;
+
+-- Provide a named type for patching functions
+CREATE TYPE evergreen.patch AS (patch TEXT);
+
+-- List applied db patches that are deprecated by (and block the application of) my_db_patch
+CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecates ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
+    SELECT  DISTINCT l.version
+      FROM  config.upgrade_log l
+            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.deprecates)
+      WHERE d.db_patch = $1
+$$ LANGUAGE SQL;
+
+-- List applied db patches that are superseded by (and block the application of) my_db_patch
+CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_supersedes ( my_db_patch TEXT ) RETURNS SETOF evergreen.patch AS $$
+    SELECT  DISTINCT l.version
+      FROM  config.upgrade_log l
+            JOIN config.db_patch_dependencies d ON (l.version::TEXT[] && d.supersedes)
+      WHERE d.db_patch = $1
+$$ LANGUAGE SQL;
+
+-- List applied db patches that deprecates (and block the application of) my_db_patch
+CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_deprecated ( my_db_patch TEXT ) RETURNS TEXT AS $$
+    SELECT  db_patch
+      FROM  config.db_patch_dependencies
+      WHERE ARRAY[$1]::TEXT[] && deprecates
+$$ LANGUAGE SQL;
+
+-- List applied db patches that supersedes (and block the application of) my_db_patch
+CREATE OR REPLACE FUNCTION evergreen.upgrade_list_applied_superseded ( my_db_patch TEXT ) RETURNS TEXT AS $$
+    SELECT  db_patch
+      FROM  config.db_patch_dependencies
+      WHERE ARRAY[$1]::TEXT[] && supersedes
+$$ LANGUAGE SQL;
+
+-- Make sure that no deprecated or superseded db patches are currently applied
+CREATE OR REPLACE FUNCTION evergreen.upgrade_verify_no_dep_conflicts ( my_db_patch TEXT ) RETURNS BOOL AS $$
+    SELECT  COUNT(*) = 0
+      FROM  (SELECT * FROM evergreen.upgrade_list_applied_deprecates( $1 )
+                UNION
+             SELECT * FROM evergreen.upgrade_list_applied_supersedes( $1 )
+                UNION
+             SELECT * FROM evergreen.upgrade_list_applied_deprecated( $1 )
+                UNION
+             SELECT * FROM evergreen.upgrade_list_applied_superseded( $1 ))x
+$$ LANGUAGE SQL;
+
+-- Raise an exception if there are, in fact, dep/sup confilct
+CREATE OR REPLACE FUNCTION evergreen.upgrade_deps_block_check ( my_db_patch TEXT, my_applied_to TEXT ) RETURNS BOOL AS $$
+DECLARE 
+    deprecates TEXT;
+    supersedes TEXT;
+BEGIN
+    IF NOT evergreen.upgrade_verify_no_dep_conflicts( my_db_patch ) THEN
+        SELECT  STRING_AGG(patch, ', ') INTO deprecates FROM evergreen.upgrade_list_applied_deprecates(my_db_patch);
+        SELECT  STRING_AGG(patch, ', ') INTO supersedes FROM evergreen.upgrade_list_applied_supersedes(my_db_patch);
+        RAISE EXCEPTION '
+Upgrade script % can not be applied:
+  applied deprecated scripts %
+  applied superseded scripts %
+  deprecated by %
+  superseded by %',
+            my_db_patch,
+            ARRAY_AGG(evergreen.upgrade_list_applied_deprecates(my_db_patch)),
+            ARRAY_AGG(evergreen.upgrade_list_applied_supersedes(my_db_patch)),
+            evergreen.upgrade_list_applied_deprecated(my_db_patch),
+            evergreen.upgrade_list_applied_superseded(my_db_patch);
+    END IF;
+
+    INSERT INTO config.upgrade_log (version, applied_to) VALUES (my_db_patch, my_applied_to);
+    RETURN TRUE;
+END;
+$$ LANGUAGE PLPGSQL;
+
+COMMIT;