[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