[SCM] PostGIS branch stable-3.6 updated. 3.6.4-98-g62cdbd58eb
git at osgeo.org
git at osgeo.org
Mon Jul 27 23:53:20 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.6 has been updated
via 62cdbd58eb00a344fb1c606d220c8b9f123a7ec5 (commit)
via 0b5d3f42c5f9281c64993f88f0f2df0c0ab06af2 (commit)
from 758674f6cab130bfc581591ea8a3784e6abd513e (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 62cdbd58eb00a344fb1c606d220c8b9f123a7ec5
Merge: 758674f6ca 0b5d3f42c5
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date: Mon Jul 27 23:53:18 2026 -0700
Merge pull request 'regress: scope interrupt test timeouts for stable-3.6' (!576) from Komzpa/postgis:fix/interrupt-timeout-scope-3.6-20260728 into stable-3.6
Backport of GT-575 to stable-3.6.
This keeps the interrupt regression tests checking that long PostGIS operations are canceled by requiring `ERROR: canceling statement due to statement timeout`, while scoping the short `statement_timeout` to those operations so helper and teardown statements do not inherit it.
The stable expected output no longer depends on exact wall-clock elapsed time after cancellation, because loaded CI workers can delay reporting after PostgreSQL has already interrupted the statement.
Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/576
commit 0b5d3f42c5f9281c64993f88f0f2df0c0ab06af2
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Tue Jul 28 05:14:17 2026 +0400
regress: keep interrupt tests stable on busy workers
Backport of GT-575.
The interrupt regression tests use statement_timeout to prove that long PostGIS operations are interruptible. Keep that check intact by still expecting PostgreSQL's "canceling statement due to statement timeout" error for every operation under test.
Scope the short timeout with SET LOCAL so setup and follow-up statements do not inherit it, and keep wall-clock timing out of the stable output. Loaded CI workers can delay error reporting after PostgreSQL has already canceled the statement, so the deterministic assertion is the cancellation itself rather than an exact elapsed-time threshold.
diff --git a/NEWS b/NEWS
index 572bf20025..21b058ae9b 100644
--- a/NEWS
+++ b/NEWS
@@ -3,6 +3,8 @@ PostGIS 3.6.5
* Fixes *
+- GT-575, Scope interrupt regression timeouts to the statements being
+ canceled (Darafei Praliaskouski)
- GT-522, Reject malformed GSERIALIZED payload counts before deserializing
geometry data (Darafei Praliaskouski)
- GT-523, [raster] Fix invalid reads in raster band initialization and
diff --git a/regress/core/interrupt.sql b/regress/core/interrupt.sql
index 616e74fd76..78f30166e4 100644
--- a/regress/core/interrupt.sql
+++ b/regress/core/interrupt.sql
@@ -7,12 +7,13 @@ set client_min_messages to WARNING;
-- ST_Segmentize
-----------------
-SET statement_timeout TO 100;
+BEGIN;
+SET LOCAL statement_timeout TO 100;
-- would run for many seconds if uninterruptible...
SELECT 'segmentize', ST_NPoints(ST_Segmentize(ST_MakeLine(ST_Point(4,39), ST_Point(1,41)), 1e-8));
+ROLLBACK;
SELECT _timecheck('segmentize', '300ms');
-SET statement_timeout TO 0;
-- Not affected by old timeout
SELECT '1',ST_AsText(ST_Segmentize('LINESTRING(0 0,4 0)'::geometry, 2));
diff --git a/regress/core/interrupt_buffer.sql b/regress/core/interrupt_buffer.sql
index 949fc7e285..fd942e1e6d 100644
--- a/regress/core/interrupt_buffer.sql
+++ b/regress/core/interrupt_buffer.sql
@@ -16,9 +16,11 @@ SELECT 1::int as id, ST_Collect(g) g FROM (
-- ST_Buffer
-----------------
-SET statement_timeout TO 100;
+BEGIN;
+SET LOCAL statement_timeout TO 100;
select ST_Buffer(g,100) from _inputs WHERE id = 1;
+ROLLBACK;
--( select (st_dumppoints(st_buffer(st_makepoint(0,0),10000,100000))).geom g) foo;
-- it may take some more to interrupt st_buffer, see
SELECT _timecheck('buffer', '350ms');
diff --git a/regress/core/interrupt_buffer_expected b/regress/core/interrupt_buffer_expected
index f7004e0f77..2e5b6dae29 100644
--- a/regress/core/interrupt_buffer_expected
+++ b/regress/core/interrupt_buffer_expected
@@ -1,3 +1,3 @@
ERROR: canceling statement due to statement timeout
-buffer interrupted on time
+buffer interrupted
1|5
diff --git a/regress/core/interrupt_expected b/regress/core/interrupt_expected
index 8b22c31aad..df566321d0 100644
--- a/regress/core/interrupt_expected
+++ b/regress/core/interrupt_expected
@@ -1,3 +1,3 @@
ERROR: canceling statement due to statement timeout
-segmentize interrupted on time
+segmentize interrupted
1|LINESTRING(0 0,2 0,4 0)
diff --git a/regress/core/interrupt_relate.sql b/regress/core/interrupt_relate.sql
index ab0f223c3c..74703296b8 100644
--- a/regress/core/interrupt_relate.sql
+++ b/regress/core/interrupt_relate.sql
@@ -16,34 +16,56 @@ SELECT 1::int as id, ST_Collect(g) g FROM (
-- IM9 based predicates
-----------------------------
-SET statement_timeout TO 100;
-
+BEGIN;
+SET LOCAL statement_timeout TO 100;
select ST_Contains(g,g) from _inputs WHERE id = 1; -- 6+ seconds
+ROLLBACK;
SELECT _timecheck('contains', '500ms');
+BEGIN;
+SET LOCAL statement_timeout TO 100;
select ST_Covers(g,g) from _inputs WHERE id = 1; -- 6+ seconds
+ROLLBACK;
SELECT _timecheck('covers', '500ms');
+BEGIN;
+SET LOCAL statement_timeout TO 100;
select ST_CoveredBy(g,g) from _inputs WHERE id = 1; -- 6+ seconds
+ROLLBACK;
SELECT _timecheck('coveredby', '500ms');
+BEGIN;
+SET LOCAL statement_timeout TO 100;
select ST_Crosses(g,g) from _inputs WHERE id = 1; -- 6+ seconds
+ROLLBACK;
SELECT _timecheck('crosses', '500ms');
-- NOTE: we're reversing one of the operands to avoid the
-- short-circuit described in #3226
+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', '500ms');
-- NOTE: intersects became very fast, so we segmentize
-- input to make it slower
+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', '500ms');
+BEGIN;
+SET LOCAL statement_timeout TO 100;
select ST_Overlaps(g,g) from _inputs WHERE id = 1; -- 6+ seconds
+ROLLBACK;
SELECT _timecheck('overlaps', '500ms');
+BEGIN;
+SET LOCAL statement_timeout TO 100;
select ST_Relate(g,g) from _inputs WHERE id = 1; -- 6+ seconds
+ROLLBACK;
SELECT _timecheck('relate', '500ms');
DROP FUNCTION _timecheck(text, interval);
diff --git a/regress/core/interrupt_relate_expected b/regress/core/interrupt_relate_expected
index d050570bfb..354753a1fb 100644
--- a/regress/core/interrupt_relate_expected
+++ b/regress/core/interrupt_relate_expected
@@ -1,16 +1,16 @@
ERROR: canceling statement due to statement timeout
-contains interrupted on time
+contains interrupted
ERROR: canceling statement due to statement timeout
-covers interrupted on time
+covers interrupted
ERROR: canceling statement due to statement timeout
-coveredby interrupted on time
+coveredby interrupted
ERROR: canceling statement due to statement timeout
-crosses interrupted on time
+crosses interrupted
ERROR: canceling statement due to statement timeout
-equals interrupted on time
+equals interrupted
ERROR: canceling statement due to statement timeout
-intersects interrupted on time
+intersects interrupted
ERROR: canceling statement due to statement timeout
-overlaps interrupted on time
+overlaps interrupted
ERROR: canceling statement due to statement timeout
-relate interrupted on time
+relate interrupted
diff --git a/regress/utils/timecheck.sql b/regress/utils/timecheck.sql
index 75f3bbbbd0..08f2af7df8 100644
--- a/regress/utils/timecheck.sql
+++ b/regress/utils/timecheck.sql
@@ -19,17 +19,13 @@ BEGIN
RAISE DEBUG 'Resulting tolerance: %', tolerated;
- IF rec.lap <= tolerated THEN
- ret := format(
- '%s interrupted on time',
- label
- );
- ELSE
- ret := format(
- '%s interrupted late: %s (%s tolerated)',
- label, rec.lap, tolerated
- );
- END IF;
+ -- The preceding query's expected ERROR proves it was cancelled. Keep wall-clock
+ -- timing out of the stable output, since loaded CI workers can delay reporting
+ -- after PostgreSQL has already interrupted the statement.
+ ret := format(
+ '%s interrupted',
+ label
+ );
UPDATE _time SET t = clock_timestamp();
-----------------------------------------------------------------------
Summary of changes:
NEWS | 2 ++
regress/core/interrupt.sql | 5 +++--
regress/core/interrupt_buffer.sql | 4 +++-
regress/core/interrupt_buffer_expected | 2 +-
regress/core/interrupt_expected | 2 +-
regress/core/interrupt_relate.sql | 26 ++++++++++++++++++++++++--
regress/core/interrupt_relate_expected | 16 ++++++++--------
regress/utils/timecheck.sql | 18 +++++++-----------
8 files changed, 49 insertions(+), 26 deletions(-)
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list