Check SRID passed to UpdateGeometrySRID, patch by Mike Toews (#1596)
authorSandro Santilli <strk@keybit.net>
Wed, 22 Feb 2012 12:49:08 +0000 (12:49 +0000)
committerSandro Santilli <strk@keybit.net>
Wed, 22 Feb 2012 12:49:08 +0000 (12:49 +0000)
Adds regression testing

git-svn-id: http://svn.osgeo.org/postgis/trunk@9253 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/postgis.sql.in.c
regress/tickets.sql
regress/tickets_expected

index 502041406621c2541da8f71f56381cd2fb93f167..0b9cc490d3255ae22ebd8582beba20d5b3db08d2 100644 (file)
@@ -2102,7 +2102,7 @@ LANGUAGE 'sql' VOLATILE STRICT;
 -- Change SRID of all features in a spatially-enabled table\r
 --\r
 -----------------------------------------------------------------------\r
-CREATE OR REPLACE FUNCTION UpdateGeometrySRID(catalogn_name varchar,schema_name varchar,table_name varchar,column_name varchar,new_srid integer)\r
+CREATE OR REPLACE FUNCTION UpdateGeometrySRID(catalogn_name varchar,schema_name varchar,table_name varchar,column_name varchar,new_srid_in integer)\r
        RETURNS text\r
        AS\r
 $$\r
@@ -2111,6 +2111,8 @@ DECLARE
        okay boolean;\r
        cname varchar;\r
        real_schema name;\r
+       unknown_srid integer;\r
+       new_srid integer := new_srid_in;\r
 \r
 BEGIN\r
 \r
@@ -2132,7 +2134,7 @@ BEGIN
                SELECT INTO real_schema current_schema()::text;\r
        END IF;\r
 \r
-       -- Find out if the column is in the geometry_columns table\r
+       -- Ensure that column_name is in geometry_columns\r
        okay = false;\r
        FOR myrec IN SELECT type, coord_dimension FROM geometry_columns WHERE f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP\r
                okay := true;\r
@@ -2142,6 +2144,20 @@ BEGIN
                RETURN false;\r
        END IF;\r
 \r
+       -- Ensure that new_srid is valid\r
+       IF ( new_srid > 0 ) THEN\r
+               IF ( SELECT count(*) = 0 from spatial_ref_sys where srid = new_srid ) THEN\r
+                       RAISE EXCEPTION 'invalid SRID: % not found in spatial_ref_sys', new_srid;\r
+                       RETURN false;\r
+               END IF;\r
+       ELSE\r
+               unknown_srid := ST_SRID('POINT EMPTY'::geometry);\r
+               IF ( new_srid != unknown_srid ) THEN\r
+                       new_srid := unknown_srid;\r
+                       RAISE NOTICE 'SRID value % converted to the officially unknown SRID value %', new_srid_in, new_srid;\r
+               END IF;\r
+       END IF;\r
+\r
        IF postgis_constraint_srid(schema_name, table_name, column_name) IS NOT NULL THEN \r
        -- srid was enforced with constraints before, keep it that way.\r
         -- Make up constraint name\r
index 38ebb9d5ebfce52fa5cad47b8020144cfc463375..c87a564ee40a49d32f4028183f2ddc4ecaa256df 100644 (file)
@@ -608,6 +608,20 @@ select '#1580.1', ST_Summary(ST_Transform('SRID=4326;POINT(0 0)'::geometry, 3395
 select '#1580.2', ST_Transform('SRID=4326;POINT(180 90)'::geometry, 3395); -- fails
 select '#1580.3', ST_Summary(ST_Transform('SRID=4326;POINT(0 0)'::geometry, 3395));
 
+-- #1596 --
+CREATE TABLE road_pg (ID INTEGER, NAME VARCHAR(32));
+SELECT '#1596.1', AddGeometryColumn( 'road_pg','roads_geom', 3395, 'POINT', 2 );
+SELECT '#1596.2', UpdateGeometrySRID( 'road_pg','roads_geom', 330000);
+SELECT '#1596.3', srid FROM geometry_columns
+  WHERE f_table_name = 'road_pg' AND f_geometry_column = 'roads_geom';
+SELECT '#1596.4', UpdateGeometrySRID( 'road_pg','roads_geom', 999000);
+SELECT '#1596.5', srid FROM geometry_columns
+  WHERE f_table_name = 'road_pg' AND f_geometry_column = 'roads_geom';
+SELECT '#1596.6', UpdateGeometrySRID( 'road_pg','roads_geom', -1);
+SELECT '#1596.7', srid FROM geometry_columns
+  WHERE f_table_name = 'road_pg' AND f_geometry_column = 'roads_geom';
+DROP TABLE road_pg;
+
 -- Clean up
 DELETE FROM spatial_ref_sys;
 
index e23cd97bed89f62269d8c70e130b632cdf484b1d..5f0e8216f875b1d32729ef1cee5d5363510b4101 100644 (file)
@@ -201,3 +201,14 @@ ERROR:  AddToPROJ4SRSCache: couldn't parse proj4 string: '': (null)
 #1580.1|Point[B]
 ERROR:  transform: couldn't project point (180 90 0): tolerance condition error (-20)
 #1580.3|Point[B]
+#1596.1|public.road_pg.roads_geom SRID:3395 TYPE:POINT DIMS:2 
+ERROR:  invalid SRID: 330000 not found in spatial_ref_sys
+PL/pgSQL function "updategeometrysrid" line 4 at SQL statement
+#1596.3|3395
+ERROR:  invalid SRID: 999000 not found in spatial_ref_sys
+PL/pgSQL function "updategeometrysrid" line 4 at SQL statement
+#1596.5|3395
+NOTICE:  SRID value -1 converted to the officially unknown SRID value 0
+PL/pgSQL function "updategeometrysrid" line 4 at SQL statement
+#1596.6|public.road_pg.roads_geom SRID changed to 0
+#1596.7|0