[postgis-commits] svn - r3871 - spike/wktraster/rt_pg

postgis-commits at postgis.refractions.net postgis-commits at postgis.refractions.net
Mon Mar 16 06:57:24 PDT 2009


Author: mloskot
Date: 2009-03-16 06:57:23 -0700 (Mon, 16 Mar 2009)
New Revision: 3871

Modified:
   spike/wktraster/rt_pg/rtpostgis.sql.in.c
Log:
Relaxed AddRasterColumn to accept NULL as value of optional parameters. Added IS NULL validation to mendatory parameters. Implemented two short versions of AddRasterColumn.

Modified: spike/wktraster/rt_pg/rtpostgis.sql.in.c
===================================================================
--- spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-03-16 10:56:40 UTC (rev 3870)
+++ spike/wktraster/rt_pg/rtpostgis.sql.in.c	2009-03-16 13:57:23 UTC (rev 3871)
@@ -1,4 +1,4 @@
--- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 -- 
 -- $Id$
 --
@@ -10,13 +10,15 @@
 -- This is free software; you can redistribute and/or modify it under
 -- the terms of the GNU General Public Licence. See the COPYING file.
 --  
--- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 --
--- TODO: Complete the warning and notes below.
+-- TODO: 
+-- 1) Add regression tests
+-- 2) Complete the warning and notes below.
 -- 
 -- WARNING: Any change in this file must be evaluated for compatibility.
 --
--- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
 #define CREATEFUNCTION CREATE OR REPLACE FUNCTION
 #define _IMMUTABLE_STRICT IMMUTABLE STRICT
@@ -30,9 +32,9 @@
 
 -- BEGIN;
 
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 --  RASTER TYPE
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 
 CREATEFUNCTION rt_raster_in(cstring)
     RETURNS raster 
@@ -52,9 +54,9 @@
     storage = extended
 );
 
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 --  FUNCTIONS
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 
 CREATEFUNCTION rt_lib_version()
     RETURNS text
@@ -162,13 +164,14 @@
 --                                        <skewx>, <skewy>,
 --                                        <srid>)
 --
-CREATEFUNCTION rt_MakeEmptyRaster(int, int, float8, float8, float8, float8, float8, float8, int4) RETURNS RASTER
+CREATEFUNCTION rt_MakeEmptyRaster(int, int, float8, float8, float8, float8, float8, float8, int4)
+    RETURNS RASTER
     AS 'MODULE_PATHNAME', 'RASTER_makeEmpty'
     LANGUAGE 'C' IMMUTABLE; -- a new lib will require a new session
 
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 --  CASTS
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 
 CREATE CAST (raster AS box2d)
     WITH FUNCTION rt_raster_to_box2d(raster) AS IMPLICIT;
@@ -179,9 +182,9 @@
 CREATE CAST (raster AS bytea)
     WITH FUNCTION rt_bytea(raster) AS IMPLICIT;
 
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 --  GiST index OPERATOR support functions 
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 
 CREATEFUNCTION rt_overleft(raster, raster)
     RETURNS bool
@@ -243,9 +246,9 @@
     AS 'select geometry_overlap($1::geometry, $2::geometry)'
     LANGUAGE 'SQL' _IMMUTABLE_STRICT; 
 
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 --  GiST index OPERATORs
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 
 CREATE OPERATOR << (
    LEFTARG = raster, RIGHTARG = raster, PROCEDURE = rt_left,
@@ -319,7 +322,7 @@
    RESTRICT = contsel, JOIN = contjoinsel
 );
 
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 -- RASTER_COLUMNS
 --
 -- The metadata is documented in the WKT Raster specification:
@@ -328,22 +331,22 @@
 -- WARNING:
 -- The definition is still being discussed, so chances are it will
 -- change in near future. Consider current state a PROTOTYPE.
