From: Sandro Santilli Date: Fri, 6 May 2011 21:39:46 +0000 (+0000) Subject: ST_ModEdgeHeal: move check for TopoGeometry after check for connected edges. Fixes... X-Git-Tag: 2.0.0alpha1~1699 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=80d2b7ce0aa68a1fae593fda40482827c87757fd;p=postgis ST_ModEdgeHeal: move check for TopoGeometry after check for connected edges. Fixes bug #942 and regress-tests it [RT-SIGTA] git-svn-id: http://svn.osgeo.org/postgis/trunk@7109 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/topology/sql/sqlmm.sql b/topology/sql/sqlmm.sql index 28d1b3fc3..7d7490951 100644 --- a/topology/sql/sqlmm.sql +++ b/topology/sql/sqlmm.sql @@ -180,6 +180,32 @@ BEGIN -- NOTE: checks for INVALID_SCHEMA_NAME or UNDEFINED_TABLE done before END; + + -- NOT IN THE SPECS: See if any of the two edges are closed. + IF e1rec.start_node = e1rec.end_node THEN + RAISE EXCEPTION 'Edge % is closed, cannot heal to edge %', e1id, e2id; + END IF; + IF e2rec.start_node = e2rec.end_node THEN + RAISE EXCEPTION 'Edge % is closed, cannot heal to edge %', e2id, e1id; + END IF; + + -- Find common node + IF e1rec.end_node = e2rec.start_node THEN + commonnode = e1rec.end_node; + caseno = 1; + ELSIF e1rec.end_node = e2rec.end_node THEN + commonnode = e1rec.end_node; + caseno = 2; + ELSIF e1rec.start_node = e2rec.start_node THEN + commonnode = e1rec.start_node; + caseno = 3; + ELSIF e1rec.start_node = e2rec.end_node THEN + commonnode = e1rec.start_node; + caseno = 4; + ELSE + RAISE EXCEPTION 'SQL/MM Spatial exception – non-connected edges'; + END IF; + -- NOT IN THE SPECS: -- check if any topo_geom is defined only by one of the -- input edges. In such case there would be no way to adapt @@ -207,31 +233,6 @@ BEGIN END LOOP; - -- NOT IN THE SPECS: See if any of the two edges are closed. - IF e1rec.start_node = e1rec.end_node THEN - RAISE EXCEPTION 'Edge % is closed, cannot heal to edge %', e1id, e2id; - END IF; - IF e2rec.start_node = e2rec.end_node THEN - RAISE EXCEPTION 'Edge % is closed, cannot heal to edge %', e2id, e1id; - END IF; - - -- Find common node - IF e1rec.end_node = e2rec.start_node THEN - commonnode = e1rec.end_node; - caseno = 1; - ELSIF e1rec.end_node = e2rec.end_node THEN - commonnode = e1rec.end_node; - caseno = 2; - ELSIF e1rec.start_node = e2rec.start_node THEN - commonnode = e1rec.start_node; - caseno = 3; - ELSIF e1rec.start_node = e2rec.end_node THEN - commonnode = e1rec.start_node; - caseno = 4; - ELSE - RAISE EXCEPTION 'SQL/MM Spatial exception – non-connected edges'; - END IF; - -- Check if any other edge is connected to the common node FOR rec IN EXECUTE 'SELECT edge_id FROM ' || quote_ident(toponame) || '.edge_data WHERE ( edge_id != ' || e1id diff --git a/topology/test/regress/st_modedgeheal.sql b/topology/test/regress/st_modedgeheal.sql index 830a1bbef..2d4038b27 100644 --- a/topology/test/regress/st_modedgeheal.sql +++ b/topology/test/regress/st_modedgeheal.sql @@ -100,6 +100,9 @@ SELECT r.topogeo_id, r.element_id -- 'F+E3-E4' and 'F-E3+E4' SELECT 'MH(3,4)', topology.ST_ModEdgeHeal('t', 3, 4); +-- This is for ticket #942 +SELECT topology.ST_ModEdgeHeal('t', 1, 3); + SELECT r.topogeo_id, r.element_id FROM t.relation r, t.f f WHERE r.layer_id = layer_id(f.g) AND r.topogeo_id = id(f.g) diff --git a/topology/test/regress/st_modedgeheal_expected b/topology/test/regress/st_modedgeheal_expected index 547f6dfe2..e71719ff6 100644 --- a/topology/test/regress/st_modedgeheal_expected +++ b/topology/test/regress/st_modedgeheal_expected @@ -116,6 +116,7 @@ E4 3|4 3|-3 MH(3,4)|5 +ERROR: SQL/MM Spatial exception – non-connected edges 2|3 3|-3 Topology 't' dropped