From: Sandro Santilli Date: Mon, 22 Mar 2004 09:39:38 +0000 (+0000) Subject: Moved AddGeometryColumn and DropGeometryColumn from USE_VERSION X-Git-Tag: pgis_0_8_2~68 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=11c3ea61d66472ee1d3466feeffba4e7be98864d;p=postgis Moved AddGeometryColumn and DropGeometryColumn from USE_VERSION blocks to the end of file. Here, differences between versions are handled on a minimun-diff basis, making it easier to understand the differences and to modify the code. Also, diffs have been splitted between pgsql < 73 and >= 73. Added reduced-parameters wrappers to both functions. git-svn-id: http://svn.osgeo.org/postgis/trunk@491 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis.sql.in b/postgis.sql.in index 4266708fe..2e0d34f73 100644 --- a/postgis.sql.in +++ b/postgis.sql.in @@ -759,8 +759,9 @@ CREATE FUNCTION postgis_version() RETURNS text AS 'SELECT 'POSTGIS_VERSION'::text AS version' LANGUAGE 'sql'; --- - - - - - - - - - - - - - - - - - - - - - - - - - - - +----------------------------------------------------------------------- -- FIND_SRID( , , ) +----------------------------------------------------------------------- CREATE FUNCTION find_srid(varchar,varchar,varchar) RETURNS int4 AS 'DECLARE @@ -2080,169 +2081,6 @@ END; ' LANGUAGE 'plpgsql' ; --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( --- , ,
, , --- , , ) --- --- Type can be one of geometry, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON, --- MULTIPOLYGON, LINESTRING, or MULTILINESTRING. --- --- Types (except geometry) are checked for consistency using a CHECK constraint --- uses SQL ALTER TABLE command to add the geometry column to the table. --- Addes a row to geometry_columns. --- Addes a constraint on the table that all the geometries MUST have the same --- SRID. Checks the coord_dimension to make sure its between 0 and 3. --- Should also check the precision grid (future expansion). --- Calls fix_geometry_columns() at the end. --- -CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,varchar,integer,varchar,integer) - RETURNS text - AS -' -DECLARE - catalog_name alias for $1; - schema_name alias for $2; - table_name alias for $3; - column_name alias for $4; - new_srid alias for $5; - new_type alias for $6; - new_dim alias for $7; - -BEGIN - - IF ( not ( (new_type =''GEOMETRY'') or - (new_type =''GEOMETRYCOLLECTION'') or - (new_type =''POINT'') or - (new_type =''MULTIPOINT'') or - (new_type =''POLYGON'') or - (new_type =''MULTIPOLYGON'') or - (new_type =''LINESTRING'') or - (new_type =''MULTILINESTRING'')) ) - THEN - RAISE EXCEPTION ''Invalid type name - valid ones are: - GEOMETRY, GEOMETRYCOLLECTION, POINT, - MULTIPOINT, POLYGON, MULTIPOLYGON, - LINESTRING, or MULTILINESTRING ''; - return ''fail''; - END IF; - - IF ( (new_dim >3) or (new_dim <0) ) THEN - RAISE EXCEPTION ''invalid dimension''; - return ''fail''; - END IF; - - EXECUTE ''ALTER TABLE '' || quote_ident(table_name) || - '' ADD COLUMN '' || quote_ident(column_name) || - '' geometry ''; - - EXECUTE ''INSERT INTO geometry_columns VALUES ('' || - quote_literal('''') || '','' || - quote_literal('''') || '','' || - quote_literal(table_name) || '','' || - quote_literal(column_name) || '','' || - new_dim || '','' || new_srid || '','' || - quote_literal(new_type) || '')''; - - EXECUTE ''select fix_geometry_columns()''; - - EXECUTE ''ALTER TABLE '' || quote_ident(table_name) || - '' ADD CHECK (SRID('' || quote_ident(column_name) || - '') = '' || new_srid || '')'' ; - - IF (not(new_type = ''GEOMETRY'')) THEN - EXECUTE ''ALTER TABLE '' || quote_ident(table_name) || - '' ADD CHECK (geometrytype('' || - quote_ident(column_name) || '')='' || - quote_literal(new_type) || '' OR ('' || - quote_ident(column_name) || '') is null)''; - END IF; - - return ''Geometry column '' || column_name || '' added to table '' - || table_name || '' WITH a SRID of '' || new_srid || - '' and type '' || new_type; -END; -' LANGUAGE 'plpgsql' WITH (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( ,
, , , , ) --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS ' -DECLARE - ret text; -BEGIN - SELECT AddGeometryColumn('''',$1,$2,$3,$4,$5,$6) into ret; - RETURN ret; -END; -' LANGUAGE 'plpgsql' WITH (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- DROPGEOMETRYCOLUMN( ,
, ) --- --- There is no ALTER TABLE DROP COLUMN command in postgresql --- There is no ALTER TABLE DROP CONSTRAINT command in postgresql --- So, we: --- 1. remove the unwanted geom column reference from the --- geometry_columns table --- 2. update the table so that the geometry column is all NULLS --- This is okay since the CHECK srid(geometry) = is not --- checked if geometry is NULL (the isstrict attribute on srid()) --- 3. add another constraint that the geometry column must be NULL --- This, effectively kills the geometry column --- (a) its not in the geometry_column table --- (b) it only has nulls in it --- (c) you cannot add anything to the geom column because it must be NULL --- --- This will screw up if you put a NOT NULL constraint on the geometry --- column, so the first thing we must do is remove this constraint (its a --- modification of the pg_attribute system table) --- --- We also check to see if the table/column exists in the geometry_columns --- table - -CREATE FUNCTION DropGeometryColumn(varchar,varchar,varchar) - RETURNS text - AS -' -DECLARE - schema_name alias for $1; - table_name alias for $2; - column_name alias for $3; - myrec RECORD; - okay boolean; -BEGIN - -- first we find out if the column is in the geometry_columns table - okay = ''f''; - FOR myrec IN SELECT * from geometry_columns where f_table_schema = schema_name and f_table_name = table_name and f_geometry_column = column_name LOOP - okay := ''t''; - END LOOP; - IF (okay <> ''t'') THEN - RAISE EXCEPTION ''column not found in geometry_columns table''; - return ''f''; - END IF; - - -- ensure the geometry column does not have a NOT NULL attribute - EXECUTE ''update pg_attribute set attnotnull = false from pg_class where pg_attribute.attrelid = pg_class.oid and pg_class.relname = '' || quote_literal(table_name) ||'' and pg_attribute.attname = '' || quote_literal(column_name); - - -- remove ref from geometry_columns table - EXECUTE ''delete from geometry_columns where f_table_schema = '' || quote_literal(database_name) || - '' and f_table_name = '' || quote_literal(table_name) || - '' and f_geometry_column = '' || quote_literal(column_name ); - - -- update the given table/column so that it it all NULLS - - EXECUTE ''update "''||table_name||''" set "''||column_name||''"= NULL''; - - -- add = NULL constraint to given table/column - - EXECUTE ''ALTER TABLE "''||table_name||''" ADD CHECK ("''||column_name||''" IS NULL)''; - - RETURN table_name || ''.'' || column_name ||'' effectively removed.''; - -END; -' -LANGUAGE 'plpgsql' WITH (isstrict); - #elif USE_VERSION == 72 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2552,169 +2390,6 @@ END; ' LANGUAGE 'plpgsql' ; --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( --- , ,
, , --- , , ) --- --- Type can be one of geometry, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON, --- MULTIPOLYGON, LINESTRING, or MULTILINESTRING. --- --- Types (except geometry) are checked for consistency using a CHECK constraint --- uses SQL ALTER TABLE command to add the geometry column to the table. --- Addes a row to geometry_columns. --- Addes a constraint on the table that all the geometries MUST have the same --- SRID. Checks the coord_dimension to make sure its between 0 and 3. --- Should also check the precision grid (future expansion). --- Calls fix_geometry_columns() at the end. --- -CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,varchar,integer,varchar,integer) - RETURNS text - AS -' -DECLARE - catalog_name alias for $1; - schema_name alias for $2; - table_name alias for $3; - column_name alias for $4; - new_srid alias for $5; - new_type alias for $6; - new_dim alias for $7; - -BEGIN - - IF ( not ( (new_type =''GEOMETRY'') or - (new_type =''GEOMETRYCOLLECTION'') or - (new_type =''POINT'') or - (new_type =''MULTIPOINT'') or - (new_type =''POLYGON'') or - (new_type =''MULTIPOLYGON'') or - (new_type =''LINESTRING'') or - (new_type =''MULTILINESTRING'')) ) - THEN - RAISE EXCEPTION ''Invalid type name - valid ones are: - GEOMETRY, GEOMETRYCOLLECTION, POINT, - MULTIPOINT, POLYGON, MULTIPOLYGON, - LINESTRING, or MULTILINESTRING ''; - return ''fail''; - END IF; - - IF ( (new_dim >3) or (new_dim <0) ) THEN - RAISE EXCEPTION ''invalid dimension''; - return ''fail''; - END IF; - - EXECUTE ''ALTER TABLE '' || quote_ident(table_name) || - '' ADD COLUMN '' || quote_ident(column_name) || - '' geometry ''; - - EXECUTE ''INSERT INTO geometry_columns VALUES ('' || - quote_literal('''') || '','' || - quote_literal('''') || '','' || - quote_literal(table_name) || '','' || - quote_literal(column_name) || '','' || - new_dim || '','' || new_srid || '','' || - quote_literal(new_type) || '')''; - - EXECUTE ''select fix_geometry_columns()''; - - EXECUTE ''ALTER TABLE '' || quote_ident(table_name) || - '' ADD CHECK (SRID('' || quote_ident(column_name) || - '') = '' || new_srid || '')'' ; - - IF (not(new_type = ''GEOMETRY'')) THEN - EXECUTE ''ALTER TABLE '' || quote_ident(table_name) || - '' ADD CHECK (geometrytype('' || - quote_ident(column_name) || '')='' || - quote_literal(new_type) || '' OR ('' || - quote_ident(column_name) || '') is null)''; - END IF; - - return ''Geometry column '' || column_name || '' added to table '' - || table_name || '' WITH a SRID of '' || new_srid || - '' and type '' || new_type; -END; -' LANGUAGE 'plpgsql' WITH (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( ,
, , , , ) --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS ' -DECLARE - ret text; -BEGIN - SELECT AddGeometryColumn('''',$1,$2,$3,$4,$5,$6) into ret; - RETURN ret; -END; -' LANGUAGE 'plpgsql' WITH (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- DROPGEOMETRYCOLUMN( ,
, ) --- --- There is no ALTER TABLE DROP COLUMN command in postgresql --- There is no ALTER TABLE DROP CONSTRAINT command in postgresql --- So, we: --- 1. remove the unwanted geom column reference from the --- geometry_columns table --- 2. update the table so that the geometry column is all NULLS --- This is okay since the CHECK srid(geometry) = is not --- checked if geometry is NULL (the isstrict attribute on srid()) --- 3. add another constraint that the geometry column must be NULL --- This, effectively kills the geometry column --- (a) its not in the geometry_column table --- (b) it only has nulls in it --- (c) you cannot add anything to the geom column because it must be NULL --- --- This will screw up if you put a NOT NULL constraint on the geometry --- column, so the first thing we must do is remove this constraint (its a --- modification of the pg_attribute system table) --- --- We also check to see if the table/column exists in the geometry_columns --- table - -CREATE FUNCTION DropGeometryColumn(varchar,varchar,varchar) - RETURNS text - AS -' -DECLARE - schema_name alias for $1; - table_name alias for $2; - column_name alias for $3; - myrec RECORD; - okay boolean; -BEGIN - -- first we find out if the column is in the geometry_columns table - okay = ''f''; - FOR myrec IN SELECT * from geometry_columns where f_table_schema = schema_name and f_table_name = table_name and f_geometry_column = column_name LOOP - okay := ''t''; - END LOOP; - IF (okay <> ''t'') THEN - RAISE EXCEPTION ''column not found in geometry_columns table''; - return ''f''; - END IF; - - -- ensure the geometry column does not have a NOT NULL attribute - EXECUTE ''update pg_attribute set attnotnull = false from pg_class where pg_attribute.attrelid = pg_class.oid and pg_class.relname = '' || quote_literal(table_name) ||'' and pg_attribute.attname = '' || quote_literal(column_name); - - -- remove ref from geometry_columns table - EXECUTE ''delete from geometry_columns where f_table_schema = '' || quote_literal(database_name) || - '' and f_table_name = '' || quote_literal(table_name) || - '' and f_geometry_column = '' || quote_literal(column_name ); - - -- update the given table/column so that it it all NULLS - - EXECUTE ''update "''||table_name||''" set "''||column_name||''"= NULL''; - - -- add = NULL constraint to given table/column - - EXECUTE ''ALTER TABLE "''||table_name||''" ADD CHECK ("''||column_name||''" IS NULL)''; - - RETURN table_name || ''.'' || column_name ||'' effectively removed.''; - -END; -' -LANGUAGE 'plpgsql' WITH (isstrict); - #elif USE_VERSION == 73 -- @@ -2932,212 +2607,24 @@ END; ' LANGUAGE 'plpgsql' ; + +#elif USE_VERSION == 74 + -- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( --- , ,
, , --- , , ) --- --- Type can be one of geometry, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON, --- MULTIPOLYGON, LINESTRING, or MULTILINESTRING. --- --- Types (except geometry) are checked for consistency using a CHECK constraint --- uses SQL ALTER TABLE command to add the geometry column to the table. --- Addes a row to geometry_columns. --- Addes a constraint on the table that all the geometries MUST have the same --- SRID. Checks the coord_dimension to make sure its between 0 and 3. --- Should also check the precision grid (future expansion). --- Calls fix_geometry_columns() at the end. --- -CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,varchar,integer,varchar,integer) - RETURNS text - AS -' -DECLARE - catalog_name alias for $1; - schema_name alias for $2; - table_name alias for $3; - column_name alias for $4; - new_srid alias for $5; - new_type alias for $6; - new_dim alias for $7; - - rec RECORD; - schema_ok bool; - real_schema name; -BEGIN - - IF ( not ( (new_type =''GEOMETRY'') or - (new_type =''GEOMETRYCOLLECTION'') or - (new_type =''POINT'') or - (new_type =''MULTIPOINT'') or - (new_type =''POLYGON'') or - (new_type =''MULTIPOLYGON'') or - (new_type =''LINESTRING'') or - (new_type =''MULTILINESTRING'')) ) - THEN - RAISE EXCEPTION ''Invalid type name - valid ones are: - GEOMETRY, GEOMETRYCOLLECTION, POINT, - MULTIPOINT, POLYGON, MULTIPOLYGON, - LINESTRING, or MULTILINESTRING ''; - RETURN ''fail''; - END IF; - - IF ( (new_dim >3) or (new_dim <0) ) THEN - RAISE EXCEPTION ''invalid dimension''; - RETURN ''fail''; - END IF; - - IF ( schema_name != '''' ) THEN - schema_ok = ''f''; - FOR rec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP - schema_ok := ''t''; - END LOOP; - - if ( schema_ok <> ''t'' ) THEN - RAISE NOTICE ''Invalid schema name - using current_schema()''; - SELECT current_schema() into real_schema; - ELSE - real_schema = schema_name; - END IF; - - ELSE - SELECT current_schema() into real_schema; - END IF; - - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD COLUMN '' || quote_ident(column_name) || - '' geometry ''; - - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD CHECK (SRID('' || quote_ident(column_name) || - '') = '' || new_srid || '')'' ; - - IF (not(new_type = ''GEOMETRY'')) THEN - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD CHECK (geometrytype('' || - quote_ident(column_name) || '')='' || - quote_literal(new_type) || '' OR ('' || - quote_ident(column_name) || '') is null)''; - END IF; - - EXECUTE ''INSERT INTO geometry_columns VALUES ('' || - quote_literal('''') || '','' || - quote_literal(real_schema) || '','' || - quote_literal(table_name) || '','' || - quote_literal(column_name) || '','' || - new_dim || '','' || new_srid || '','' || - quote_literal(new_type) || '')''; - - EXECUTE ''select fix_geometry_columns()''; - --SELECT fix_geometry_columns(); - - return ''Geometry column '' || column_name || '' added to table '' - || real_schema || ''.'' || table_name || '' WITH a SRID of '' || new_srid || - '' and type '' || new_type; -END; -' LANGUAGE 'plpgsql' WITH (isstrict); --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( ,
, , , , ) --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS ' -DECLARE - ret text; -BEGIN - SELECT AddGeometryColumn('''',$1,$2,$3,$4,$5,$6) into ret; - RETURN ret; -END; -' LANGUAGE 'plpgsql' WITH (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- DROPGEOMETRYCOLUMN( ,
, ) --- --- Removes geometry column reference from geometry_columns table, --- and actually drops the column. --- -CREATE FUNCTION DropGeometryColumn(varchar,varchar,varchar) - RETURNS text - AS -' -DECLARE - schema_name alias for $1; - table_name alias for $2; - column_name alias for $3; - - myrec RECORD; - real_schema name; - okay boolean; - query text; - -BEGIN - - - -- Find, check or fix schema_name - IF ( schema_name != '''' ) THEN - okay = ''f''; - - FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP - okay := ''t''; - END LOOP; - - IF ( okay <> ''t'' ) THEN - RAISE NOTICE ''Invalid schema name - using current_schema()''; - SELECT current_schema() into real_schema; - ELSE - real_schema = schema_name; - END IF; - ELSE - SELECT current_schema() into real_schema; - END IF; - - -- first we find out if the column is in the geometry_columns table - okay = ''f''; - FOR myrec IN SELECT * from geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP - okay := ''t''; - END LOOP; - IF (okay <> ''t'') THEN - RAISE EXCEPTION ''column not found in geometry_columns table''; - RETURN ''f''; - END IF; - - - -- Remove ref from geometry_columns table - EXECUTE ''delete from geometry_columns where f_table_schema = '' || - quote_literal(real_schema) || '' and f_table_name = '' || - quote_literal(table_name) || '' and f_geometry_column = '' || - quote_literal(column_name); - - -- Remove table column - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || ''.'' || - quote_ident(table_name) || '' DROP COLUMN '' || - quote_ident(column_name); - - - RETURN real_schema || ''.'' || table_name || ''.'' || column_name ||'' effectively removed.''; - -END; -' -LANGUAGE 'plpgsql' WITH (isstrict); - -#elif USE_VERSION == 74 - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- WKB - --- this has been moved here at _end from _start --- because we need the definition of function bytea --- found in _common -CREATE TYPE wkb ( - internallength = variable, - input = wkb_in, - output = wkb_out, - storage = extended, - send = bytea, - receive = wkb_recv -); - +-- WKB + +-- this has been moved here at _end from _start +-- because we need the definition of function bytea +-- found in _common +CREATE TYPE wkb ( + internallength = variable, + input = wkb_in, + output = wkb_out, + storage = extended, + send = bytea, + receive = wkb_recv +); + -- -- 7.3 explicit casting definitions -- @@ -3364,195 +2851,6 @@ END; ' LANGUAGE 'plpgsql' ; --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( --- , ,
, , --- , , ) --- --- Type can be one of geometry, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON, --- MULTIPOLYGON, LINESTRING, or MULTILINESTRING. --- --- Types (except geometry) are checked for consistency using a CHECK constraint --- uses SQL ALTER TABLE command to add the geometry column to the table. --- Addes a row to geometry_columns. --- Addes a constraint on the table that all the geometries MUST have the same --- SRID. Checks the coord_dimension to make sure its between 0 and 3. --- Should also check the precision grid (future expansion). --- Calls fix_geometry_columns() at the end. --- -CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,varchar,integer,varchar,integer) - RETURNS text - AS -' -DECLARE - catalog_name alias for $1; - schema_name alias for $2; - table_name alias for $3; - column_name alias for $4; - new_srid alias for $5; - new_type alias for $6; - new_dim alias for $7; - - rec RECORD; - schema_ok bool; - real_schema name; -BEGIN - - IF ( not ( (new_type =''GEOMETRY'') or - (new_type =''GEOMETRYCOLLECTION'') or - (new_type =''POINT'') or - (new_type =''MULTIPOINT'') or - (new_type =''POLYGON'') or - (new_type =''MULTIPOLYGON'') or - (new_type =''LINESTRING'') or - (new_type =''MULTILINESTRING'')) ) - THEN - RAISE EXCEPTION ''Invalid type name - valid ones are: - GEOMETRY, GEOMETRYCOLLECTION, POINT, - MULTIPOINT, POLYGON, MULTIPOLYGON, - LINESTRING, or MULTILINESTRING ''; - RETURN ''fail''; - END IF; - - IF ( (new_dim >3) or (new_dim <0) ) THEN - RAISE EXCEPTION ''invalid dimension''; - RETURN ''fail''; - END IF; - - IF ( schema_name != '''' ) THEN - schema_ok = ''f''; - FOR rec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP - schema_ok := ''t''; - END LOOP; - - if ( schema_ok <> ''t'' ) THEN - RAISE NOTICE ''Invalid schema name - using current_schema()''; - SELECT current_schema() into real_schema; - ELSE - real_schema = schema_name; - END IF; - - ELSE - SELECT current_schema() into real_schema; - END IF; - - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD COLUMN '' || quote_ident(column_name) || - '' geometry ''; - - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD CHECK (SRID('' || quote_ident(column_name) || - '') = '' || new_srid || '')'' ; - - IF (not(new_type = ''GEOMETRY'')) THEN - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD CHECK (geometrytype('' || - quote_ident(column_name) || '')='' || - quote_literal(new_type) || '' OR ('' || - quote_ident(column_name) || '') is null)''; - END IF; - - EXECUTE ''INSERT INTO geometry_columns VALUES ('' || - quote_literal('''') || '','' || - quote_literal(real_schema) || '','' || - quote_literal(table_name) || '','' || - quote_literal(column_name) || '','' || - new_dim || '','' || new_srid || '','' || - quote_literal(new_type) || '')''; - - EXECUTE ''select fix_geometry_columns()''; - --SELECT fix_geometry_columns(); - - return ''Geometry column '' || column_name || '' added to table '' - || real_schema || ''.'' || table_name || '' WITH a SRID of '' || new_srid || - '' and type '' || new_type; -END; -' LANGUAGE 'plpgsql' WITH (isstrict); --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( ,
, , , , ) --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS ' -DECLARE - ret text; -BEGIN - SELECT AddGeometryColumn('''',$1,$2,$3,$4,$5,$6) into ret; - RETURN ret; -END; -' LANGUAGE 'plpgsql' WITH (isstrict); - --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- DROPGEOMETRYCOLUMN( ,
, ) --- --- Removes geometry column reference from geometry_columns table, --- and actually drops the column. --- -CREATE FUNCTION DropGeometryColumn(varchar,varchar,varchar) - RETURNS text - AS -' -DECLARE - schema_name alias for $1; - table_name alias for $2; - column_name alias for $3; - - myrec RECORD; - real_schema name; - okay boolean; - query text; - -BEGIN - - - -- Find, check or fix schema_name - IF ( schema_name != '''' ) THEN - okay = ''f''; - - FOR myrec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP - okay := ''t''; - END LOOP; - - IF ( okay <> ''t'' ) THEN - RAISE NOTICE ''Invalid schema name - using current_schema()''; - SELECT current_schema() into real_schema; - ELSE - real_schema = schema_name; - END IF; - ELSE - SELECT current_schema() into real_schema; - END IF; - - -- first we find out if the column is in the geometry_columns table - okay = ''f''; - FOR myrec IN SELECT * from geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP - okay := ''t''; - END LOOP; - IF (okay <> ''t'') THEN - RAISE EXCEPTION ''column not found in geometry_columns table''; - RETURN ''f''; - END IF; - - - -- Remove ref from geometry_columns table - EXECUTE ''delete from geometry_columns where f_table_schema = '' || - quote_literal(real_schema) || '' and f_table_name = '' || - quote_literal(table_name) || '' and f_geometry_column = '' || - quote_literal(column_name); - - -- Remove table column - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || ''.'' || - quote_ident(table_name) || '' DROP COLUMN '' || - quote_ident(column_name); - - - RETURN real_schema || ''.'' || table_name || ''.'' || column_name ||'' effectively removed.''; - -END; -' -LANGUAGE 'plpgsql' WITH (isstrict); - #elif USE_VERSION == 75 -- - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -3763,10 +3061,21 @@ END; ' LANGUAGE 'plpgsql' ; --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- ADDGEOMETRYCOLUMN ( --- , ,
, , --- , , ) + +#endif // USE_VERSION == ... + + +--------------------------------------------- +-- +-- THIS part has been compressed to easly +-- see the differences between pgsql versions +-- +--------------------------------------------- + +----------------------------------------------------------------------- +-- ADDGEOMETRYCOLUMN +-- , ,
, , , , +----------------------------------------------------------------------- -- -- Type can be one of geometry, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON, -- MULTIPOLYGON, LINESTRING, or MULTILINESTRING. @@ -3779,6 +3088,7 @@ LANGUAGE 'plpgsql' ; -- Should also check the precision grid (future expansion). -- Calls fix_geometry_columns() at the end. -- +----------------------------------------------------------------------- CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS @@ -3791,10 +3101,12 @@ DECLARE new_srid alias for $5; new_type alias for $6; new_dim alias for $7; - +#if USE_VERSION >= 73 rec RECORD; schema_ok bool; real_schema name; +#endif + BEGIN IF ( not ( (new_type =''GEOMETRY'') or @@ -3810,14 +3122,15 @@ BEGIN GEOMETRY, GEOMETRYCOLLECTION, POINT, MULTIPOINT, POLYGON, MULTIPOLYGON, LINESTRING, or MULTILINESTRING ''; - RETURN ''fail''; + return ''fail''; END IF; IF ( (new_dim >3) or (new_dim <0) ) THEN RAISE EXCEPTION ''invalid dimension''; - RETURN ''fail''; + return ''fail''; END IF; +#if USE_VERSION >= 73 IF ( schema_name != '''' ) THEN schema_ok = ''f''; FOR rec IN SELECT nspname FROM pg_namespace WHERE text(nspname) = schema_name LOOP @@ -3834,45 +3147,73 @@ BEGIN ELSE SELECT current_schema() into real_schema; END IF; +#endif - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD COLUMN '' || quote_ident(column_name) || - '' geometry ''; - - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD CHECK (SRID('' || quote_ident(column_name) || - '') = '' || new_srid || '')'' ; - IF (not(new_type = ''GEOMETRY'')) THEN - EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || - ''.'' || quote_ident(table_name) || - '' ADD CHECK (geometrytype('' || - quote_ident(column_name) || '')='' || - quote_literal(new_type) || '' OR ('' || - quote_ident(column_name) || '') is null)''; - END IF; + EXECUTE ''ALTER TABLE '' || +#if USE_VERSION >= 73 + quote_ident(real_schema) || ''.'' || quote_ident(table_name) +#else + quote_ident(table_name) +#endif + || '' ADD COLUMN '' || quote_ident(column_name) || + '' geometry ''; EXECUTE ''INSERT INTO geometry_columns VALUES ('' || quote_literal('''') || '','' || +#if USE_VERSION >= 73 quote_literal(real_schema) || '','' || +#else + quote_literal('''') || '','' || +#endif quote_literal(table_name) || '','' || quote_literal(column_name) || '','' || new_dim || '','' || new_srid || '','' || quote_literal(new_type) || '')''; + EXECUTE ''ALTER TABLE '' || +#if USE_VERSION >= 73 + quote_ident(real_schema) || ''.'' || quote_ident(table_name) +#else + quote_ident(table_name) +#endif + || '' ADD CHECK (SRID('' || quote_ident(column_name) || + '') = '' || new_srid || '')'' ; + + IF (not(new_type = ''GEOMETRY'')) THEN + EXECUTE ''ALTER TABLE '' || +#if USE_VERSION >= 73 + quote_ident(real_schema) || ''.'' || quote_ident(table_name) +#else + quote_ident(table_name) +#endif + || '' ADD CHECK (geometrytype('' || + quote_ident(column_name) || '')='' || + quote_literal(new_type) || '' OR ('' || + quote_ident(column_name) || '') is null)''; + END IF; + EXECUTE ''select fix_geometry_columns()''; - --SELECT fix_geometry_columns(); return ''Geometry column '' || column_name || '' added to table '' - || real_schema || ''.'' || table_name || '' WITH a SRID of '' || new_srid || +#if USE_VERSION >= 73 + || real_schema || ''.'' || table_name +#else + || table_name +#endif + || '' WITH a SRID of '' || new_srid || '' and type '' || new_type; END; ' LANGUAGE 'plpgsql' WITH (isstrict); --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +---------------------------------------------------------------------------- -- ADDGEOMETRYCOLUMN ( ,
, , , , ) --- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +---------------------------------------------------------------------------- +-- +-- This is a wrapper to the real AddGeometryColumn, for use +-- when catalogue is undefined +-- +---------------------------------------------------------------------------- CREATE FUNCTION AddGeometryColumn(varchar,varchar,varchar,integer,varchar,integer) RETURNS text AS ' DECLARE ret text; @@ -3882,29 +3223,50 @@ BEGIN END; ' LANGUAGE 'plpgsql' WITH (isstrict); --- - - - - - - - - - - - - - - - - - - - - - - - - - - - --- DROPGEOMETRYCOLUMN( ,
, ) +---------------------------------------------------------------------------- +-- ADDGEOMETRYCOLUMN (
, , , , ) +---------------------------------------------------------------------------- -- --- Removes geometry column reference from geometry_columns table, --- and actually drops the column. +-- This is a wrapper to the real AddGeometryColumn, for use +-- when catalogue and schema are undefined -- -CREATE FUNCTION DropGeometryColumn(varchar,varchar,varchar) +---------------------------------------------------------------------------- +CREATE FUNCTION AddGeometryColumn(varchar,varchar,integer,varchar,integer) RETURNS text AS ' +DECLARE + ret text; +BEGIN + SELECT AddGeometryColumn('''','''',$1,$2,$3,$4,$5) into ret; + RETURN ret; +END; +' LANGUAGE 'plpgsql' WITH (isstrict); + +----------------------------------------------------------------------- +-- DROPGEOMETRYCOLUMN +-- , ,
, +----------------------------------------------------------------------- +-- +-- Removes geometry column reference from geometry_columns table. +-- Drops the column with pgsql >= 73. +-- Make some silly enforcements on it for pgsql < 73 +-- +----------------------------------------------------------------------- +CREATE FUNCTION DropGeometryColumn(varchar, varchar,varchar,varchar) RETURNS text AS ' DECLARE - schema_name alias for $1; - table_name alias for $2; - column_name alias for $3; - + catalog_name alias for $1; + schema_name alias for $2; + table_name alias for $3; + column_name alias for $4; myrec RECORD; - real_schema name; okay boolean; - query text; + real_schema name; BEGIN +#if USE_VERSION >= 73 -- Find, check or fix schema_name IF ( schema_name != '''' ) THEN okay = ''f''; @@ -3922,8 +3284,11 @@ BEGIN ELSE SELECT current_schema() into real_schema; END IF; +#else + real_schema = schema_name; +#endif // USE_VERSION >= 73 - -- first we find out if the column is in the geometry_columns table + -- Find out if the column is in the geometry_columns table okay = ''f''; FOR myrec IN SELECT * from geometry_columns where f_table_schema = text(real_schema) and f_table_name = table_name and f_geometry_column = column_name LOOP okay := ''t''; @@ -3933,17 +3298,25 @@ BEGIN RETURN ''f''; END IF; - -- Remove ref from geometry_columns table EXECUTE ''delete from geometry_columns where f_table_schema = '' || quote_literal(real_schema) || '' and f_table_name = '' || quote_literal(table_name) || '' and f_geometry_column = '' || quote_literal(column_name); - + +#if USE_VERSION < 73 + -- Remove not-null constraint to table column + EXECUTE ''update pg_attribute set attnotnull = false from pg_class where pg_attribute.attrelid = pg_class.oid and pg_class.relname = '' || quote_literal(table_name) ||'' and pg_attribute.attname = '' || quote_literal(column_name); + -- update the given table/column so that it it all NULLS + EXECUTE ''update "''||table_name||''" set "''||column_name||''"= NULL''; + -- add = NULL constraint to given table/column + EXECUTE ''ALTER TABLE "''||table_name||''" ADD CHECK ("''||column_name||''" IS NULL)''; +#else -- Remove table column EXECUTE ''ALTER TABLE '' || quote_ident(real_schema) || ''.'' || quote_ident(table_name) || '' DROP COLUMN '' || quote_ident(column_name); +#endif RETURN real_schema || ''.'' || table_name || ''.'' || column_name ||'' effectively removed.''; @@ -3952,7 +3325,48 @@ END; ' LANGUAGE 'plpgsql' WITH (isstrict); +----------------------------------------------------------------------- +-- DROPGEOMETRYCOLUMN +-- ,
, +----------------------------------------------------------------------- +-- +-- This is a wrapper to the real DropGeometryColumn, for use +-- when catalogue is undefined +-- +----------------------------------------------------------------------- +CREATE FUNCTION DropGeometryColumn(varchar,varchar,varchar) + RETURNS text + AS +' +DECLARE + ret text; +BEGIN + SELECT DropGeometryColumn('''',$1,$2,$3) into ret; + RETURN ret; +END; +' LANGUAGE 'plpgsql' WITH (isstrict); + +----------------------------------------------------------------------- +-- DROPGEOMETRYCOLUMN +--
, +----------------------------------------------------------------------- +-- +-- This is a wrapper to the real DropGeometryColumn, for use +-- when catalogue and schema is undefined. +-- +----------------------------------------------------------------------- +CREATE FUNCTION DropGeometryColumn(varchar,varchar) + RETURNS text + AS +' +DECLARE + ret text; +BEGIN + SELECT DropGeometryColumn('''','''',$1,$2) into ret; + RETURN ret; +END; +' LANGUAGE 'plpgsql' WITH (isstrict); -#endif // USE_VERSION == ... +----------------------------------------------------------------------- END TRANSACTION;