From b123d48a7b6bf127120dd3eca5d892cf95180c73 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 8 Apr 2024 19:59:15 +0200 Subject: [PATCH] Make sure ST_ChangeEdgeGeom gets a fit view on edge's bounding boxes Reference #5704 in master branch (3.5.0dev) Includes regression testcase --- liblwgeom/topo/lwgeom_topo.c | 8 +++-- topology/test/regress/st_changeedgegeom.sql | 36 +++++++++++++++++++ .../test/regress/st_changeedgegeom_expected | 1 + 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/liblwgeom/topo/lwgeom_topo.c b/liblwgeom/topo/lwgeom_topo.c index 370c8244732..570f449a5a5 100644 --- a/liblwgeom/topo/lwgeom_topo.c +++ b/liblwgeom/topo/lwgeom_topo.c @@ -3512,8 +3512,12 @@ lwt_ChangeEdgeGeom(LWT_TOPOLOGY* topo, LWT_ELEMID edge_id, LWLINE *geom) -- would be larger than the old face MBR... -- */ - const GBOX* oldbox = lwgeom_get_bbox(lwline_as_lwgeom(oldedge->geom)); - const GBOX* newbox = lwgeom_get_bbox(lwline_as_lwgeom(geom)); + LWGEOM *oldgeom = lwline_as_lwgeom(oldedge->geom); + LWGEOM *newgeom = lwline_as_lwgeom(geom); + lwgeom_refresh_bbox(oldgeom); /* Ensure we use a fit mbr, see #5709 -- TODO: fix this at lower level */ + lwgeom_refresh_bbox(newgeom); /* Ensure we use a fit mbr, see #5709 -- TODO: fix this at lower level */ + const GBOX* oldbox = lwgeom_get_bbox(oldgeom); + const GBOX* newbox = lwgeom_get_bbox(newgeom); if ( ! gbox_same(oldbox, newbox) ) { GBOX* updatedBox; diff --git a/topology/test/regress/st_changeedgegeom.sql b/topology/test/regress/st_changeedgegeom.sql index 7822035e0c8..7f2605e4e29 100644 --- a/topology/test/regress/st_changeedgegeom.sql +++ b/topology/test/regress/st_changeedgegeom.sql @@ -150,3 +150,39 @@ ROLLBACK; SELECT topology.DropTopology('city_data'); +-- See https://trac.osgeo.org/postgis/ticket/5709 +SELECT NULL FROM createtopology('t5709'); +SELECT 't5709', 'edge', * FROM TopoGeo_addLineString('t5709', + 'LINESTRING( + 0 0, + 5 65.2, + 10 0, + 0 0) + '); +SELECT 't5709', 'mbr-invalid-before', face_id +FROM t5709.face +WHERE face_id > 0 +AND NOT ST_Equals( + mbr, + ST_Envelope( + ST_GetFaceGeometry('t5709', face_id) + ) + ); +--set client_min_messages to DEBUG; +SELECT NULL FROM ST_ChangeEdgeGeom('t5709', 1, + 'LINESTRING( + 0 0, + 5 65.2000000000001, + 10 0, + 0 0) + '); +SELECT 't5709', 'mbr-invalid-after', face_id +FROM t5709.face +WHERE face_id > 0 +AND NOT ST_Equals( + mbr, + ST_Envelope( + ST_GetFaceGeometry('t5709', face_id) + ) + ); +SELECT NULL FROM topology.DropTopology('t5709'); diff --git a/topology/test/regress/st_changeedgegeom_expected b/topology/test/regress/st_changeedgegeom_expected index 9e29700c714..f2bc4fb95ad 100644 --- a/topology/test/regress/st_changeedgegeom_expected +++ b/topology/test/regress/st_changeedgegeom_expected @@ -36,3 +36,4 @@ T13.2|Edge 29 changed T13.3|26 ERROR: Edge motion collision at POINT(-1.1697 47.7825) Topology 'city_data' dropped +t5709|edge|1