-- 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
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
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
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
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;
#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