migrations/20261023040000_xet_file_aliases.up.sql
Rama main · réplica de lectura del repositorio original.
CREATE TABLE IF NOT EXISTS shardline_xet_file_aliases (
scope_key TEXT NOT NULL,
file_id TEXT NOT NULL,
sha256 TEXT NOT NULL,
total_bytes BIGINT NOT NULL CHECK (total_bytes >= 0),
PRIMARY KEY (scope_key, file_id)
);
CREATE OR REPLACE FUNCTION shardline_preserve_xet_file_alias_v1()
RETURNS trigger LANGUAGE plpgsql SET search_path = pg_catalog AS $$
DECLARE inserted bigint; replay boolean;
BEGIN
IF TG_OP = 'UPDATE' THEN
EXECUTE format('INSERT INTO %I.shardline_xet_file_aliases(scope_key,file_id,sha256,total_bytes)
VALUES ($1,$2,$3,$4) ON CONFLICT (scope_key,file_id) DO NOTHING', TG_TABLE_SCHEMA)
USING OLD.scope_key,OLD.file_id,OLD.sha256,OLD.total_bytes;
GET DIAGNOSTICS inserted = ROW_COUNT;
IF inserted = 0 THEN
EXECUTE format('SELECT EXISTS(SELECT 1 FROM %I.shardline_xet_file_aliases
WHERE scope_key=$1 AND file_id=$2 AND sha256=$3 AND total_bytes=$4)', TG_TABLE_SCHEMA)
INTO replay USING OLD.scope_key,OLD.file_id,OLD.sha256,OLD.total_bytes;
IF NOT replay THEN RAISE EXCEPTION 'conflicting native Xet file alias'; END IF;
END IF;
END IF;
EXECUTE format('INSERT INTO %I.shardline_xet_file_aliases(scope_key,file_id,sha256,total_bytes)
VALUES ($1,$2,$3,$4) ON CONFLICT (scope_key,file_id) DO NOTHING', TG_TABLE_SCHEMA)
USING NEW.scope_key,NEW.file_id,NEW.sha256,NEW.total_bytes;
GET DIAGNOSTICS inserted = ROW_COUNT;
IF inserted = 0 THEN
EXECUTE format('SELECT EXISTS(SELECT 1 FROM %I.shardline_xet_file_aliases
WHERE scope_key=$1 AND file_id=$2 AND sha256=$3 AND total_bytes=$4)', TG_TABLE_SCHEMA)
INTO replay USING NEW.scope_key,NEW.file_id,NEW.sha256,NEW.total_bytes;
IF NOT replay THEN RAISE EXCEPTION 'conflicting native Xet file alias'; END IF;
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS shardline_xet_file_aliases_preserve ON shardline_xet_file_identities;
CREATE TRIGGER shardline_xet_file_aliases_preserve
AFTER INSERT OR UPDATE ON shardline_xet_file_identities
FOR EACH ROW EXECUTE FUNCTION shardline_preserve_xet_file_alias_v1();
INSERT INTO shardline_xet_file_aliases(scope_key,file_id,sha256,total_bytes)
SELECT scope_key,file_id,sha256,total_bytes FROM shardline_xet_file_identities WHERE TRUE
ON CONFLICT (scope_key,file_id) DO UPDATE SET sha256 =
CASE WHEN shardline_xet_file_aliases.sha256=excluded.sha256
AND shardline_xet_file_aliases.total_bytes=excluded.total_bytes
THEN shardline_xet_file_aliases.sha256 ELSE NULL END;