]> granicus.if.org Git - postgis/commitdiff
upgrade support for PostgreSQL 11
authorRegina Obe <lr@pcorp.us>
Sun, 25 Mar 2018 03:33:58 +0000 (03:33 +0000)
committerRegina Obe <lr@pcorp.us>
Sun, 25 Mar 2018 03:33:58 +0000 (03:33 +0000)
closes #4044 for PostGIS 2.4.4

git-svn-id: http://svn.osgeo.org/postgis/branches/2.4@16498 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
extensions/postgis_extension_helper.sql

diff --git a/NEWS b/NEWS
index 16a394272c381e7c67094814c93a2caf4c103b53..3e3953e6ea4d66b7faa95782d3a1dc22698d1a9a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -20,6 +20,7 @@ PostGIS 2.4.4dev
     - #3946, Compile support for PgSQL 11 (Paul Ramsey)
     - #3992, Use PKG_PROG_PKG_CONFIG macro from pkg.m4 to detect pkg-config
              (Bas Couwenberg)
+    - #4044, Upgrade support for PgSQL 11 (Regina Obe)
 
 
 PostGIS 2.4.3
index a554187ddda2571b299c32cea73533161eae2ce7..a5e6a0ad245bb4e7b0df5eb3a78f6361d186b979 100644 (file)
@@ -28,33 +28,56 @@ DECLARE
        var_class text := '';
        var_is_aggregate boolean := false;
        var_sql_list text := '';
+       var_pgsql_version integer := CASE WHEN split_part(s,'.',1)::integer > 9 THEN split_part(s,'.',1) || '0' ELSE split_part(s,'.', 1) || split_part(s,'.', 2) END AS v
+       FROM substring(version(), 'PostgreSQL ([0-9\.]+)') AS s;
 BEGIN
                var_class := CASE WHEN lower(param_type) = 'function' OR lower(param_type) = 'aggregate' THEN 'pg_proc' ELSE '' END;
                var_is_aggregate := CASE WHEN lower(param_type) = 'aggregate' THEN true ELSE false END;
-               var_sql_list := 'SELECT ''ALTER EXTENSION '' || e.extname || '' DROP '' || $3 || '' '' || COALESCE(proc.proname || ''('' || oidvectortypes(proc.proargtypes) || '')'',typ.typname, cd.relname, op.oprname,
-                               cs.typname || '' AS '' || ct.typname || '') '', opcname, opfname) || '';'' AS remove_command
-               FROM pg_depend As d INNER JOIN pg_extension As e
-                       ON d.refobjid = e.oid INNER JOIN pg_class As c ON
-                               c.oid = d.classid
-                               LEFT JOIN pg_proc AS proc ON proc.oid = d.objid
-                               LEFT JOIN pg_type AS typ ON typ.oid = d.objid
-                               LEFT JOIN pg_class As cd ON cd.oid = d.objid
-                               LEFT JOIN pg_operator As op ON op.oid = d.objid
-                               LEFT JOIN pg_cast AS ca ON ca.oid = d.objid
-                               LEFT JOIN pg_type AS cs ON ca.castsource = cs.oid
-                               LEFT JOIN pg_type AS ct ON ca.casttarget = ct.oid
-                               LEFT JOIN pg_opclass As oc ON oc.oid = d.objid
-                               LEFT JOIN pg_opfamily As ofa ON ofa.oid = d.objid
-               WHERE d.deptype = ''e'' and e.extname = $1 and c.relname = $2 AND COALESCE(proc.proisagg, false) = $4;';
+
+               IF var_pgsql_version < 110 THEN
+                       var_sql_list := $sql$SELECT 'ALTER EXTENSION ' || e.extname || ' DROP ' || $3 || ' ' || COALESCE(proc.proname || '(' || oidvectortypes(proc.proargtypes) || ')' ,typ.typname, cd.relname, op.oprname,
+                                       cs.typname || ' AS ' || ct.typname || ') ', opcname, opfname) || ';' AS remove_command
+                       FROM pg_depend As d INNER JOIN pg_extension As e
+                               ON d.refobjid = e.oid INNER JOIN pg_class As c ON
+                                       c.oid = d.classid
+                                       LEFT JOIN pg_proc AS proc ON proc.oid = d.objid
+                                       LEFT JOIN pg_type AS typ ON typ.oid = d.objid
+                                       LEFT JOIN pg_class As cd ON cd.oid = d.objid
+                                       LEFT JOIN pg_operator As op ON op.oid = d.objid
+                                       LEFT JOIN pg_cast AS ca ON ca.oid = d.objid
+                                       LEFT JOIN pg_type AS cs ON ca.castsource = cs.oid
+                                       LEFT JOIN pg_type AS ct ON ca.casttarget = ct.oid
+                                       LEFT JOIN pg_opclass As oc ON oc.oid = d.objid
+                                       LEFT JOIN pg_opfamily As ofa ON ofa.oid = d.objid
+                       WHERE d.deptype = 'e' and e.extname = $1 and c.relname = $2 AND COALESCE(proc.proisagg, false) = $4;$sql$;
+               ELSE -- for PostgreSQL 11 and above, they removed proc.proisagg among others and replaced with some func type thing
+                       var_sql_list := $sql$SELECT 'ALTER EXTENSION ' || e.extname || ' DROP ' || $3 || ' ' || COALESCE(proc.proname || '(' || oidvectortypes(proc.proargtypes) || ')' ,typ.typname, cd.relname, op.oprname,
+                                       cs.typname || ' AS ' || ct.typname || ') ', opcname, opfname) || ';' AS remove_command
+                       FROM pg_depend As d INNER JOIN pg_extension As e
+                               ON d.refobjid = e.oid INNER JOIN pg_class As c ON
+                                       c.oid = d.classid
+                                       LEFT JOIN pg_proc AS proc ON proc.oid = d.objid
+                                       LEFT JOIN pg_type AS typ ON typ.oid = d.objid
+                                       LEFT JOIN pg_class As cd ON cd.oid = d.objid
+                                       LEFT JOIN pg_operator As op ON op.oid = d.objid
+                                       LEFT JOIN pg_cast AS ca ON ca.oid = d.objid
+                                       LEFT JOIN pg_type AS cs ON ca.castsource = cs.oid
+                                       LEFT JOIN pg_type AS ct ON ca.casttarget = ct.oid
+                                       LEFT JOIN pg_opclass As oc ON oc.oid = d.objid
+                                       LEFT JOIN pg_opfamily As ofa ON ofa.oid = d.objid
+                       WHERE d.deptype = 'e' and e.extname = $1 and c.relname = $2 AND (proc.prokind = 'a')  = $4;$sql$;
+               END IF;
+
                FOR var_r IN EXECUTE var_sql_list  USING param_extension, var_class, param_type, var_is_aggregate
-        LOOP
-            var_sql := var_sql || var_r.remove_command || ';';
-        END LOOP;
-        IF var_sql > '' THEN
-            EXECUTE var_sql;
-            var_result := true;
-        END IF;
-        RETURN var_result;
+               LOOP
+                       var_sql := var_sql || var_r.remove_command || ';';
+               END LOOP;
+               IF var_sql > '' THEN
+                       EXECUTE var_sql;
+                       var_result := true;
+               END IF;
+
+               RETURN var_result;
 END;
 $$
 LANGUAGE plpgsql VOLATILE;