[SCM] PostGIS branch master updated. 3.7.0beta1-95-g9251ab450b
git at osgeo.org
git at osgeo.org
Mon Jul 27 14:18:43 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 9251ab450b2b0b6e98f0c6e85855b0e4f48fd2df (commit)
via 4a59f153d2509cb7d448bf583dce34bd8c34d3a5 (commit)
via a724746d828853569fa3dae1d7c13e469879c905 (commit)
via 22c5288d1ba278686777d5f833066a4887bc36e7 (commit)
via 865ad8e27cd187fa40356207a3919107241f7d32 (commit)
via 670c01b283b8522f4a918ea3eb5e77c077c66623 (commit)
via cd96d934a25f0d2814f0441b565edad1c48ed811 (commit)
from 7455b1db34856e3de8c24f0d265ed6cd52c0aded (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 9251ab450b2b0b6e98f0c6e85855b0e4f48fd2df
Merge: 7455b1db34 4a59f153d2
Author: Darafei Praliaskouski <komzpa at gmail.com>
Date: Mon Jul 27 14:18:42 2026 -0700
Merge pull request 'ci: add Woodie portability matrix' (!516) from Komzpa/postgis:codex/woodie-portability into master
Reviewed-on: https://gitea.osgeo.org/postgis/postgis/pulls/516
commit 4a59f153d2509cb7d448bf583dce34bd8c34d3a5
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Mon Jul 27 15:41:16 2026 +0400
Make regression outputs endian-neutral
diff --git a/.woodpecker/portability.yml b/.woodpecker/portability.yml
index 1d6773ddb0..2a68a7df3e 100644
--- a/.woodpecker/portability.yml
+++ b/.woodpecker/portability.yml
@@ -79,6 +79,8 @@ variables:
$${SRCDIR}/regress/core/wkb \
$${SRCDIR}/regress/core/twkb \
$${SRCDIR}/regress/core/sql-mm-serialize \
+ $${SRCDIR}/regress/core/curvetoline \
+ $${SRCDIR}/regress/core/geography_centroid \
$${SRCDIR}/regress/core/in_geojson \
$${SRCDIR}/regress/core/out_geojson \
$${SRCDIR}/regress/core/in_gml \
@@ -88,6 +90,12 @@ variables:
$${SRCDIR}/regress/core/in_flatgeobuf \
$${SRCDIR}/regress/core/out_flatgeobuf \
$${SRCDIR}/regress/core/flatgeobuf \
+ $${SRCDIR}/regress/core/setpoint \
+ $${SRCDIR}/regress/core/tickets \
+ $${SRCDIR}/regress/core/nurbs_wkt \
+ $${SRCDIR}/regress/core/mvt \
+ $${SRCDIR}/regress/loader/LongOptions \
+ $${SRCDIR}/regress/loader/TestANALYZE \
$${SRCDIR}/raster/test/regress/check_gdal \
$${SRCDIR}/raster/test/regress/loader/load_outdb \
$${SRCDIR}/raster/test/regress/rt_bytea \
diff --git a/regress/core/curvetoline.sql b/regress/core/curvetoline.sql
index ac7e117923..10b2359e39 100644
--- a/regress/core/curvetoline.sql
+++ b/regress/core/curvetoline.sql
@@ -60,4 +60,4 @@ SELECT 'multiarc1.maxerr20.sym', ST_AsText(ST_SnapToGrid(ST_CurveToLine(
1 -- Symmetric
), 2));
-SELECT 'ST_CurveToLine EMPTY', ST_CurveToLine('CIRCULARSTRING EMPTY');
+SELECT 'ST_CurveToLine EMPTY', ST_AsHEXEWKB(ST_CurveToLine('CIRCULARSTRING EMPTY'), 'NDR');
diff --git a/regress/core/geography_centroid.sql b/regress/core/geography_centroid.sql
index 077a64ce26..bcd81f57e6 100644
--- a/regress/core/geography_centroid.sql
+++ b/regress/core/geography_centroid.sql
@@ -16,7 +16,7 @@ FROM
) AS u(c, g), geometry(ST_Centroid(g::geography)) AS gc(geom);
-- point should return itself
-SELECT c, ST_Centroid(g::geography) FROM
+SELECT c, ST_AsHEXEWKB(ST_Centroid(g::geography)::geometry, 'NDR') FROM
( VALUES
('geog_centroid_pt_self_1', 'POINT ( 4 8)'),
('geog_centroid_pt_self_2', 'POINT ( -15 16)'),
diff --git a/regress/core/in_geojson.sql b/regress/core/in_geojson.sql
index cc4a34c838..c7333a90d7 100644
--- a/regress/core/in_geojson.sql
+++ b/regress/core/in_geojson.sql
@@ -14,8 +14,8 @@ select '#1434.1',ST_GeomFromGeoJSON('{ "type": "Point", "crashme": [100.0, 0.0]
select '#1434.2',ST_GeomFromGeoJSON('crashme');;
select '#1434.3',ST_GeomFromGeoJSON('');
select '#1434.4',ST_GeomFromGeoJSON('{}');
-select '#1434.5',ST_GeomFromGeoJSON('{"type":"Point","coordinates":[]}');
-select '#1434.6',ST_GeomFromGeoJSON('{"type":"MultiPoint","coordinates":[[]]}');
+select '#1434.5', ST_AsHEXEWKB(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[]}'), 'NDR');
+select '#1434.6', ST_AsHEXEWKB(ST_GeomFromGeoJSON('{"type":"MultiPoint","coordinates":[[]]}'), 'NDR');
select '#1434.7',ST_GeomFromGeoJSON('{"type":"MultiPoint"}');
select '#1434.8',ST_GeomFromGeoJSON('{"type":"Point"}');
diff --git a/regress/core/mvt.sql b/regress/core/mvt.sql
index 581e527df7..1fb341fa91 100644
--- a/regress/core/mvt.sql
+++ b/regress/core/mvt.sql
@@ -534,7 +534,7 @@ SELECT 'TA13', encode(ST_AsMVT(q, 'test', 4096, 'geom'), 'base64') FROM (
-- Extra geometry as parameter (casted as string)
SELECT 'TA14', encode(ST_AsMVT(q, 'test', 4096, 'geom'), 'base64') FROM
(
- SELECT geom, St_Expand(geom, 10) as other_geom FROM
+ SELECT geom, ST_AsHEXEWKB(ST_Expand(geom, 10), 'NDR') as other_geom FROM
(
SELECT 'SRID=3857;MULTILINESTRING((105209.784484008 5267849.91657293,102374.204885822 5266414.05020624,99717.9874419115 5267379.35282178,90157.5689699989 5266091.78724987,86186.0622890498 5271349.34154337,78713.0972659854 5272871.78773217,76281.8581230672 5277951.00736649,81783.372341432 5289800.59747023))'::geometry as geom
) _sq
diff --git a/regress/core/nurbs_wkt.sql b/regress/core/nurbs_wkt.sql
index b1d4902ce9..7badfd7fd9 100644
--- a/regress/core/nurbs_wkt.sql
+++ b/regress/core/nurbs_wkt.sql
@@ -1,55 +1,55 @@
-SELECT 1, ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10))');
-SELECT 2, ST_GeomFromText('NURBSCURVE(1, (0 0, 5 5, 10 0))');
-SELECT 3, ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10), (1, 1))');
-SELECT 4, ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10), (0.5, 2.0))');
-SELECT 5, ST_GeomFromText('NURBSCURVE(1, (0 0, 5 5, 10 0), (1, 1.5, 1))');
-SELECT 6, ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10), (1, 1), (0, 0, 1, 1))');
-SELECT 7, ST_GeomFromText('NURBSCURVE(1, (0 0, 5 5, 10 0), (1, 1, 1), (0, 0, 0.5, 1, 1))');
-SELECT 8, ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0))');
-SELECT 9, ST_GeomFromText('NURBSCURVE(2, (1 0, 1 1, 0 1))');
-SELECT 10, ST_GeomFromText('NURBSCURVE(2, (-5 -5, 0 10, 5 -5))');
-SELECT 11, ST_GeomFromText('NURBSCURVE(2, (0 0, 2 8, 8 2, 10 10))');
-SELECT 12, ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (1, 1, 1))');
-SELECT 13, ST_GeomFromText('NURBSCURVE(2, (1 0, 1 1, 0 1), (1, 0.5, 1))');
-SELECT 14, ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (1, 3, 1))');
-SELECT 15, ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (0.5, 1, 0.5))');
-SELECT 16, ST_GeomFromText('NURBSCURVE(2, (0.5 0.25, 2.75 5.5, 5.0 0.25), (1, 1.5, 1))');
-SELECT 17, ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (1, 1, 1), (0, 0, 0, 1, 1, 1))');
-SELECT 18, ST_GeomFromText('NURBSCURVE(2, (1 0, 1 1, 0 1), (1, 0.5, 1), (0, 0, 0, 1, 1, 1))');
-SELECT 19, ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0))');
-SELECT 20, ST_GeomFromText('NURBSCURVE(3, (0 0, 2 8, 5 12, 8 8, 10 0))');
-SELECT 21, ST_GeomFromText('NURBSCURVE(3, (5 0, 10 2.5, 10 7.5, 5 10, 0 7.5, 0 2.5, 5 0))');
-SELECT 22, ST_GeomFromText('NURBSCURVE(3, (0 0, 5 5, 10 0, 15 -5, 20 0))');
-SELECT 23, ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 1, 1, 1))');
-SELECT 24, ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 2, 2, 1))');
-SELECT 25, ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (0.5, 1.5, 2.0, 0.8))');
-SELECT 26, ST_GeomFromText('NURBSCURVE(3, (0 0, 2 8, 5 12, 8 8, 10 0), (1, 3, 5, 3, 1))');
-SELECT 27, ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 1, 1, 1), (0, 0, 0, 0, 1, 1, 1, 1))');
-SELECT 28, ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 2, 2, 1), (0, 0, 0, 0, 1, 1, 1, 1))');
-SELECT 29, ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 1, 1, 1), (0, 0, 0, 0, 0.3, 0.7, 1, 1))');
-SELECT 30, ST_GeomFromText('NURBSCURVE(4, (0 0, 2 8, 5 12, 8 8, 10 0))');
-SELECT 31, ST_GeomFromText('NURBSCURVE(4, (0 0, 1 5, 3 8, 7 6, 10 10, 12 0))');
-SELECT 32, ST_GeomFromText('NURBSCURVE(4, (0 0, 2 8, 5 12, 8 8, 10 0), (1, 1.5, 2, 1.5, 1))');
-SELECT 33, ST_GeomFromText('NURBSCURVE(4, (0 0, 2 8, 5 12, 8 8, 10 0), (1, 1, 1, 1, 1), (0, 0, 0, 0, 0, 1, 1, 1, 1, 1))');
-SELECT 34, ST_GeomFromText('NURBSCURVE(5, (0 0, 1 2, 3 4, 5 6, 7 4, 8 2, 10 0), (1, 1, 1, 1, 1, 1, 1))');
-SELECT 35, ST_GeomFromText('NURBSCURVE Z(1, (0 0 0, 10 10 5))');
-SELECT 36, ST_GeomFromText('NURBSCURVE Z(2, (0 0 0, 5 10 5, 10 0 0))');
-SELECT 37, ST_GeomFromText('NURBSCURVE Z(2, (0 0 0, 5 10 5, 10 0 0), (1, 2, 1))');
-SELECT 38, ST_GeomFromText('NURBSCURVE Z(3, (0 0 0, 3 10 3, 7 10 7, 10 0 10))');
-SELECT 39, ST_GeomFromText('NURBSCURVE Z(3, (0 0 0, 3 10 3, 7 10 7, 10 0 10), (1, 1.5, 1.5, 1), (0, 0, 0, 0, 1, 1, 1, 1))');
-SELECT 40, ST_GeomFromText('NURBSCURVE M(1, (0 0 0, 10 10 3600))');
-SELECT 41, ST_GeomFromText('NURBSCURVE M(2, (0 0 0, 5 10 1800, 10 0 3600))');
-SELECT 42, ST_GeomFromText('NURBSCURVE M(2, (0 0 0, 5 10 1800, 10 0 3600), (1, 2, 1))');
-SELECT 43, ST_GeomFromText('NURBSCURVE ZM(1, (0 0 0 0, 10 10 5 3600))');
-SELECT 44, ST_GeomFromText('NURBSCURVE ZM(2, (0 0 0 0, 5 10 5 1800, 10 0 0 3600))');
-SELECT 45, ST_GeomFromText('NURBSCURVE ZM(2, (0 0 0 0, 5 10 5 1800, 10 0 0 3600), (1, 2, 1))');
-SELECT 46, ST_GeomFromText('NURBSCURVE ZM(3, (0 0 0 0, 3 10 3 1200, 7 10 7 2400, 10 0 10 3600), (1, 1.5, 1.5, 1), (0, 0, 0, 0, 1, 1, 1, 1))');
-SELECT 47, ST_GeomFromText('NURBSCURVE(2, (1 0, 1 1, 0 1), (1, 0.5, 1), (0, 0, 0, 1, 1, 1))');
-SELECT 48, ST_GeomFromText('NURBSCURVE(2, (2 0, 2 1, 0 1), (1, 0.5, 1), (0, 0, 0, 1, 1, 1))');
-SELECT 49, ST_GeomFromText('NURBSCURVE(2, (0 0, 1 1, 2 0), (1, 1, 1), (0, 0, 0, 1, 1, 1))');
-SELECT 50, ST_GeomFromText('NURBSCURVE(2, (0 0, 5 5, 10 0))');
-SELECT 51, ST_GeomFromText('NURBSCURVE(2, (0 0, 1 2, 2 1, 3 3, 4 2, 5 4, 6 3, 7 5, 8 4, 9 6, 10 5))');
-SELECT 52, ST_GeomFromText('NURBSCURVE(DEGREE 2, CONTROLPOINTS (NURBSPOINT(WEIGHTEDPOINT(0 0), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10), WEIGHT 2), NURBSPOINT(WEIGHTEDPOINT(10 0), WEIGHT 1)), KNOTS (KNOT(0,3), KNOT(1,3)))');
+SELECT 1, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10))'), 'NDR');
+SELECT 2, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(1, (0 0, 5 5, 10 0))'), 'NDR');
+SELECT 3, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10), (1, 1))'), 'NDR');
+SELECT 4, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10), (0.5, 2.0))'), 'NDR');
+SELECT 5, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(1, (0 0, 5 5, 10 0), (1, 1.5, 1))'), 'NDR');
+SELECT 6, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(1, (0 0, 10 10), (1, 1), (0, 0, 1, 1))'), 'NDR');
+SELECT 7, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(1, (0 0, 5 5, 10 0), (1, 1, 1), (0, 0, 0.5, 1, 1))'), 'NDR');
+SELECT 8, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0))'), 'NDR');
+SELECT 9, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (1 0, 1 1, 0 1))'), 'NDR');
+SELECT 10, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (-5 -5, 0 10, 5 -5))'), 'NDR');
+SELECT 11, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 2 8, 8 2, 10 10))'), 'NDR');
+SELECT 12, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (1, 1, 1))'), 'NDR');
+SELECT 13, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (1 0, 1 1, 0 1), (1, 0.5, 1))'), 'NDR');
+SELECT 14, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (1, 3, 1))'), 'NDR');
+SELECT 15, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (0.5, 1, 0.5))'), 'NDR');
+SELECT 16, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0.5 0.25, 2.75 5.5, 5.0 0.25), (1, 1.5, 1))'), 'NDR');
+SELECT 17, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 5 10, 10 0), (1, 1, 1), (0, 0, 0, 1, 1, 1))'), 'NDR');
+SELECT 18, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (1 0, 1 1, 0 1), (1, 0.5, 1), (0, 0, 0, 1, 1, 1))'), 'NDR');
+SELECT 19, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0))'), 'NDR');
+SELECT 20, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 2 8, 5 12, 8 8, 10 0))'), 'NDR');
+SELECT 21, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (5 0, 10 2.5, 10 7.5, 5 10, 0 7.5, 0 2.5, 5 0))'), 'NDR');
+SELECT 22, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 5 5, 10 0, 15 -5, 20 0))'), 'NDR');
+SELECT 23, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 1, 1, 1))'), 'NDR');
+SELECT 24, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 2, 2, 1))'), 'NDR');
+SELECT 25, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (0.5, 1.5, 2.0, 0.8))'), 'NDR');
+SELECT 26, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 2 8, 5 12, 8 8, 10 0), (1, 3, 5, 3, 1))'), 'NDR');
+SELECT 27, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 1, 1, 1), (0, 0, 0, 0, 1, 1, 1, 1))'), 'NDR');
+SELECT 28, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 2, 2, 1), (0, 0, 0, 0, 1, 1, 1, 1))'), 'NDR');
+SELECT 29, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(3, (0 0, 3 10, 7 10, 10 0), (1, 1, 1, 1), (0, 0, 0, 0, 0.3, 0.7, 1, 1))'), 'NDR');
+SELECT 30, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(4, (0 0, 2 8, 5 12, 8 8, 10 0))'), 'NDR');
+SELECT 31, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(4, (0 0, 1 5, 3 8, 7 6, 10 10, 12 0))'), 'NDR');
+SELECT 32, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(4, (0 0, 2 8, 5 12, 8 8, 10 0), (1, 1.5, 2, 1.5, 1))'), 'NDR');
+SELECT 33, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(4, (0 0, 2 8, 5 12, 8 8, 10 0), (1, 1, 1, 1, 1), (0, 0, 0, 0, 0, 1, 1, 1, 1, 1))'), 'NDR');
+SELECT 34, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(5, (0 0, 1 2, 3 4, 5 6, 7 4, 8 2, 10 0), (1, 1, 1, 1, 1, 1, 1))'), 'NDR');
+SELECT 35, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE Z(1, (0 0 0, 10 10 5))'), 'NDR');
+SELECT 36, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE Z(2, (0 0 0, 5 10 5, 10 0 0))'), 'NDR');
+SELECT 37, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE Z(2, (0 0 0, 5 10 5, 10 0 0), (1, 2, 1))'), 'NDR');
+SELECT 38, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE Z(3, (0 0 0, 3 10 3, 7 10 7, 10 0 10))'), 'NDR');
+SELECT 39, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE Z(3, (0 0 0, 3 10 3, 7 10 7, 10 0 10), (1, 1.5, 1.5, 1), (0, 0, 0, 0, 1, 1, 1, 1))'), 'NDR');
+SELECT 40, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE M(1, (0 0 0, 10 10 3600))'), 'NDR');
+SELECT 41, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE M(2, (0 0 0, 5 10 1800, 10 0 3600))'), 'NDR');
+SELECT 42, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE M(2, (0 0 0, 5 10 1800, 10 0 3600), (1, 2, 1))'), 'NDR');
+SELECT 43, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE ZM(1, (0 0 0 0, 10 10 5 3600))'), 'NDR');
+SELECT 44, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE ZM(2, (0 0 0 0, 5 10 5 1800, 10 0 0 3600))'), 'NDR');
+SELECT 45, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE ZM(2, (0 0 0 0, 5 10 5 1800, 10 0 0 3600), (1, 2, 1))'), 'NDR');
+SELECT 46, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE ZM(3, (0 0 0 0, 3 10 3 1200, 7 10 7 2400, 10 0 10 3600), (1, 1.5, 1.5, 1), (0, 0, 0, 0, 1, 1, 1, 1))'), 'NDR');
+SELECT 47, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (1 0, 1 1, 0 1), (1, 0.5, 1), (0, 0, 0, 1, 1, 1))'), 'NDR');
+SELECT 48, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (2 0, 2 1, 0 1), (1, 0.5, 1), (0, 0, 0, 1, 1, 1))'), 'NDR');
+SELECT 49, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 1 1, 2 0), (1, 1, 1), (0, 0, 0, 1, 1, 1))'), 'NDR');
+SELECT 50, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 5 5, 10 0))'), 'NDR');
+SELECT 51, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(2, (0 0, 1 2, 2 1, 3 3, 4 2, 5 4, 6 3, 7 5, 8 4, 9 6, 10 5))'), 'NDR');
+SELECT 52, ST_AsHEXEWKB(ST_GeomFromText('NURBSCURVE(DEGREE 2, CONTROLPOINTS (NURBSPOINT(WEIGHTEDPOINT(0 0), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10), WEIGHT 2), NURBSPOINT(WEIGHTEDPOINT(10 0), WEIGHT 1)), KNOTS (KNOT(0,3), KNOT(1,3)))'), 'NDR');
SELECT 53, ST_AsText(ST_GeomFromText('MULTICURVE Z (NURBSCURVE Z (2, (0 0 0, 5 10 5, 10 0 0)))'));
SELECT 54, ST_AsEWKT(ST_GeomFromText('NURBSCURVE(DEGREE 2, CONTROLPOINTS M (NURBSPOINT(WEIGHTEDPOINT(0 0 0), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10 1800), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(10 0 3600), WEIGHT 1)), KNOTS (KNOT(0,3), KNOT(1,3)))'));
SELECT 55, ST_AsEWKT(ST_GeomFromText('NURBSCURVE(DEGREE 2, CONTROLPOINTS ZM (NURBSPOINT(WEIGHTEDPOINT(0 0 0 0), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(5 10 5 1800), WEIGHT 1), NURBSPOINT(WEIGHTEDPOINT(10 0 0 3600), WEIGHT 1)), KNOTS (KNOT(0,3), KNOT(1,3)))'));
diff --git a/regress/core/setpoint.sql b/regress/core/setpoint.sql
index bb0ae4e569..db034d4716 100644
--- a/regress/core/setpoint.sql
+++ b/regress/core/setpoint.sql
@@ -27,7 +27,7 @@ SELECT ST_asewkt(ST_SetPoint('LINESTRING(0 0 0 0, 1 1 1 1, 2 2 2 2, 4 4 4 4)', 1
SELECT ST_asewkt(ST_SetPoint('LINESTRING(0 0 0 0, 1 1 1 1, 2 2 2 2, 4 4 4 4)', 0, 'POINT(90 91 92 93)'));
-- https://trac.osgeo.org/postgis/ticket/5319
-SELECT '#5319', ST_SetPoint('0102000020E610000005000000000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F'::geometry, 1,ST_GeomFromText('POINT(0 0)',4326) ) As result;
+SELECT '#5319', ST_AsHEXEWKB(ST_SetPoint('0102000020E610000005000000000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F000000000000F07F'::geometry, 1,ST_GeomFromText('POINT(0 0)',4326) ), 'NDR') AS result;
-- https://trac.osgeo.org/postgis/ticket/5610 (NaN check)
SELECT '#5610', lower(ST_AsText(ST_SetPoint(
diff --git a/regress/core/tickets.sql b/regress/core/tickets.sql
index cf80a0d25f..dd22ce5a04 100644
--- a/regress/core/tickets.sql
+++ b/regress/core/tickets.sql
@@ -1377,15 +1377,15 @@ WITH geom AS (
union all
SELECT 'TRIANGLE EMPTY'::geometry geom
)
-select '#4399', 'ST_AsBinary', ST_AsBinary(geom)::text from geom
+select '#4399', 'ST_AsBinary', ST_AsBinary(geom, 'NDR')::text from geom
union all
-select '#4399', 'ST_AsEWKB', ST_AsEWKB(geom)::text from geom
+select '#4399', 'ST_AsEWKB', ST_AsEWKB(geom, 'NDR')::text from geom
union all
select '#4399', 'ST_AsEWKT', ST_AsEWKT(geom)::text from geom
union all
select '#4399', 'ST_AsGML', ST_AsGML(3,geom)::text from geom
union all
-select '#4399', 'ST_AsHEXEWKB', ST_AsHEXEWKB(geom)::text from geom
+select '#4399', 'ST_AsHEXEWKB', ST_AsHEXEWKB(geom, 'NDR')::text from geom
union all
select '#4399', 'ST_AsKML', ST_AsKML(ST_SetSRID(geom, 4326))::text from geom
union all
@@ -1803,7 +1803,7 @@ CREATE TABLE fault6028 (fid integer, geom geometry(Polygon,5015));
CREATE INDEX fault6028_x ON fault6028 USING GIST (geom);
INSERT INTO fault6028 (fid, geom)
VALUES (1, '0103000020971300000100000000000000'::GEOMETRY);
-SELECT * FROM fault6028;
+SELECT fid, ST_AsHEXEWKB(geom, 'NDR') FROM fault6028;
DROP TABLE IF EXISTS fault6028;
-- #5357
diff --git a/regress/loader/LongOptions.sql.expected.bigendian b/regress/loader/LongOptions.sql.expected.bigendian
new file mode 100644
index 0000000000..1d1f11d442
--- /dev/null
+++ b/regress/loader/LongOptions.sql.expected.bigendian
@@ -0,0 +1,10 @@
+SET CLIENT_ENCODING TO UTF8;
+SET STANDARD_CONFORMING_STRINGS TO ON;
+DROP TABLE IF EXISTS "loadedshp";
+CREATE TABLE IF NOT EXISTS "loadedshp" ("gid" serial PRIMARY KEY,
+"the_geom" geometry(POINT,0));
+INSERT INTO "loadedshp" (the_geom) VALUES ('000000000100000000000000003FF0000000000000');
+INSERT INTO "loadedshp" (the_geom) VALUES ('00000000014022000000000000BFF0000000000000');
+INSERT INTO "loadedshp" (the_geom) VALUES ('00000000014022000000000000BFF0000000000000');
+CREATE INDEX IF NOT EXISTS "loadedshp_the_geom_gist" ON "loadedshp" USING GIST ("the_geom");
+ANALYZE "loadedshp";
diff --git a/regress/loader/TestANALYZE.sql.expected.bigendian b/regress/loader/TestANALYZE.sql.expected.bigendian
new file mode 100644
index 0000000000..a571168ca9
--- /dev/null
+++ b/regress/loader/TestANALYZE.sql.expected.bigendian
@@ -0,0 +1,12 @@
+SET CLIENT_ENCODING TO UTF8;
+SET STANDARD_CONFORMING_STRINGS TO ON;
+BEGIN;
+CREATE TABLE "loadedshp" ("gid" serial,
+"the_geom" geometry(POINT,0));
+ALTER TABLE "loadedshp" ADD PRIMARY KEY ("gid");
+INSERT INTO "loadedshp" (the_geom) VALUES ('000000000100000000000000003FF0000000000000');
+INSERT INTO "loadedshp" (the_geom) VALUES ('00000000014022000000000000BFF0000000000000');
+INSERT INTO "loadedshp" (the_geom) VALUES ('00000000014022000000000000BFF0000000000000');
+CREATE INDEX ON "loadedshp" USING GIST ("the_geom");
+COMMIT;
+ANALYZE "loadedshp";
diff --git a/regress/run_test.pl b/regress/run_test.pl
index 2e1c625f5f..11988970eb 100755
--- a/regress/run_test.pl
+++ b/regress/run_test.pl
@@ -22,6 +22,8 @@ use Cwd 'abs_path';
use Getopt::Long;
use strict;
+my $RUNNING_BIGENDIAN = unpack("S", pack("n", 1)) == 1;
+
##################################################################
# Add . to @INC if removed for CVE-2016-1238
##################################################################
@@ -1043,6 +1045,15 @@ sub run_simple_test
return 1;
}
+sub endian_expected_file
+{
+ my $expected = shift;
+ my $bigendian_expected = "${expected}.bigendian";
+
+ return $bigendian_expected if ( $RUNNING_BIGENDIAN && -r $bigendian_expected );
+ return $expected;
+}
+
##################################################################
# This runs the loader once and checks the output of it.
# It will NOT run if neither the expected SQL nor the expected
@@ -1093,6 +1104,7 @@ sub run_loader_and_check_output
if ( -r $expected_sql_file )
{
show_progress();
+ $expected_sql_file = endian_expected_file($expected_sql_file);
my $diff = diff($expected_sql_file, $outfile);
if ( $diff )
{
commit a724746d828853569fa3dae1d7c13e469879c905
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Mon Jul 27 12:04:04 2026 +0400
ci: expand s390x serialization coverage
diff --git a/.woodpecker/portability.yml b/.woodpecker/portability.yml
index 4d28feed4a..1d6773ddb0 100644
--- a/.woodpecker/portability.yml
+++ b/.woodpecker/portability.yml
@@ -80,10 +80,20 @@ variables:
$${SRCDIR}/regress/core/twkb \
$${SRCDIR}/regress/core/sql-mm-serialize \
$${SRCDIR}/regress/core/in_geojson \
+ $${SRCDIR}/regress/core/out_geojson \
+ $${SRCDIR}/regress/core/in_gml \
+ $${SRCDIR}/regress/core/out_gml \
+ $${SRCDIR}/regress/core/in_kml \
+ $${SRCDIR}/regress/core/in_geohash \
+ $${SRCDIR}/regress/core/in_flatgeobuf \
+ $${SRCDIR}/regress/core/out_flatgeobuf \
+ $${SRCDIR}/regress/core/flatgeobuf \
$${SRCDIR}/raster/test/regress/check_gdal \
$${SRCDIR}/raster/test/regress/loader/load_outdb \
$${SRCDIR}/raster/test/regress/rt_bytea \
$${SRCDIR}/raster/test/regress/rt_wkb \
+ $${SRCDIR}/raster/test/regress/rt_fromgdalraster \
+ $${SRCDIR}/raster/test/regress/rt_asgdalraster \
$${SRCDIR}/raster/test/regress/rt_band \
$${SRCDIR}/raster/test/regress/clean"
echo "portability tier $${PORTABILITY_TIER} completed in $$(($$(date +%s) - $${PORTABILITY_STARTED}))s"
commit 22c5288d1ba278686777d5f833066a4887bc36e7
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Mon Jul 27 04:34:06 2026 +0400
ci: pin armhf portability image digest
diff --git a/.woodpecker/portability.yml b/.woodpecker/portability.yml
index 117ded8b7a..4d28feed4a 100644
--- a/.woodpecker/portability.yml
+++ b/.woodpecker/portability.yml
@@ -6,8 +6,11 @@ when:
# This workflow keeps the existing amd64 CI honest by attacking ABI properties
# that normal amd64 builds cannot falsify.
#
-# Tier 1: armhf via arm32v7/debian under QEMU. This mirrors berrie: 32-bit
-# pointers and long, unsigned char, and stricter alignment than amd64.
+# Tier 1: armhf via arm32v7/debian under QEMU. The step pins the arm/v7
+# manifest digest because the Docker backend does not pass a per-step platform
+# override; a tag-only pull from an amd64 daemon asks Docker Hub for an amd64
+# variant and fails before QEMU can run. This mirrors berrie: 32-bit pointers
+# and long, unsigned char, and stricter alignment than amd64.
#
# Tier 2: s390x via s390x/debian under QEMU. This is the practical big-endian
# target for WKB/EWKB, TWKB, raster byte order, hashes, and integer memcpy paths.
@@ -125,7 +128,7 @@ steps:
- *build-and-test
armhf-berrie-qemu:
- image: arm32v7/debian:trixie
+ image: arm32v7/debian at sha256:743aca1ad24c5e48132df88f561f8d1365bfb6da33e006eb44b44fe32a7a30eb
pull: true
commands:
- uname -m | grep -E '^(armv7l|armv8l)$'
commit 865ad8e27cd187fa40356207a3919107241f7d32
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Sun Jul 26 21:15:26 2026 +0400
ci: run portability checks in foreign images
diff --git a/.woodpecker/portability.yml b/.woodpecker/portability.yml
index 698240218d..117ded8b7a 100644
--- a/.woodpecker/portability.yml
+++ b/.woodpecker/portability.yml
@@ -20,9 +20,8 @@ when:
# the big-endian and unsigned-char parts of the bug class.
#
# QEMU depends on persistent binfmt_misc registrations on the amd64 Woodie agent
-# host. The host should be provisioned with Debian qemu-user, qemu-user-binfmt,
-# and binfmt-support so the handlers are available without privileged pipeline
-# steps. This workflow fails early instead of hiding that infrastructure gap.
+# host. Woodpecker starts the foreign-architecture step image directly; steps do
+# not need a Docker socket or a nested docker run probe.
variables:
native-image: &native-image repo.osgeo.org/postgis/build-test:debian13
prepare-debian: &prepare-debian |
@@ -94,47 +93,6 @@ clone:
partial: false
steps:
- preflight-binfmt:
- image: debian:trixie
- pull: true
- commands:
- - |
- export DEBIAN_FRONTEND=noninteractive
- dpkg --add-architecture armhf
- dpkg --add-architecture s390x
- apt-get update
- mkdir -p "$${CI_WORKSPACE}/.tmp/binfmt-preflight"
-
- check_foreign_uname() {
- arch="$1"
- expected_re="$2"
- platform="$3"
- root="$${CI_WORKSPACE}/.tmp/binfmt-preflight/$${arch}"
- mkdir -p "$${root}"
- apt-get download "busybox-static:$${arch}"
- deb="$$(ls -1 busybox-static_*_$${arch}.deb | tail -n 1)"
- dpkg-deb -x "$${deb}" "$${root}"
-
- if ! output="$$("$${root}/bin/busybox" uname -m 2>&1)"; then
- echo "Woodie agent host cannot execute $${arch} binaries through binfmt_misc/QEMU."
- echo "Install Debian packages on the amd64 agent host: qemu-user qemu-user-binfmt binfmt-support."
- echo "Agent operator check: docker run --rm --platform=$${platform} debian:trixie uname -m"
- echo "Observed error: $${output}"
- exit 1
- fi
-
- if ! printf '%s\n' "$${output}" | grep -Eq "$${expected_re}"; then
- echo "Woodie agent host executed $${arch}, but uname -m returned unexpected value: $${output}"
- echo "Agent operator check: docker run --rm --platform=$${platform} debian:trixie uname -m"
- exit 1
- fi
-
- echo "$${arch} foreign execution ok: uname -m -> $${output}"
- }
- check_foreign_uname armhf '^(armv7l|armv8l)$' linux/arm/v7
- check_foreign_uname s390x '^s390x$' linux/s390x
- echo "Debian Ports powerpc remains blocked until a maintained OCI image or OSGeo-hosted rootfs exists"
-
native-unsigned-char:
image: *native-image
pull: true
@@ -169,8 +127,8 @@ steps:
armhf-berrie-qemu:
image: arm32v7/debian:trixie
pull: true
- depends_on: preflight-binfmt
commands:
+ - uname -m | grep -E '^(armv7l|armv8l)$'
- export PORTABILITY_TIER=armhf-berrie-qemu
- export PORTABILITY_CFLAGS="-O2 -Wall -Werror -fno-omit-frame-pointer"
- *prepare-debian
@@ -182,7 +140,6 @@ steps:
s390x-big-endian-qemu:
image: s390x/debian:trixie
pull: true
- depends_on: preflight-binfmt
failure: ignore
# s390x is the only realistic big-endian coverage. It is intentionally not
# run on every pull request: QEMU plus the geospatial dependency closure is
@@ -195,6 +152,7 @@ steps:
branch: master
- event: tag
commands:
+ - uname -m | grep -E '^s390x$'
- export PORTABILITY_TIER=s390x-big-endian-qemu
- export PORTABILITY_CFLAGS="-O2 -Wall -Werror -fno-omit-frame-pointer"
- *prepare-debian
commit 670c01b283b8522f4a918ea3eb5e77c077c66623
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Sun Jul 26 05:43:01 2026 +0400
ci: explain missing Woodie portability binfmt setup
diff --git a/.woodpecker/portability.yml b/.woodpecker/portability.yml
index 114d384456..698240218d 100644
--- a/.woodpecker/portability.yml
+++ b/.woodpecker/portability.yml
@@ -19,10 +19,10 @@ when:
# OSGeo-hosted Debian Ports rootfs. Do not replace it with i386; that would miss
# the big-endian and unsigned-char parts of the bug class.
#
-# QEMU depends on binfmt_misc registrations on the amd64 Woodie agent. If they
-# are absent, installing them with tonistiigi/binfmt requires a privileged Docker
-# step, which depends on the Woodpecker server and agent allowing privileged
-# execution. This workflow fails early instead of hiding that infrastructure gap.
+# QEMU depends on persistent binfmt_misc registrations on the amd64 Woodie agent
+# host. The host should be provisioned with Debian qemu-user, qemu-user-binfmt,
+# and binfmt-support so the handlers are available without privileged pipeline
+# steps. This workflow fails early instead of hiding that infrastructure gap.
variables:
native-image: &native-image repo.osgeo.org/postgis/build-test:debian13
prepare-debian: &prepare-debian |
@@ -98,11 +98,42 @@ steps:
image: debian:trixie
pull: true
commands:
- - test -r /proc/sys/fs/binfmt_misc/status
- - grep -qx enabled /proc/sys/fs/binfmt_misc/status
- - grep -qx enabled /proc/sys/fs/binfmt_misc/qemu-arm
- - grep -qx enabled /proc/sys/fs/binfmt_misc/qemu-s390x
- - if test -r /proc/sys/fs/binfmt_misc/qemu-ppc; then sed -n '1,4p' /proc/sys/fs/binfmt_misc/qemu-ppc; else echo "qemu-ppc not registered; Debian Ports powerpc remains blocked"; fi
+ - |
+ export DEBIAN_FRONTEND=noninteractive
+ dpkg --add-architecture armhf
+ dpkg --add-architecture s390x
+ apt-get update
+ mkdir -p "$${CI_WORKSPACE}/.tmp/binfmt-preflight"
+
+ check_foreign_uname() {
+ arch="$1"
+ expected_re="$2"
+ platform="$3"
+ root="$${CI_WORKSPACE}/.tmp/binfmt-preflight/$${arch}"
+ mkdir -p "$${root}"
+ apt-get download "busybox-static:$${arch}"
+ deb="$$(ls -1 busybox-static_*_$${arch}.deb | tail -n 1)"
+ dpkg-deb -x "$${deb}" "$${root}"
+
+ if ! output="$$("$${root}/bin/busybox" uname -m 2>&1)"; then
+ echo "Woodie agent host cannot execute $${arch} binaries through binfmt_misc/QEMU."
+ echo "Install Debian packages on the amd64 agent host: qemu-user qemu-user-binfmt binfmt-support."
+ echo "Agent operator check: docker run --rm --platform=$${platform} debian:trixie uname -m"
+ echo "Observed error: $${output}"
+ exit 1
+ fi
+
+ if ! printf '%s\n' "$${output}" | grep -Eq "$${expected_re}"; then
+ echo "Woodie agent host executed $${arch}, but uname -m returned unexpected value: $${output}"
+ echo "Agent operator check: docker run --rm --platform=$${platform} debian:trixie uname -m"
+ exit 1
+ fi
+
+ echo "$${arch} foreign execution ok: uname -m -> $${output}"
+ }
+ check_foreign_uname armhf '^(armv7l|armv8l)$' linux/arm/v7
+ check_foreign_uname s390x '^s390x$' linux/s390x
+ echo "Debian Ports powerpc remains blocked until a maintained OCI image or OSGeo-hosted rootfs exists"
native-unsigned-char:
image: *native-image
commit cd96d934a25f0d2814f0441b565edad1c48ed811
Author: Darafei Praliaskouski <me at komzpa.net>
Date: Sun Jul 26 02:20:37 2026 +0400
ci: add Woodie portability matrix
diff --git a/.woodpecker/portability.yml b/.woodpecker/portability.yml
new file mode 100644
index 0000000000..114d384456
--- /dev/null
+++ b/.woodpecker/portability.yml
@@ -0,0 +1,173 @@
+labels:
+ platform: linux/amd64
+when:
+ event: [push, pull_request, tag, cron]
+
+# This workflow keeps the existing amd64 CI honest by attacking ABI properties
+# that normal amd64 builds cannot falsify.
+#
+# Tier 1: armhf via arm32v7/debian under QEMU. This mirrors berrie: 32-bit
+# pointers and long, unsigned char, and stricter alignment than amd64.
+#
+# Tier 2: s390x via s390x/debian under QEMU. This is the practical big-endian
+# target for WKB/EWKB, TWKB, raster byte order, hashes, and integer memcpy paths.
+#
+# Tier 3 was investigated as Debian Ports powerpc: 32-bit, big-endian, unsigned
+# char. Docker Hub currently has no official linux/ppc Debian manifest, and the
+# only discovered powerpc Debian image is a removed schema-1 image. Keep this
+# tier out of the required pipeline until there is a maintained OCI image or an
+# OSGeo-hosted Debian Ports rootfs. Do not replace it with i386; that would miss
+# the big-endian and unsigned-char parts of the bug class.
+#
+# QEMU depends on binfmt_misc registrations on the amd64 Woodie agent. If they
+# are absent, installing them with tonistiigi/binfmt requires a privileged Docker
+# step, which depends on the Woodpecker server and agent allowing privileged
+# execution. This workflow fails early instead of hiding that infrastructure gap.
+variables:
+ native-image: &native-image repo.osgeo.org/postgis/build-test:debian13
+ prepare-debian: &prepare-debian |
+ export DEBIAN_FRONTEND=noninteractive
+ apt-get update
+ apt-get install -y --no-install-recommends \
+ autoconf automake libtool build-essential ca-certificates pkg-config \
+ postgresql postgresql-server-dev-all \
+ libcunit1-dev libgeos-dev libproj-dev libgdal-dev libjson-c-dev \
+ libprotobuf-c-dev protobuf-c-compiler libxml2-dev gettext zlib1g-dev
+ rm -rf /var/lib/apt/lists/*
+ abi-env: &abi-env |
+ export SRCDIR=$${CI_WORKSPACE}
+ export BUILDDIR=$${SRCDIR}/build/portability-$${PORTABILITY_TIER}
+ export PG_MAJOR=$$(pg_config --version | awk '{print $$2}' | cut -d. -f1)
+ export PATH=/usr/lib/postgresql/$${PG_MAJOR}/bin:$${PATH}
+ export PGROOT=$$(mktemp -d)
+ export PGDATA=$${PGROOT}/data
+ export PGHOST=$${PGROOT}/socket
+ export PGUSER=postgres
+ export PGDATABASE=postgres
+ export RUNTESTFLAGS="-v --extension --raster"
+ uname -m
+ dpkg-architecture -qDEB_HOST_GNU_TYPE
+ pg_config --version
+ start-postgresql: &start-postgresql |
+ chown postgres:postgres "$${PGROOT}"
+ runuser -u postgres -- mkdir "$${PGDATA}" "$${PGHOST}"
+ runuser -u postgres -- initdb -D "$${PGDATA}" -A trust --no-sync
+ runuser -u postgres -- pg_ctl -D "$${PGDATA}" \
+ -l "$${PGROOT}/postgresql.log" \
+ -o "-F -k $${PGHOST} -c synchronous_commit=off -c full_page_writes=off" \
+ -w start
+ trap 'runuser -u postgres -- pg_ctl -D "$${PGDATA}" -m fast -w stop || true' EXIT
+ psql -c 'select version()' template1
+ build-and-test: &build-and-test |
+ export PORTABILITY_STARTED=$$(date +%s)
+ mkdir -p "$${BUILDDIR}"
+ cd "$${BUILDDIR}"
+ "$${SRCDIR}/configure" \
+ --with-raster \
+ --without-topology \
+ --without-sfcgal \
+ --without-interrupt-tests \
+ CC="$${PORTABILITY_CC:-cc}" \
+ CFLAGS="$${PORTABILITY_CFLAGS}" \
+ LDFLAGS="$${PORTABILITY_LDFLAGS:-}"
+ make -j1
+ make -C liblwgeom check-unit
+ make install
+ make -C regress check RUNTESTFLAGS="$${RUNTESTFLAGS}" TESTS=" \
+ $${SRCDIR}/regress/core/wkb \
+ $${SRCDIR}/regress/core/twkb \
+ $${SRCDIR}/regress/core/sql-mm-serialize \
+ $${SRCDIR}/regress/core/in_geojson \
+ $${SRCDIR}/raster/test/regress/check_gdal \
+ $${SRCDIR}/raster/test/regress/loader/load_outdb \
+ $${SRCDIR}/raster/test/regress/rt_bytea \
+ $${SRCDIR}/raster/test/regress/rt_wkb \
+ $${SRCDIR}/raster/test/regress/rt_band \
+ $${SRCDIR}/raster/test/regress/clean"
+ echo "portability tier $${PORTABILITY_TIER} completed in $$(($$(date +%s) - $${PORTABILITY_STARTED}))s"
+
+clone:
+ git:
+ image: woodpeckerci/plugin-git
+ settings:
+ depth: 50
+ partial: false
+
+steps:
+ preflight-binfmt:
+ image: debian:trixie
+ pull: true
+ commands:
+ - test -r /proc/sys/fs/binfmt_misc/status
+ - grep -qx enabled /proc/sys/fs/binfmt_misc/status
+ - grep -qx enabled /proc/sys/fs/binfmt_misc/qemu-arm
+ - grep -qx enabled /proc/sys/fs/binfmt_misc/qemu-s390x
+ - if test -r /proc/sys/fs/binfmt_misc/qemu-ppc; then sed -n '1,4p' /proc/sys/fs/binfmt_misc/qemu-ppc; else echo "qemu-ppc not registered; Debian Ports powerpc remains blocked"; fi
+
+ native-unsigned-char:
+ image: *native-image
+ pull: true
+ commands:
+ - export PORTABILITY_TIER=native-unsigned-char
+ - export PORTABILITY_CFLAGS="-O2 -Wall -Werror -fno-omit-frame-pointer -funsigned-char"
+ - *abi-env
+ - *start-postgresql
+ - ./autogen.sh
+ - *build-and-test
+
+ native-alignment-ubsan:
+ image: *native-image
+ pull: true
+ commands:
+ - export PORTABILITY_TIER=native-alignment-ubsan
+ - export PORTABILITY_CC=clang
+ - export DEBIAN_FRONTEND=noninteractive
+ - apt-get update
+ - apt-get install -y --no-install-recommends clang
+ - rm -rf /var/lib/apt/lists/*
+ # GitHub Actions already has a broad undefined-sanitizer run. This job is
+ # narrower: fail immediately on alignment UB that strict-alignment CPUs
+ # would trap, while also keeping integer/undefined checks enabled.
+ - export PORTABILITY_CFLAGS="-g3 -O0 -fno-omit-frame-pointer -fsanitize=alignment,undefined -fno-sanitize-recover=alignment"
+ - export PORTABILITY_LDFLAGS="-fsanitize=alignment,undefined"
+ - *abi-env
+ - *start-postgresql
+ - ./autogen.sh
+ - *build-and-test
+
+ armhf-berrie-qemu:
+ image: arm32v7/debian:trixie
+ pull: true
+ depends_on: preflight-binfmt
+ commands:
+ - export PORTABILITY_TIER=armhf-berrie-qemu
+ - export PORTABILITY_CFLAGS="-O2 -Wall -Werror -fno-omit-frame-pointer"
+ - *prepare-debian
+ - *abi-env
+ - *start-postgresql
+ - ./autogen.sh
+ - *build-and-test
+
+ s390x-big-endian-qemu:
+ image: s390x/debian:trixie
+ pull: true
+ depends_on: preflight-binfmt
+ failure: ignore
+ # s390x is the only realistic big-endian coverage. It is intentionally not
+ # run on every pull request: QEMU plus the geospatial dependency closure is
+ # expensive, so master pushes, tags, and scheduled runs keep the signal
+ # without making every contributor wait for full emulation. Keep it
+ # non-blocking while the first big-endian findings are still being triaged;
+ # Woodpecker will show the failed step without failing the whole workflow.
+ when:
+ - event: [push, tag, cron]
+ branch: master
+ - event: tag
+ commands:
+ - export PORTABILITY_TIER=s390x-big-endian-qemu
+ - export PORTABILITY_CFLAGS="-O2 -Wall -Werror -fno-omit-frame-pointer"
+ - *prepare-debian
+ - *abi-env
+ - *start-postgresql
+ - ./autogen.sh
+ - *build-and-test
-----------------------------------------------------------------------
Summary of changes:
.woodpecker/portability.yml | 183 +++++++++++++++++++++
regress/core/curvetoline.sql | 2 +-
regress/core/geography_centroid.sql | 2 +-
regress/core/in_geojson.sql | 4 +-
regress/core/mvt.sql | 2 +-
regress/core/nurbs_wkt.sql | 104 ++++++------
regress/core/setpoint.sql | 2 +-
regress/core/tickets.sql | 8 +-
...expected => LongOptions.sql.expected.bigendian} | 6 +-
...expected => TestANALYZE.sql.expected.bigendian} | 6 +-
regress/run_test.pl | 12 ++
11 files changed, 263 insertions(+), 68 deletions(-)
create mode 100644 .woodpecker/portability.yml
copy regress/loader/{LongOptions.sql.expected => LongOptions.sql.expected.bigendian} (53%)
copy regress/loader/{TestANALYZE.sql.expected => TestANALYZE.sql.expected.bigendian} (50%)
hooks/post-receive
--
PostGIS
More information about the postgis-tickets
mailing list