mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-11 14:27:36 +08:00
Switching the regression tests to use tstzrange() has proved to not be a good idea for environments where the timestamp precision is low, as internal range checks exclude the upper bound. So, if the commit timestamp of a transaction matched with now() from the next query, the test would fail. This changes to use two bound checks instead of the range function, where the upper bound is inclusive. Per buildfarm member jacana. Discussion: https://postgr.es/m/20200712122507.GD21680@paquier.xyz
140 lines
4.0 KiB
Plaintext
140 lines
4.0 KiB
Plaintext
--
|
|
-- Commit Timestamp
|
|
--
|
|
SHOW track_commit_timestamp;
|
|
track_commit_timestamp
|
|
------------------------
|
|
on
|
|
(1 row)
|
|
|
|
CREATE TABLE committs_test(id serial, ts timestamptz default now());
|
|
INSERT INTO committs_test DEFAULT VALUES;
|
|
INSERT INTO committs_test DEFAULT VALUES;
|
|
INSERT INTO committs_test DEFAULT VALUES;
|
|
SELECT id,
|
|
pg_xact_commit_timestamp(xmin) >= ts,
|
|
pg_xact_commit_timestamp(xmin) <= now(),
|
|
pg_xact_commit_timestamp(xmin) - ts < '60s' -- 60s should give a lot of reserve
|
|
FROM committs_test
|
|
ORDER BY id;
|
|
id | ?column? | ?column? | ?column?
|
|
----+----------+----------+----------
|
|
1 | t | t | t
|
|
2 | t | t | t
|
|
3 | t | t | t
|
|
(3 rows)
|
|
|
|
DROP TABLE committs_test;
|
|
SELECT pg_xact_commit_timestamp('0'::xid);
|
|
ERROR: cannot retrieve commit timestamp for transaction 0
|
|
SELECT pg_xact_commit_timestamp('1'::xid);
|
|
pg_xact_commit_timestamp
|
|
--------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT pg_xact_commit_timestamp('2'::xid);
|
|
pg_xact_commit_timestamp
|
|
--------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT x.xid::text::bigint > 0 as xid_valid,
|
|
x.timestamp > '-infinity'::timestamptz AS ts_low,
|
|
x.timestamp <= now() AS ts_high,
|
|
roident != 0 AS valid_roident
|
|
FROM pg_last_committed_xact() x;
|
|
xid_valid | ts_low | ts_high | valid_roident
|
|
-----------+--------+---------+---------------
|
|
t | t | t | f
|
|
(1 row)
|
|
|
|
-- Test non-normal transaction ids.
|
|
SELECT * FROM pg_xact_commit_timestamp_origin(NULL); -- ok, NULL
|
|
timestamp | roident
|
|
-----------+---------
|
|
|
|
|
(1 row)
|
|
|
|
SELECT * FROM pg_xact_commit_timestamp_origin('0'::xid); -- error
|
|
ERROR: cannot retrieve commit timestamp for transaction 0
|
|
SELECT * FROM pg_xact_commit_timestamp_origin('1'::xid); -- ok, NULL
|
|
timestamp | roident
|
|
-----------+---------
|
|
|
|
|
(1 row)
|
|
|
|
SELECT * FROM pg_xact_commit_timestamp_origin('2'::xid); -- ok, NULL
|
|
timestamp | roident
|
|
-----------+---------
|
|
|
|
|
(1 row)
|
|
|
|
-- Test transaction without replication origin
|
|
SELECT txid_current() as txid_no_origin \gset
|
|
SELECT x.timestamp > '-infinity'::timestamptz AS ts_low,
|
|
x.timestamp <= now() AS ts_high,
|
|
roident != 0 AS valid_roident
|
|
FROM pg_last_committed_xact() x;
|
|
ts_low | ts_high | valid_roident
|
|
--------+---------+---------------
|
|
t | t | f
|
|
(1 row)
|
|
|
|
SELECT x.timestamp > '-infinity'::timestamptz AS ts_low,
|
|
x.timestamp <= now() AS ts_high,
|
|
roident != 0 AS valid_roident
|
|
FROM pg_xact_commit_timestamp_origin(:'txid_no_origin') x;
|
|
ts_low | ts_high | valid_roident
|
|
--------+---------+---------------
|
|
t | t | f
|
|
(1 row)
|
|
|
|
-- Test transaction with replication origin
|
|
SELECT pg_replication_origin_create('regress_commit_ts: get_origin') != 0
|
|
AS valid_roident;
|
|
valid_roident
|
|
---------------
|
|
t
|
|
(1 row)
|
|
|
|
SELECT pg_replication_origin_session_setup('regress_commit_ts: get_origin');
|
|
pg_replication_origin_session_setup
|
|
-------------------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT txid_current() as txid_with_origin \gset
|
|
SELECT x.timestamp > '-infinity'::timestamptz AS ts_low,
|
|
x.timestamp <= now() AS ts_high,
|
|
r.roname
|
|
FROM pg_last_committed_xact() x, pg_replication_origin r
|
|
WHERE r.roident = x.roident;
|
|
ts_low | ts_high | roname
|
|
--------+---------+-------------------------------
|
|
t | t | regress_commit_ts: get_origin
|
|
(1 row)
|
|
|
|
SELECT x.timestamp > '-infinity'::timestamptz AS ts_low,
|
|
x.timestamp <= now() AS ts_high,
|
|
r.roname
|
|
FROM pg_xact_commit_timestamp_origin(:'txid_with_origin') x, pg_replication_origin r
|
|
WHERE r.roident = x.roident;
|
|
ts_low | ts_high | roname
|
|
--------+---------+-------------------------------
|
|
t | t | regress_commit_ts: get_origin
|
|
(1 row)
|
|
|
|
SELECT pg_replication_origin_session_reset();
|
|
pg_replication_origin_session_reset
|
|
-------------------------------------
|
|
|
|
(1 row)
|
|
|
|
SELECT pg_replication_origin_drop('regress_commit_ts: get_origin');
|
|
pg_replication_origin_drop
|
|
----------------------------
|
|
|
|
(1 row)
|
|
|