mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-15 18:13:18 +08:00
This patch changes the dump configuration for _timescaledb_catalog.metadata to include all entries. To allow loading logical dumps with this configuration an insert trigger is added that turns uniqueness conflicts into updates to not block the restore.
45 lines
2.1 KiB
PL/PgSQL
45 lines
2.1 KiB
PL/PgSQL
-- This file and its contents are licensed under the Apache License 2.0.
|
|
-- Please see the included NOTICE for copyright information and
|
|
-- LICENSE-APACHE for a copy of the license.
|
|
|
|
CREATE OR REPLACE FUNCTION _timescaledb_functions.generate_uuid() RETURNS UUID
|
|
AS '@MODULE_PATHNAME@', 'ts_uuid_generate' LANGUAGE C VOLATILE STRICT;
|
|
|
|
-- Trigger to change INSERT into UPDATE if key already exists.
|
|
--
|
|
-- During extension installation we create 3 entries in the metadata table which are
|
|
-- included in dumps. To allow loading logical dumps we need this trigger to turn INSERTs
|
|
-- into UPDATEs if the key already exists.
|
|
CREATE OR REPLACE FUNCTION _timescaledb_functions.metadata_insert_trigger() RETURNS TRIGGER LANGUAGE PLPGSQL
|
|
AS $$
|
|
BEGIN
|
|
IF EXISTS (SELECT FROM _timescaledb_catalog.metadata WHERE key = NEW.key) THEN
|
|
UPDATE _timescaledb_catalog.metadata SET value = NEW.value WHERE key = NEW.key;
|
|
RETURN NULL;
|
|
END IF;
|
|
RETURN NEW;
|
|
END
|
|
$$ SET search_path TO pg_catalog, pg_temp;
|
|
|
|
-- CREATE OR REPLACE TRIGGER is PG14+ only
|
|
DROP TRIGGER IF EXISTS metadata_insert_trigger ON _timescaledb_catalog.metadata;
|
|
CREATE TRIGGER metadata_insert_trigger BEFORE INSERT ON _timescaledb_catalog.metadata FOR EACH ROW EXECUTE PROCEDURE _timescaledb_functions.metadata_insert_trigger();
|
|
|
|
-- Insert uuid and install_timestamp on database creation since the trigger
|
|
-- will turn these into UPDATEs on conflicts we can't use ON CONFLICT DO NOTHING.
|
|
DO $$
|
|
BEGIN
|
|
IF (NOT EXISTS (SELECT FROM _timescaledb_catalog.metadata WHERE key = 'uuid')) THEN
|
|
INSERT INTO _timescaledb_catalog.metadata SELECT 'uuid', _timescaledb_functions.generate_uuid(), TRUE;
|
|
END IF;
|
|
IF (NOT EXISTS (SELECT FROM _timescaledb_catalog.metadata WHERE key = 'install_timestamp')) THEN
|
|
INSERT INTO _timescaledb_catalog.metadata SELECT 'install_timestamp', now(), TRUE;
|
|
END IF;
|
|
END
|
|
$$;
|
|
|
|
-- Install catalog version on database installation and upgrade.
|
|
-- This allows us to detect catalog mismatches in dump/restore cycle.
|
|
INSERT INTO _timescaledb_catalog.metadata (key, value, include_in_telemetry) SELECT 'timescaledb_version', '@PROJECT_VERSION_MOD@', FALSE;
|
|
|