--------------------------------------------------------------------
+------------------------------------------------------------------------------
 
 CREATE TABLE raster_columns (
     r_table_catalog varchar(256) not null,
     r_table_schema varchar(256) not null,
     r_table_name varchar(256) not null,
     r_column varchar(256) not null,
-    out_db boolean not null,
     srid integer not null,
     pixel_types varchar[] not null,
+    out_db boolean not null,
+    regular_blocking boolean not null,
     nodata_values double precision[],
     pixelsize_x double precision,
     pixelsize_y double precision,
     blocksize_x double precision,
     blocksize_y double precision,
-    regular_blocking integer,
     extent GEOMETRY,
 
     CONSTRAINT raster_columns_pk primary key ( 
@@ -354,11 +357,11 @@
 ) WITH OIDS;
 
 
--------------------------------------------------------------------------------
+------------------------------------------------------------------------------
 -- ADDRASTERCOLUMN
 --      <catalog> <schema> <table> <column> <srid>
---      <pixel_types> <nodata_values>
---      <out_db> <regular_blocking>
+--      <pixel_types> <out_db> <regular_blocking>
+--      <nodata_values>
 --      <pixelsize_x> <pixelsize_y>
 --      <blocksize_x> <blocksize_y>
 --      <extent>
@@ -368,18 +371,17 @@
 -- 
 -------------------------------------------------------------------------------
 
-CREATEFUNCTION AddRasterColumn(
-    varchar, varchar, varchar, varchar, -- catalog, schema, table, column
-    integer,             -- srid
-    varchar[],           -- pixel_types
-    double precision[],  -- nodata_values
-    boolean,             -- out_db
-    boolean,             -- regular_blocking
-    double precision,    -- pixelsize_x
-    double precision,    -- pixelsize_y
-    integer,             -- blocksize_x
-    integer,             -- blocksize_y
-    geometry)            -- extent
+CREATEFUNCTION AddRasterColumn(varchar, varchar, varchar, varchar,
+                               integer,             -- srid
+                               varchar[],           -- pixel_types
+                               boolean,             -- out_db
+                               boolean,             -- regular_blocking
+                               double precision[],  -- nodata_values
+                               double precision,    -- pixelsize_x
+                               double precision,    -- pixelsize_y
+                               integer,             -- blocksize_x
+                               integer,             -- blocksize_y
+                               geometry)            -- extent
 
     RETURNS text AS 
 $$
@@ -392,9 +394,9 @@
     p_column_name ALIAS FOR $4;
     p_srid ALIAS FOR $5;
     p_pixel_types ALIAS FOR $6;
-    p_nodata_values ALIAS FOR $7;
-    p_out_db ALIAS FOR $8;
-    p_regular_blocking ALIAS FOR $9;
+    p_out_db ALIAS FOR $7;
+    p_regular_blocking ALIAS FOR $8;
+    p_nodata_values ALIAS FOR $9;
     p_pixelsize_x ALIAS FOR $10;
     p_pixelsize_y ALIAS FOR $11;
     p_blocksize_x ALIAS FOR $12;
@@ -411,11 +413,36 @@
 
 BEGIN
     
-    RAISE DEBUG 'Parameters: catalog=%, schema=%, table=%, column=%, srid=%, pixel_types=%, nodata_values=%, out_db=%, regular_blocking=%, pixelsize_x=%, pixelsize_y=%, blocksize_x=%, blocksize_y=%',
-                 p_catalog_name, p_schema_name, p_table_name, p_column_name,
-                 p_srid, p_pixel_types, p_nodata_values, p_out_db, p_regular_blocking,
-                 p_pixelsize_x, p_pixelsize_y, p_blocksize_x, p_blocksize_y;
+    RAISE DEBUG 'Parameters: catalog=%, schema=%, table=%, column=%, srid=%, pixel_types=%, out_db=%, regular_blocking=%, nodata_values=%, pixelsize_x=%, pixelsize_y=%, blocksize_x=%, blocksize_y=%',
+                 p_catalog_name, p_schema_name, p_table_name, p_column_name, p_srid, p_pixel_types, p_out_db, p_regular_blocking, p_nodata_values, p_pixelsize_x, p_pixelsize_y, p_blocksize_x, p_blocksize_y;
+    
+    -- Validate required parameters
+    IF ( (p_catalog_name IS NULL) OR (p_schema_name IS NULL)
+          OR (p_table_name IS NULL) OR (p_column_name IS NULL) ) THEN
+        RAISE EXCEPTION 'Name of catalog, schema, table or column IS NULL, value expected';
+        RETURN 'fail';
+    END IF;
 
+    IF ( p_srid IS NULL ) THEN
+        RAISE EXCEPTION 'SRID IS NULL, value expected';
+        RETURN 'fail';
+    END IF;
+
+    IF ( p_pixel_types IS NULL ) THEN
+        RAISE EXCEPTION 'Array of pixel types IS NULL, value expected';
+        RETURN 'fail';
+    END IF;
+
+    IF ( p_out_db IS NULL ) THEN
+        RAISE EXCEPTION 'out_db IS NULL, value expected';
+        RETURN 'fail';
+    END IF;
+    
+    IF ( p_regular_blocking IS NULL ) THEN
+        RAISE EXCEPTION 'regular_blocking IS NULL, value expected';
+        RETURN 'fail';
+    END IF;
+
     -- Verify SRID
     IF ( (p_srid != 0) AND (p_srid != -1) ) THEN
         SELECT SRID INTO srid_into FROM spatial_ref_sys WHERE SRID = p_srid;
@@ -423,6 +450,7 @@
             RAISE EXCEPTION 'Invalid SRID';
             RETURN 'fail';
         END IF;
+        RAISE DEBUG 'Verified SRID = %', p_srid;
     END IF;
 
     -- Verify PIXEL TYPE
@@ -448,9 +476,9 @@
 
     -- Verify SCHEMA
     IF ( p_schema_name IS NOT NULL AND p_schema_name != '' ) THEN
-        sql := 'SELECT nspname FROM pg_namespace ' ||
-            'WHERE text(nspname) = ' || quote_literal(p_schema_name) ||
-            'LIMIT 1';
+        sql := 'SELECT nspname FROM pg_namespace '
+            || 'WHERE text(nspname) = ' || quote_literal(p_schema_name)
+            || 'LIMIT 1';
         RAISE DEBUG '%', sql;
         EXECUTE sql INTO real_schema;
 
@@ -462,61 +490,64 @@
     
     IF ( real_schema IS NULL ) THEN
         RAISE DEBUG 'Detecting schema';
-        sql := 'SELECT n.nspname AS schemaname ' ||
-            'FROM pg_catalog.pg_class c ' ||
-              'JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace ' ||
-            'WHERE c.relkind = ' || quote_literal('r') ||
-            ' AND n.nspname NOT IN (' || quote_literal('pg_catalog') || ', ' || quote_literal('pg_toast') || ')' ||
-            ' AND pg_catalog.pg_table_is_visible(c.oid)' ||
-            ' AND c.relname = ' || quote_literal(p_table_name);
+        sql := 'SELECT n.nspname AS schemaname '
+            || 'FROM pg_catalog.pg_class c '
+            || 'JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace '
+            || 'WHERE c.relkind = ' || quote_literal('r')
+            || ' AND n.nspname NOT IN ('
+            || quote_literal('pg_catalog') || ', ' || quote_literal('pg_toast') || ')'
+            || ' AND pg_catalog.pg_table_is_visible(c.oid)'
+            || ' AND c.relname = ' || quote_literal(p_table_name);
         RAISE DEBUG '%', sql;
         EXECUTE sql INTO real_schema;
 
         IF ( real_schema IS NULL ) THEN
-            RAISE EXCEPTION 'Table % does not occur in the search_path', quote_literal(p_table_name);
+            RAISE EXCEPTION 'Table % does not occur in the search_path',
+                            quote_literal(p_table_name);
             RETURN 'fail';
         END IF;
     END IF;
 
     -- Add raster column to target table
-    sql := 'ALTER TABLE ' ||
-        quote_ident(real_schema) || '.' || quote_ident(p_table_name)
-        || ' ADD COLUMN ' || quote_ident(p_column_name) ||
-        ' raster ';
+    sql := 'ALTER TABLE '
+        || quote_ident(real_schema) || '.' || quote_ident(p_table_name)
+        || ' ADD COLUMN ' || quote_ident(p_column_name) ||  ' raster ';
     RAISE DEBUG '%', sql;
     EXECUTE sql;
 
     -- Delete stale record in RASTER_COLUMNS (if any)
-    sql := 'DELETE FROM raster_columns ' ||
-        ' WHERE r_table_catalog = ' || quote_literal('') ||
-        ' AND r_table_schema = ' || quote_literal(real_schema) ||
-        ' AND r_table_name = ' || quote_literal(p_table_name) ||
-        ' AND r_column = ' || quote_literal(p_column_name);
+    sql := 'DELETE FROM raster_columns '
+        || ' WHERE r_table_catalog = ' || quote_literal('')
+        || ' AND r_table_schema = ' || quote_literal(real_schema)
+        || ' AND r_table_name = ' || quote_literal(p_table_name)
+        || ' AND r_column = ' || quote_literal(p_column_name);
     RAISE DEBUG '%', sql;
     EXECUTE sql;
 
     -- Add record in RASTER_COLUMNS
-    sql := 'INSERT INTO raster_columns ' ||
-        ' (r_table_catalog, r_table_schema, r_table_name, r_column, out_db, srid, pixel_types) ' ||
-        ' VALUES (' ||
-        quote_literal('') || ',' ||
-        quote_literal(real_schema) || ',' ||
-        quote_literal(p_table_name) || ',' ||
-        quote_literal(p_column_name) || ',' ||
-        p_out_db::text || ',' ||
-        p_srid::text || ',' ||
-        quote_literal(p_pixel_types::text) || ')';
+    sql := 'INSERT INTO raster_columns '
+        || ' (r_table_catalog, r_table_schema, r_table_name, r_column, srid, pixel_types, out_db, regular_blocking, nodata_values) '
+        || ' VALUES ('
+        || quote_literal('') || ','
+        || quote_literal(real_schema) || ','
+        || quote_literal(p_table_name) || ','
+        || quote_literal(p_column_name) || ','
+        || p_srid::text || ','
+        || quote_literal(p_pixel_types::text) || ','
+        || p_out_db::text || ','
+        || p_regular_blocking::text || ','
+        || COALESCE(quote_literal(p_nodata_values), 'NULL') || ')';
     RAISE DEBUG '%', sql;
     EXECUTE sql;
 
     RAISE NOTICE 'TODO: Constraints not implemented';
 
     RETURN p_schema_name || '.' || p_table_name || '.' || p_column_name
-        || ' SRID:' || p_srid::text
+        || ' srid:' || p_srid::text
         || ' pixel_types:' || p_pixel_types::text
-        || ' nodata_values:' || p_nodata_values::text
         || ' out_db:' || p_out_db::text
         || ' regular_blocking:' || p_regular_blocking::text
+        || ' nodata_values:' || p_nodata_values::text
         || ' pixelsize_x:' || p_pixelsize_x::text
         || ' pixelsize_y:' || p_pixelsize_y::text
         || ' blocksize_x:' || p_blocksize_x::text
@@ -525,12 +556,12 @@
 
 END;
 $$
-LANGUAGE 'plpgsql' _VOLATILE_STRICT; -- WITH (isstrict);
+LANGUAGE 'plpgsql' _VOLATILE;
 
+
 -------------------------------------------------------------------------------
 -- ADDRASTERCOLUMN
---      <schema> <table> <column> <srid>
---      <pixel_types> <nodata_values>
+--      <schema> <table> <column> <srid> <pixel_types>
 -------------------------------------------------------------------------------
 --
 -- This is a wrapper to the real AddRasterColumn, for use
@@ -540,23 +571,44 @@
 -- 
 -------------------------------------------------------------------------------
 
-CREATEFUNCTION AddRasterColumn(varchar, varchar, varchar, integer,
-                               varchar[], double precision[])
-RETURNS text AS $$ 
-
+CREATEFUNCTION AddRasterColumn(varchar, varchar, varchar, integer, varchar[])
+    RETURNS text AS
+$$ 
 DECLARE
     ret text;
 BEGIN
-    --SELECT AddRasterColumn('',$1,$2,$3,$4,$5,$6,'f','f',0,0,0,0, 'POINT(0 0)'::geometry) into ret;
-    --RETURN ret;
-    RAISE NOTICE 'TODO: not implemented';
-    RETURN 'fail';
+    SELECT AddRasterColumn('',$1,$2,$3,$4,$5,'f','f',null,null,null,null,null,null) INTO ret;
+    RETURN ret;
 END;
 $$
-LANGUAGE 'plpgsql' _STABLE_STRICT; -- WITH (isstrict);
+LANGUAGE 'plpgsql' _STABLE;
 
 
 -------------------------------------------------------------------------------
+-- ADDRASTERCOLUMN
+--      <schema> <table> <column> <srid> <pixel_types> <nodata_values>
+-------------------------------------------------------------------------------
+--
+-- This is a wrapper to the real AddRasterColumn, for use
+-- when catalogue is undefined
+--
+-- TODO: To be documented
+-- 
+-------------------------------------------------------------------------------
+
+CREATEFUNCTION AddRasterColumn(varchar, varchar, varchar, integer, varchar[], double precision[])
+    RETURNS text AS
+$$ 
+DECLARE
+    ret text;
+BEGIN
+    SELECT AddRasterColumn('',$1,$2,$3,$4,$5,'f','f',$6,null,null,null,null,null) INTO ret;
+    RETURN ret;
+END;
+$$
+LANGUAGE 'plpgsql' _STABLE;
+
+-------------------------------------------------------------------------------
 -- DROPRASTERCOLUMN
 --      <catalog> <schema> <table> <column>
 -------------------------------------------------------------------------------
@@ -564,9 +616,9 @@
 -- TODO: to be implemented, to be documented
 -- 
 -------------------------------------------------------------------------------
+
 CREATEFUNCTION DropRasterColumn(varchar, varchar, varchar, varchar)
-    RETURNS text
-    AS 
+    RETURNS text AS
 $$
 DECLARE
     catalog_name alias for $1;



More information about the postgis-commits mailing list