CREATE TABLE config.db_patch_dependencies (
db_patch TEXT PRIMARY KEY,
supersedes TEXT[],
- deprecates TEXT[],
- CONSTRAINT supersede_once EXCLUDE USING GIST ( supersedes WITH && ),
- CONSTRAINT deprecate_once EXCLUDE USING GIST ( deprecates WITH && )
+ 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');
+
INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0526', :eg_version); -- miker
CREATE TABLE config.bib_source (
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 = my_db_patch
+ WHERE d.db_patch = $1
$$ LANGUAGE SQL;
-- List applied db patches that are superseded by (and block the application of) my_db_patch
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 = my_db_patch
+ 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_superseded ( my_db_patch TEXT ) RETURNS TEXT AS $$
+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 my_db_patch::TEXT[] && deprecates
+ 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 my_db_patch::TEXT[] && supersedes
+ 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( my_db_patch )
+ FROM (SELECT * FROM evergreen.upgrade_list_applied_deprecates( $1 )
UNION
- SELECT * FROM evergreen.upgrade_list_applied_supersedes( my_db_patch )
+ SELECT * FROM evergreen.upgrade_list_applied_supersedes( $1 )
UNION
- SELECT * FROM evergreen.upgrade_list_applied_deprecated( my_db_patch )
+ SELECT * FROM evergreen.upgrade_list_applied_deprecated( $1 )
UNION
- SELECT * FROM evergreen.upgrade_list_applied_superseded( my_db_patch ))x
+ SELECT * FROM evergreen.upgrade_list_applied_superseded( $1 ))x
$$ LANGUAGE SQL;
-- Raise an exception if there are, in fact, dep/sup confilct
INSERT INTO config.upgrade_log (version, applied_to) VALUES (my_db_patch, my_applied_to);
RETURN TRUE;
END;
-$$ LANGUAGE SQL;
+$$ LANGUAGE PLPGSQL;
COMMIT;
export PGHOST PGPORT PGDATABASE PGUSER PGPASSWORD
# Hide most of the harmless messages that obscure real problems
if [ -z "$VERBOSE" ]; then
- psql -f $sql_file 2>&1 | grep -v NOTICE | grep -v "^INSERT"
+ psql -v eg_version=NULL -f $sql_file 2>&1 | grep -v NOTICE | grep -v "^INSERT"
else
- psql -f $sql_file
+ psql -v eg_version=NULL -f $sql_file
fi
if [ $? != 0 ]; then
cat <<EOM
CREATE TABLE config.db_patch_dependencies (
db_patch TEXT PRIMARY KEY,
supersedes TEXT[],
- deprecates TEXT[],
- CONSTRAINT supersede_once EXCLUDE USING GIST ( supersedes WITH && ),
- CONSTRAINT deprecate_once EXCLUDE USING GIST ( deprecates WITH && )
+ 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;
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 = my_db_patch
+ WHERE d.db_patch = $1
$$ LANGUAGE SQL;
-- List applied db patches that are superseded by (and block the application of) my_db_patch
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 = my_db_patch
+ 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_superseded ( my_db_patch TEXT ) RETURNS TEXT AS $$
+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 my_db_patch::TEXT[] && deprecates
+ 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 my_db_patch::TEXT[] && supersedes
+ 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( my_db_patch )
+ FROM (SELECT * FROM evergreen.upgrade_list_applied_deprecates( $1 )
UNION
- SELECT * FROM evergreen.upgrade_list_applied_supersedes( my_db_patch )
+ SELECT * FROM evergreen.upgrade_list_applied_supersedes( $1 )
UNION
- SELECT * FROM evergreen.upgrade_list_applied_deprecated( my_db_patch )
+ SELECT * FROM evergreen.upgrade_list_applied_deprecated( $1 )
UNION
- SELECT * FROM evergreen.upgrade_list_applied_superseded( my_db_patch ))x
+ SELECT * FROM evergreen.upgrade_list_applied_superseded( $1 ))x
$$ LANGUAGE SQL;
-- Raise an exception if there are, in fact, dep/sup confilct
INSERT INTO config.upgrade_log (version, applied_to) VALUES (my_db_patch, my_applied_to);
RETURN TRUE;
END;
-$$ LANGUAGE SQL;
+$$ LANGUAGE PLPGSQL;
COMMIT;