]> granicus.if.org Git - postgis/commitdiff
#944 support functions to comb out type,srid, dim from constraint based geometries...
authorRegina Obe <lr@pcorp.us>
Thu, 23 Jun 2011 11:07:23 +0000 (11:07 +0000)
committerRegina Obe <lr@pcorp.us>
Thu, 23 Jun 2011 11:07:23 +0000 (11:07 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@7450 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/postgis.sql.in.c

index 6c4f2e4193af651fb0ea0257cf497c2e9f865a2f..0892d6ffc279d87f7b682f2ac0d8873c3430b446 100644 (file)
@@ -4794,27 +4794,66 @@ LANGUAGE 'plpgsql' IMMUTABLE STRICT;
 ---------------------------------------------------------------\r
 -- GEOMETRY_COLUMNS view\r
 ---------------------------------------------------------------\r
-CREATE OR REPLACE VIEW geometry_columns_v AS\r
-       SELECT\r
-               current_database() AS f_table_catalog, \r
-               n.nspname AS f_table_schema, \r
-               c.relname AS f_table_name, \r
-               a.attname AS f_geometry_column,\r
-               postgis_typmod_dims(a.atttypmod) AS coord_dimension,\r
-               postgis_typmod_srid(a.atttypmod) AS srid,\r
-               postgis_typmod_type(a.atttypmod) AS type\r
-       FROM \r
-               pg_class c, \r
-               pg_attribute a, \r
-               pg_type t, \r
-               pg_namespace n\r
-       WHERE t.typname = 'geometry'\r
-        AND a.attisdropped = false\r
-        AND a.atttypid = t.oid\r
-        AND a.attrelid = c.oid\r
-        AND c.relnamespace = n.oid\r
-        AND ( c.relkind = 'r' OR c.relkind = 'v' )\r
-        AND NOT pg_is_other_temp_schema(c.relnamespace);\r
+CREATE FUNCTION postgis_constraint_srid(geomschema text, geomtable text, geomcolumn text) RETURNS integer AS\r
+$$\r
+SELECT replace(replace(split_part(s.consrc, ' = ', 2), ')', ''), '(', '')::integer\r
+                FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s\r
+                WHERE n.nspname = $1\r
+                AND c.relname = $2\r
+                AND a.attname = $3\r
+                AND a.attrelid = c.oid\r
+                AND s.connamespace = n.oid\r
+                AND s.conrelid = c.oid\r
+                AND a.attnum = ANY (s.conkey)\r
+                AND s.consrc LIKE '%srid(% = %';\r
+$$\r
+LANGUAGE 'sql' STABLE STRICT;\r
+\r
+CREATE OR REPLACE FUNCTION postgis_constraint_type(geomschema text, geomtable text, geomcolumn text) RETURNS varchar AS\r
+$$\r
+SELECT  replace(split_part(s.consrc, '''', 2), ')', '')::varchar\r
+                FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s\r
+                WHERE n.nspname = $1\r
+                AND c.relname = $2\r
+                AND a.attname = $3\r
+                AND a.attrelid = c.oid\r
+                AND s.connamespace = n.oid\r
+                AND s.conrelid = c.oid\r
+                AND a.attnum = ANY (s.conkey)\r
+                AND s.consrc LIKE '%geometrytype(% = %';\r
+$$\r
+LANGUAGE 'sql' STABLE STRICT;\r
+\r
+CREATE OR REPLACE FUNCTION postgis_constraint_dims(geomschema text, geomtable text, geomcolumn text) RETURNS integer AS\r
+$$\r
+SELECT  replace(split_part(s.consrc, ' = ', 2), ')', '')::integer\r
+                FROM pg_class c, pg_namespace n, pg_attribute a, pg_constraint s\r
+                WHERE n.nspname = $1\r
+                AND c.relname = $2\r
+                AND a.attname = $3\r
+                AND a.attrelid = c.oid\r
+                AND s.connamespace = n.oid\r
+                AND s.conrelid = c.oid\r
+                AND a.attnum = ANY (s.conkey)\r
+                AND s.consrc LIKE '%ndims(% = %';\r
+$$\r
+LANGUAGE 'sql' STABLE STRICT;\r
+\r
+CREATE OR REPLACE VIEW geometry_columns_v AS \r
+ SELECT current_database()::varchar(256) AS f_table_catalog, \r
+    n.nspname::varchar(256) AS f_table_schema, \r
+    c.relname::varchar(256) AS f_table_name, \r
+    a.attname::varchar(256) AS f_geometry_column, \r
+    COALESCE(NULLIF(postgis_typmod_dims(a.atttypmod),2), postgis_constraint_dims(n.nspname, c.relname, a.attname), 2) AS coord_dimension, \r
+    COALESCE(NULLIF(postgis_typmod_srid(a.atttypmod),0), postgis_constraint_srid(n.nspname, c.relname, a.attname), 0) AS srid, \r
+    COALESCE(NULLIF(postgis_typmod_type(a.atttypmod), 'Geometry'), postgis_constraint_type(n.nspname, c.relname, a.attname), 'Geometry')::varchar(30) AS type\r
+   FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n\r
+  WHERE t.typname = 'geometry'::name \r
+    AND a.attisdropped = false \r
+    AND a.atttypid = t.oid \r
+    AND a.attrelid = c.oid \r
+    AND c.relnamespace = n.oid \r
+    AND (c.relkind = 'r'::"char" OR c.relkind = 'v'::"char") AND NOT pg_is_other_temp_schema(c.relnamespace);\r
 #endif\r
 \r
 \r