From 6bd16fac8d5cb3c770d01739228b0c94e65ad285 Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Mon, 20 Jul 2015 17:08:03 +0000 Subject: [PATCH] Handle invalid topology names (#3196) Updates regressions for changes. Patch by Mike Toews git-svn-id: http://svn.osgeo.org/postgis/trunk@13818 b70326c6-7e19-0410-871a-916f4a2858ee --- .../test/regress/addtopogeometrycolumn.sql | 1 + .../regress/addtopogeometrycolumn_expected | 1 + topology/test/regress/createtopology.sql | 4 + topology/test/regress/createtopology_expected | 2 + topology/test/regress/droptopology.sql | 4 + topology/test/regress/droptopology_expected | 2 + topology/topology.sql.in | 74 ++++++++++--------- 7 files changed, 54 insertions(+), 34 deletions(-) diff --git a/topology/test/regress/addtopogeometrycolumn.sql b/topology/test/regress/addtopogeometrycolumn.sql index 628e273cb..b5223ff5f 100644 --- a/topology/test/regress/addtopogeometrycolumn.sql +++ b/topology/test/regress/addtopogeometrycolumn.sql @@ -1,6 +1,7 @@ set client_min_messages to WARNING; \set VERBOSITY terse +select addtopogeometrycolumn('tt','public','feature','tg','POINT'); -- fail select createtopology('tt') > 0; select addtopogeometrycolumn('tt','public','feature','tg','POINT'); -- fail create table feature(id integer); diff --git a/topology/test/regress/addtopogeometrycolumn_expected b/topology/test/regress/addtopogeometrycolumn_expected index c893a2484..38f786eff 100644 --- a/topology/test/regress/addtopogeometrycolumn_expected +++ b/topology/test/regress/addtopogeometrycolumn_expected @@ -1,3 +1,4 @@ +ERROR: Topology 'tt' does not exist t ERROR: relation "public.feature" does not exist ERROR: Layer type must be one of POINT,LINE,POLYGON,COLLECTION diff --git a/topology/test/regress/createtopology.sql b/topology/test/regress/createtopology.sql index fc441767f..9ac06b667 100644 --- a/topology/test/regress/createtopology.sql +++ b/topology/test/regress/createtopology.sql @@ -26,3 +26,7 @@ SELECT topology.AddNode('2d', 'POINT(2 2)'); SELECT topology.DropTopology('2d'); SELECT topology.DropTopology('2dAgain'); SELECT topology.DropTopology('3d'); + +-- Exceptions +SELECT topology.CreateTopology('public'); +SELECT topology.CreateTopology('topology'); diff --git a/topology/test/regress/createtopology_expected b/topology/test/regress/createtopology_expected index 5f39466fa..e08c967b4 100644 --- a/topology/test/regress/createtopology_expected +++ b/topology/test/regress/createtopology_expected @@ -14,3 +14,5 @@ ERROR: Geometry has Z dimension but column does not Topology '2d' dropped Topology '2dAgain' dropped Topology '3d' dropped +ERROR: schema "public" already exists +ERROR: schema "topology" already exists diff --git a/topology/test/regress/droptopology.sql b/topology/test/regress/droptopology.sql index ec578a9b6..84f2ca4b4 100644 --- a/topology/test/regress/droptopology.sql +++ b/topology/test/regress/droptopology.sql @@ -13,3 +13,7 @@ SELECT topology.DropTopology('t1'); SELECT topology.DropTopology('t2'); DROP TABLE t2f; DROP TABLE t1f; + +-- Exceptions +SELECT topology.DropTopology('topology'); +SELECT topology.DropTopology('doesnotexist'); diff --git a/topology/test/regress/droptopology_expected b/topology/test/regress/droptopology_expected index c590ed371..e8ef689d4 100644 --- a/topology/test/regress/droptopology_expected +++ b/topology/test/regress/droptopology_expected @@ -4,3 +4,5 @@ t t Topology 't1' dropped Topology 't2' dropped +ERROR: Topology 'topology' does not exist +ERROR: Topology 'doesnotexist' does not exist diff --git a/topology/topology.sql.in b/topology/topology.sql.in index 09c89921d..df0417fb0 100644 --- a/topology/topology.sql.in +++ b/topology/topology.sql.in @@ -560,12 +560,12 @@ DECLARE query text; BEGIN - -- Get topology id - SELECT id FROM topology.topology into topoid - WHERE name = toponame; + -- Get topology id + SELECT id INTO topoid + FROM topology.topology WHERE name = toponame; - IF topoid IS NULL THEN - RAISE EXCEPTION 'Topology % does not exist', toponame; + IF NOT FOUND THEN + RAISE EXCEPTION 'Topology % does not exist', quote_literal(toponame); END IF; IF ltype ILIKE '%POINT%' OR ltype ILIKE 'PUNTAL' THEN @@ -861,8 +861,12 @@ BEGIN END IF; -- Get topology id into return TopoGeometry - SELECT id FROM topology.topology into ret.topology_id - WHERE name = toponame; + SELECT id INTO ret.topology_id + FROM topology.topology WHERE name = toponame; + + IF NOT FOUND THEN + RAISE EXCEPTION 'Topology % does not exist', quote_literal(toponame); + END IF; -- -- Get layer info @@ -995,8 +999,13 @@ $$ DECLARE ret integer; BEGIN - SELECT id FROM topology.topology into ret - WHERE name = toponame; + SELECT id INTO ret + FROM topology.topology WHERE name = toponame; + + IF NOT FOUND THEN + RAISE EXCEPTION 'Topology % does not exist', quote_literal(toponame); + END IF; + RETURN ret; END $$ @@ -1920,37 +1929,34 @@ DECLARE topoid integer; rec RECORD; BEGIN - -- Get topology id - SELECT id FROM topology.topology into topoid - WHERE name = atopology; - - - IF topoid IS NOT NULL THEN + SELECT id INTO topoid + FROM topology.topology WHERE name = atopology; - RAISE NOTICE 'Dropping all layers from topology % (%)', - atopology, topoid; + IF NOT FOUND THEN + RAISE EXCEPTION 'Topology % does not exist', quote_literal(atopology); + END IF; - -- Drop all layers in the topology - FOR rec IN EXECUTE 'SELECT * FROM topology.layer WHERE ' - ' topology_id = ' || topoid - LOOP + RAISE NOTICE 'Dropping all layers from topology % (%)', + quote_literal(atopology), topoid; - EXECUTE 'SELECT topology.DropTopoGeometryColumn(' - || quote_literal(rec.schema_name) - || ',' - || quote_literal(rec.table_name) - || ',' - || quote_literal(rec.feature_column) - || ')'; - END LOOP; - - -- Delete record from topology.topology - EXECUTE 'DELETE FROM topology.topology WHERE id = ' - || topoid; + -- Drop all layers in the topology + FOR rec IN EXECUTE 'SELECT * FROM topology.layer WHERE ' + || ' topology_id = ' || topoid + LOOP - END IF; + EXECUTE 'SELECT topology.DropTopoGeometryColumn(' + || quote_literal(rec.schema_name) + || ',' + || quote_literal(rec.table_name) + || ',' + || quote_literal(rec.feature_column) + || ')'; + END LOOP; + -- Delete record from topology.topology + EXECUTE 'DELETE FROM topology.topology WHERE id = ' + || topoid; -- Drop the schema (if it exists) FOR rec IN SELECT * FROM pg_namespace WHERE text(nspname) = atopology -- 2.50.1