From: Sandro Santilli Date: Tue, 28 Jun 2011 19:36:39 +0000 (+0000) Subject: Apply patch by Andrea Peri to fix topology layer trigger. Includes regress test.... X-Git-Tag: 2.0.0alpha1~1327 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=85e12d5f2c309849dcfb7aadd8f73b83ab3911bc;p=postgis Apply patch by Andrea Peri to fix topology layer trigger. Includes regress test. Closes ticket #950. git-svn-id: http://svn.osgeo.org/postgis/trunk@7514 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/topology/test/Makefile b/topology/test/Makefile index b2f5d4caf..4ce38899f 100644 --- a/topology/test/Makefile +++ b/topology/test/Makefile @@ -48,7 +48,8 @@ TESTS = regress/legacy_validate.sql regress/legacy_predicate.sql \ regress/getnodebypoint.sql \ regress/getedgebypoint.sql \ regress/getfacebypoint.sql \ - regress/getringedges.sql + regress/getringedges.sql \ + regress/layertrigger.sql check: topo_predicates.sql load_topology.sql load_topology-4326.sql $(MAKE) -C ../../regress postgis.sql staged-install diff --git a/topology/test/regress/layertrigger.sql b/topology/test/regress/layertrigger.sql new file mode 100644 index 000000000..b283e4c8f --- /dev/null +++ b/topology/test/regress/layertrigger.sql @@ -0,0 +1,56 @@ +\set VERBOSITY terse +set client_min_messages to ERROR; + +select topology.DropTopology('t2'); +select topology.DropTopology('t1'); + +select 'seq_reset', setval('topology.topology_id_seq', 1, false); +select 't1', 'topology_id:' || topology.CreateTopology('t1'); +insert into t1.node(geom, containing_face) values ('POINT( 0 0)', 0); +create table t1.l1 (id serial); +select 't1.l1',topology.AddTopoGeometryColumn('t1', 't1', 'l1', 'g', 'POINT'); +insert INTO t1.l1(g) VALUES (topology.CreateTopoGeom('t1', 1, 1, '{{1,1}}')); + +select 't1.rel',* from t1.relation; + +select 't2', 'topology_id:' || topology.CreateTopology('t2'); + +insert into t2.node(geom, containing_face) values ('POINT( 0 0)', 0); +insert into t2.node(geom, containing_face) values ('POINT( 1 1)', 0); + +create table t2.l1 (id serial); + +select 't2.l1', topology.AddTopoGeometryColumn('t2', 't2', 'l1', 'g', 'POINT'); + +insert into t2.l1(g) VALUES (topology.CreateTopoGeom('t2', 1, 1, '{{1,1}}')); +--insert into t2.l1(g) VALUES (topology.CreateTopoGeom('t2', 1, 1, '{{2,1}}')); + +select 't2.rel',* from t2.relation; + +--always the trigger must reject an update +update topology.layer set topology_id = 123; +select 'after update: topology.layer ',* from topology.layer; + +-- the trigger must reject the delete because some referenced features still exists +BEGIN; + delete from t1.relation; + delete from t2.relation; + delete from topology.layer; + select 'after delete n.1: topology.layer ',topology_id,layer_id from topology.layer; +ROLLBACK; + +-- the trigger must reject because the t2.relation is not empty. +BEGIN; + delete from t2.l1; + delete from topology.layer where topology_id=2; + select 'after delete n.2: topology.layer ',topology_id,layer_id from topology.layer; +ROLLBACK; + +-- the trigger must accept the delete +delete from t2.l1; +delete from t2.relation; +delete from topology.layer where topology_id=2; +select 'after delete n.3: topology.layer ',topology_id,layer_id from topology.layer; + +select topology.DropTopology('t2'); +select topology.DropTopology('t1'); diff --git a/topology/test/regress/layertrigger_expected b/topology/test/regress/layertrigger_expected new file mode 100644 index 000000000..bd955cdad --- /dev/null +++ b/topology/test/regress/layertrigger_expected @@ -0,0 +1,23 @@ +Topology 't2' dropped +Topology 't1' dropped +seq_reset|1 +t1|topology_id:1 +t1.l1|1 +t1.rel|1|1|1|1 +t2|topology_id:2 +t2.l1|1 +t2.rel|1|1|1|1 +ERROR: The topology.layer table cannot be updated +after update: topology.layer |1|1|t1|l1|g|1|0| +after update: topology.layer |2|1|t2|l1|g|1|0| +BEGIN +after delete n.1: topology.layer |1|1 +after delete n.1: topology.layer |2|1 +COMMIT +BEGIN +after delete n.2: topology.layer |1|1 +after delete n.2: topology.layer |2|1 +COMMIT +after delete n.3: topology.layer |1|1 +Topology 't2' dropped +Topology 't1' dropped diff --git a/topology/topology.sql.in.c b/topology/topology.sql.in.c index 4d2563dba..d7ca21c49 100644 --- a/topology/topology.sql.in.c +++ b/topology/topology.sql.in.c @@ -278,8 +278,7 @@ BEGIN query = 'SELECT * ' || ' FROM ' || quote_ident(toponame) || '.relation ' - || ' WHERE topogeo_id = ' || OLD.topology_id - || ' AND layer_id = '|| OLD.layer_id + || ' WHERE layer_id = '|| OLD.layer_id || ' LIMIT 1'; --RAISE NOTICE '%', query; FOR rec IN EXECUTE query