X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/9508368d37fe6e9d54a2d51ed8d886261ec4a9e9..b470e01f840d1b954326f8f863e185ebe7f9b9f2:/db/functions/functions.sql?ds=inline diff --git a/db/functions/functions.sql b/db/functions/functions.sql index 5ed00ea63..4f1f7c716 100644 --- a/db/functions/functions.sql +++ b/db/functions/functions.sql @@ -68,3 +68,33 @@ BEGIN RETURN (x << zoom) | y; END; $$ LANGUAGE plpgsql IMMUTABLE; + +-- xid_to_int4 converts a PostgreSQL transaction ID (xid) to a 32-bit integer +-- which can then be used to efficiently find rows which have changed between +-- two given transactions. This is currently used by Osmosis to extract a +-- stream of edits for "diff replication" **HOWEVER** this is a pain point, as +-- (ab)using the xid in this way is _not_ supported or recommended by Postgres +-- devs. It is preventing us upgrading to PostgreSQL version 10+, and will +-- hopefully be replaced Real Soon Now. +-- +-- From the Osmosis distribution by Brett Henderson: +-- https://github.com/openstreetmap/osmosis/blob/master/package/script/contrib/apidb_0.6_osmosis_xid_indexing.sql +CREATE OR REPLACE FUNCTION xid_to_int4(t xid) + RETURNS integer + AS +$$ +DECLARE + tl bigint; + ti int; +BEGIN + tl := t; + + IF tl >= 2147483648 THEN + tl := tl - 4294967296; + END IF; + + ti := tl; + + RETURN ti; +END; +$$ LANGUAGE 'plpgsql' IMMUTABLE STRICT;