????
Current Path : C:/opt/pgsql/share/contrib/postgis-3.4/ |
Current File : C:/opt/pgsql/share/contrib/postgis-3.4/common_before_upgrade.sql |
-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- -- PostGIS - Spatial Types for PostgreSQL -- http://postgis.net -- -- Copyright (C) 2011-2012 Sandro Santilli <strk@kbt.io> -- Copyright (C) 2010-2013 Regina Obe <lr@pcorp.us> -- Copyright (C) 2009 Paul Ramsey <pramsey@cleverelephant.ca> -- -- This is free software; you can redistribute and/or modify it under -- the terms of the GNU General Public Licence. See the COPYING file. -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- This file contains utility functions for use by upgrade scripts -- Changes to this file affect *upgrade*.sql script. -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- Helper function to drop functions when they match the full signature -- -- Requires name and __exact arguments__ as extracted from pg_catalog.pg_get_function_arguments -- You can extract the old function arguments using a query like: -- -- SELECT pg_get_function_arguments('st_intersection(geometry,geometry,float8)'::regprocedure); -- -- Or: -- -- SELECT pg_get_function_arguments(oid) as args -- FROM pg_catalog.pg_proc -- WHERE proname = 'st_asgeojson' -- CREATE OR REPLACE FUNCTION _postgis_drop_function_by_identity( function_name text, function_arguments text, deprecated_in_version text DEFAULT 'xxx' ) RETURNS void AS $$ DECLARE sql text; postgis_namespace OID; matching_function pg_catalog.pg_proc; detail TEXT; deprecated_suffix TEXT := '_deprecated_by_postgis_' || deprecated_in_version; BEGIN -- Fetch install namespace for PostGIS SELECT n.oid FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON p.pronamespace = n.oid WHERE proname = 'postgis_full_version' INTO postgis_namespace; -- Find a function matching the given signature SELECT * FROM pg_catalog.pg_proc p WHERE pronamespace = postgis_namespace AND pg_catalog.LOWER(p.proname) = pg_catalog.LOWER(function_name) AND pg_catalog.pg_function_is_visible(p.oid) AND pg_catalog.LOWER(pg_catalog.pg_get_function_identity_arguments(p.oid)) = pg_catalog.LOWER(function_arguments) INTO matching_function; IF matching_function.oid IS NOT NULL THEN sql := format('ALTER FUNCTION %s RENAME TO %I', matching_function.oid::regprocedure, matching_function.proname || deprecated_suffix ); RAISE DEBUG 'SQL query: %', sql; BEGIN EXECUTE sql; EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS detail := PG_EXCEPTION_DETAIL; RAISE EXCEPTION 'Could not rename deprecated function %, got % (%)', matching_function, SQLERRM, SQLSTATE USING DETAIL = detail; END; END IF; END; $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION _postgis_drop_function_by_signature( function_signature text, deprecated_in_version text DEFAULT 'xxx' ) RETURNS void AS $$ DECLARE sql text; detail TEXT; newname TEXT; proc RECORD; deprecated_suffix TEXT := '_deprecated_by_postgis_' || deprecated_in_version; BEGIN -- Check if the deprecated function exists BEGIN SELECT * FROM pg_catalog.pg_proc WHERE oid = function_signature::regprocedure INTO proc; EXCEPTION WHEN undefined_function OR undefined_object THEN RAISE DEBUG 'Deprecated function % does not exist', function_signature; RETURN; WHEN others THEN GET STACKED DIAGNOSTICS detail := PG_EXCEPTION_DETAIL; RAISE WARNING 'Could not check deprecated function % existance, got % (%), assuming it does not exist', function_signature, SQLERRM, SQLSTATE USING DETAIL = detail; RETURN; END; sql := pg_catalog.format( 'ALTER FUNCTION %s RENAME TO %I', proc.oid::regprocedure, proc.proname || deprecated_suffix ); EXECUTE sql; END; $$ LANGUAGE plpgsql;