[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