[SCM] PostGIS branch stable-3.5 updated. 3.5.7-101-ga3192f3232
git at osgeo.org
git at osgeo.org
Mon Aug 3 09:47:19 PDT 2026
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "PostGIS".
The branch, stable-3.5 has been updated
via a3192f3232f67d539bfcfc373c5b31d8c2175475 (commit)
via 7d75222c239c04dffac365881bd46aa1aa6bf8a1 (commit)
from 7e92bf7ad3db42ac7af27aab5f490bba757bd935 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit a3192f3232f67d539bfcfc373c5b31d8c2175475
Merge: 7e92bf7ad3 7d75222c23
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date: Mon Aug 3 09:47:17 2026 -0700
Merge pull request 'regress: compare interrupt timing to local baseline (stable-3.5)' (!661) from Komzpa/postgis:fix/interrupt-baseline-3.5-20260803 into stable-3.5
`stable-3.5` is red on the CI dashboard. Pipeline 6459, workflow `regress`, step
`test-upgrades`, fails on one test out of 170:
```
regress/core/interrupt_relate .. failed (diff expected obtained: /tmp/pgis_reg/test_125_diff)
@@ -13,4 +13,4 @@
ERROR: canceling statement due to statement timeout
-relate interrupted on time
+relate interrupted late: 00:00:00.75175 (00:00:00.22 tolerated)
```
Nothing was slow to cancel: the interrupt arrived in 752 ms against a **hard-coded**
220 ms tolerance, on a machine that was also running the rest of the suite. This is the
false failure master fixed in !619 — `_timecheck` there measures an uninterrupted
baseline on the same machine first and compares against that instead of a constant.
This is `8d662dd22` cherry-picked, with the NEWS entry moved into the 3.5.8 section and
reindented to this branch's style. The three `*_expected` files are byte-identical
between master and this branch, so the assertion text does not change — only how the
tolerance is derived.
No CI configuration is added or changed on this branch; this only stops an existing
check failing for a reason that is not PostGIS.
Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/661
commit 7d75222c239c04dffac365881bd46aa1aa6bf8a1
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Wed Jul 29 02:19:22 2026 +0400
regress: compare interrupt timing to local baseline
(cherry picked from commit 8d662dd225659c5eee6ac932219cbe2ee7670624)
diff --git a/NEWS b/NEWS
index 4319b581d9..fe80d32b15 100644
--- a/NEWS
+++ b/NEWS
@@ -29,6 +29,9 @@ PostGIS 3.5.8
cancellation state (Darafei Praliaskouski)
- GH-1160, [topology] Preserve overlay intersection boundaries when
noding lines with GEOS main (Darafei Praliaskouski)
+ - GT-619, Make interrupt regression tests compare timeout latency to
+ same-machine uninterrupted runtime, avoiding false failures under
+ slow CI load (Darafei Praliaskouski)
- GT-564, Avoid ST_MakePolygon crashes with NULL hole array entries
(Darafei Praliaskouski)
diff --git a/regress/core/interrupt.sql b/regress/core/interrupt.sql
index 78f30166e4..c9fc993b6a 100644
--- a/regress/core/interrupt.sql
+++ b/regress/core/interrupt.sql
@@ -17,4 +17,7 @@ SELECT _timecheck('segmentize', '300ms');
-- Not affected by old timeout
SELECT '1',ST_AsText(ST_Segmentize('LINESTRING(0 0,4 0)'::geometry, 2));
+DROP FUNCTION _timecheck(text);
DROP FUNCTION _timecheck(text, interval);
+DROP FUNCTION _timecheck_baseline(text);
+DROP FUNCTION _timecheck_start();
diff --git a/regress/core/interrupt_buffer.sql b/regress/core/interrupt_buffer.sql
index fd942e1e6d..204ecae936 100644
--- a/regress/core/interrupt_buffer.sql
+++ b/regress/core/interrupt_buffer.sql
@@ -29,3 +29,6 @@ SELECT _timecheck('buffer', '350ms');
SELECT '1', ST_NPoints(ST_Buffer('POINT(4 0)'::geometry, 2, 1));
DROP FUNCTION _timecheck(text, interval);
+DROP FUNCTION _timecheck(text);
+DROP FUNCTION _timecheck_baseline(text);
+DROP FUNCTION _timecheck_start();
diff --git a/regress/core/interrupt_relate.sql b/regress/core/interrupt_relate.sql
index 9df2262d71..fb29babd73 100644
--- a/regress/core/interrupt_relate.sql
+++ b/regress/core/interrupt_relate.sql
@@ -6,7 +6,7 @@ SELECT 1::int as id, ST_Collect(g) g FROM (
ST_Point(cos(radians(x)),sin(radians(270-x))),
ST_Point(sin(radians(x)),cos(radians(60-x)))
) g
- FROM generate_series(1,720) x
+ FROM generate_series(1,1440) x
) foo
;
@@ -16,29 +16,69 @@ SELECT 1::int as id, ST_Collect(g) g FROM (
-- IM9 based predicates
-----------------------------
+DO $$
+BEGIN
+ PERFORM _timecheck_start();
+ PERFORM ST_Contains(g,g) FROM _inputs WHERE id = 1;
+ PERFORM _timecheck_baseline('contains');
+END;
+$$;
+
BEGIN;
SET LOCAL statement_timeout TO 100;
select ST_Contains(g,g) from _inputs WHERE id = 1; -- 6+ seconds
ROLLBACK;
-SELECT _timecheck('contains', '220ms');
+SELECT _timecheck('contains');
+
+DO $$
+BEGIN
+ PERFORM _timecheck_start();
+ PERFORM ST_Covers(g,g) FROM _inputs WHERE id = 1;
+ PERFORM _timecheck_baseline('covers');
+END;
+$$;
BEGIN;
SET LOCAL statement_timeout TO 100;
select ST_Covers(g,g) from _inputs WHERE id = 1; -- 6+ seconds
ROLLBACK;
-SELECT _timecheck('covers', '220ms');
+SELECT _timecheck('covers');
+
+DO $$
+BEGIN
+ PERFORM _timecheck_start();
+ PERFORM ST_CoveredBy(g,g) FROM _inputs WHERE id = 1;
+ PERFORM _timecheck_baseline('coveredby');
+END;
+$$;
BEGIN;
SET LOCAL statement_timeout TO 100;
select ST_CoveredBy(g,g) from _inputs WHERE id = 1; -- 6+ seconds
ROLLBACK;
-SELECT _timecheck('coveredby', '250ms');
+SELECT _timecheck('coveredby');
+
+DO $$
+BEGIN
+ PERFORM _timecheck_start();
+ PERFORM ST_Crosses(g,g) FROM _inputs WHERE id = 1;
+ PERFORM _timecheck_baseline('crosses');
+END;
+$$;
BEGIN;
SET LOCAL statement_timeout TO 100;
select ST_Crosses(g,g) from _inputs WHERE id = 1; -- 6+ seconds
ROLLBACK;
-SELECT _timecheck('crosses', '220ms');
+SELECT _timecheck('crosses');
+
+DO $$
+BEGIN
+ PERFORM _timecheck_start();
+ PERFORM ST_Equals(g,st_reverse(g)) FROM _inputs WHERE id = 1;
+ PERFORM _timecheck_baseline('equals');
+END;
+$$;
-- NOTE: we're reversing one of the operands to avoid the
-- short-circuit described in #3226
@@ -46,7 +86,15 @@ BEGIN;
SET LOCAL statement_timeout TO 100;
select ST_Equals(g,st_reverse(g)) from _inputs WHERE id = 1; -- 6+ seconds
ROLLBACK;
-SELECT _timecheck('equals', '220ms');
+SELECT _timecheck('equals');
+
+DO $$
+BEGIN
+ PERFORM _timecheck_start();
+ PERFORM ST_Intersects(g,ST_Segmentize(g,1e-4)) FROM _inputs WHERE id = 1;
+ PERFORM _timecheck_baseline('intersects');
+END;
+$$;
-- NOTE: intersects became very fast, so we segmentize
-- input to make it slower
@@ -54,19 +102,38 @@ BEGIN;
SET LOCAL statement_timeout TO 100;
select ST_Intersects(g,ST_Segmentize(g,1e-4)) from _inputs WHERE id = 1; -- 6+ seconds
ROLLBACK;
-SELECT _timecheck('intersects', '210ms');
+SELECT _timecheck('intersects');
+
+DO $$
+BEGIN
+ PERFORM _timecheck_start();
+ PERFORM ST_Overlaps(g,g) FROM _inputs WHERE id = 1;
+ PERFORM _timecheck_baseline('overlaps');
+END;
+$$;
BEGIN;
SET LOCAL statement_timeout TO 100;
select ST_Overlaps(g,g) from _inputs WHERE id = 1; -- 6+ seconds
ROLLBACK;
-SELECT _timecheck('overlaps', '220ms');
+SELECT _timecheck('overlaps');
+
+DO $$
+BEGIN
+ PERFORM _timecheck_start();
+ PERFORM ST_Relate(g,g) FROM _inputs WHERE id = 1;
+ PERFORM _timecheck_baseline('relate');
+END;
+$$;
BEGIN;
SET LOCAL statement_timeout TO 100;
select ST_Relate(g,g) from _inputs WHERE id = 1; -- 6+ seconds
ROLLBACK;
-SELECT _timecheck('relate', '220ms');
+SELECT _timecheck('relate');
+DROP FUNCTION _timecheck(text);
DROP FUNCTION _timecheck(text, interval);
+DROP FUNCTION _timecheck_baseline(text);
+DROP FUNCTION _timecheck_start();
DROP TABLE _inputs;
diff --git a/regress/utils/timecheck.sql b/regress/utils/timecheck.sql
index 75f3bbbbd0..c28fe265e3 100644
--- a/regress/utils/timecheck.sql
+++ b/regress/utils/timecheck.sql
@@ -1,3 +1,21 @@
+CREATE FUNCTION _timecheck_start() RETURNS void
+AS $$
+BEGIN
+ UPDATE _time SET t = clock_timestamp();
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
+
+CREATE FUNCTION _timecheck_baseline(label text) RETURNS void
+AS $$
+BEGIN
+ INSERT INTO _time_baseline
+ SELECT label, clock_timestamp() - t
+ FROM _time;
+
+ UPDATE _time SET t = clock_timestamp();
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
+
CREATE FUNCTION _timecheck(label text, tolerated interval) RETURNS text
AS $$
DECLARE
@@ -37,6 +55,43 @@ BEGIN
END;
$$ LANGUAGE 'plpgsql' VOLATILE;
+CREATE FUNCTION _timecheck(label text) RETURNS text
+AS $$
+DECLARE
+ ret TEXT;
+ lap INTERVAL;
+ rec RECORD;
+BEGIN
+ -- We use now() here to get the time at the
+ -- start of the transaction, which started when
+ -- this function was called, so the earliest
+ -- possible time
+ SELECT now() - t lap, b.baseline, b.baseline * 0.9 tolerated
+ FROM _time t
+ JOIN _time_baseline b ON b.label = _timecheck.label
+ INTO rec;
+
+ RAISE DEBUG 'Uninterrupted baseline: %', rec.baseline;
+ RAISE DEBUG 'Resulting tolerance: %', rec.tolerated;
+
+ IF rec.lap < rec.tolerated THEN
+ ret := format(
+ '%s interrupted on time',
+ label
+ );
+ ELSE
+ ret := format(
+ '%s interrupted late: %s (%s tolerated)',
+ label, rec.lap, rec.tolerated
+ );
+ END IF;
+
+ UPDATE _time SET t = clock_timestamp();
+
+ RETURN ret;
+END;
+$$ LANGUAGE 'plpgsql' VOLATILE;
+
CREATE TEMPORARY TABLE _time AS
SELECT
now() t,
@@ -45,3 +100,7 @@ SELECT
'1'
)::float8 sf;
+CREATE TEMPORARY TABLE _time_baseline (
+ label text PRIMARY KEY,
+ baseline interval NOT NULL
+);
-----------------------------------------------------------------------
Summary of changes:
NEWS | 3 ++
regress/core/interrupt.sql | 3 ++
regress/core/interrupt_buffer.sql | 3 ++
regress/core/interrupt_relate.sql | 85 ++++++++++++++++++++++++++++++++++-----
regress/utils/timecheck.sql | 59 +++++++++++++++++++++++++++
5 files changed, 144 insertions(+), 9 deletions(-)
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list