[SCM] PostGIS branch master updated. 3.7.0beta1-165-g263a3dbf96
git at osgeo.org
git at osgeo.org
Sat Aug 1 14:58:39 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, master has been updated
via 263a3dbf965755f09b4f0a3aecc367b131641240 (commit)
via b476d614c78f4579387cb62f5e3079ac04e8cdd2 (commit)
via 8d662dd225659c5eee6ac932219cbe2ee7670624 (commit)
from b53607dc54ae72020767e27c09c7ca800921f7f1 (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 263a3dbf965755f09b4f0a3aecc367b131641240
Merge: b53607dc54 b476d614c7
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date: Sat Aug 1 14:58:38 2026 -0700
Merge pull request 'regress: compare interrupt timing to local baseline' (!619) from Komzpa/postgis:fix/interrupt-relative-timing-20260729 into master
The interrupt regression tests for GEOS relate predicates currently compare elapsed wall-clock time against fixed millisecond tolerances. Slow or loaded workers can fail that check even when PostGIS does propagate PostgreSQL cancellation into GEOS promptly.
This changes the relate interrupt checks to measure each predicate's uninterrupted runtime on the same input and same worker, then require the timeout run to finish before it reaches 90 percent of that local baseline. The assertion still fails if PostGIS stops requesting GEOS interruption, because the timed run then approaches the full uninterrupted runtime instead of stopping promptly after `statement_timeout`.
The `ST_Segmentize` and `ST_Buffer` interrupt smoke tests keep their existing absolute helper path because their uninterrupted forms are not a cheap, valid calibration target.
Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/619
commit b476d614c78f4579387cb62f5e3079ac04e8cdd2
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Wed Jul 29 19:19:26 2026 +0400
regress: keep interrupt relate input bounded
diff --git a/regress/core/interrupt_relate.sql b/regress/core/interrupt_relate.sql
index 52ead29c39..65271e5d66 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,1440) x
+ FROM generate_series(1,720) x
) foo
;
commit 8d662dd225659c5eee6ac932219cbe2ee7670624
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Wed Jul 29 02:19:22 2026 +0400
regress: compare interrupt timing to local baseline
diff --git a/NEWS b/NEWS
index 1443dee89a..2269a09052 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,9 @@ These are only changes since 3.7.0beta1.
- [liblwgeom] Reject malformed GSERIALIZED NURBS before curve
evaluation (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)
- Make the computed-columns regression test assert the query plan instead of racing two
stopwatches, so it no longer fails at random under CI load
(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 11ffb5294e..52ead29c39 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;
+$$;
BEGIN;
SET LOCAL statement_timeout TO 100;
@@ -46,7 +86,15 @@ SET LOCAL statement_timeout TO 100;
-- short-circuit described in #3226
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;
+$$;
BEGIN;
SET LOCAL statement_timeout TO 100;
@@ -54,19 +102,38 @@ SET LOCAL statement_timeout TO 100;
-- input to make it slower
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 | 83 +++++++++++++++++++++++++++++++++++----
regress/utils/timecheck.sql | 59 ++++++++++++++++++++++++++++
5 files changed, 143 insertions(+), 8 deletions(-)
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list