Folks,

It's possible to arrange for schemas to precede pg_catalog and
information_schema in a search_path setting, and when that's done,
hilarity can ensue, especially when someone has created functions with
identical signatures but non-identical behavior.  People who do that
should probably be presumed to be attackers, but it's conceivable that
such hilarity could merely be poor judgement combined with buggy code.

Please find attached a patch against master to do $Subject, which
tones down the hilarity, at least in information_schema.  I did not
attempt to go through and make sure that functions calls are
schema-qualified all through the back-end, but that seems like a
worthwhile project on grounds of reducing the search_path attack
surface.

Another way to fix this, which I know will be controversial, is simply
to mandate that pg_catalog (and possibly information_schema) be
non-changeably first in the search_path.

What say?

Best,
David.
-- 
David Fetter <david(at)fetter(dot)org> http://fetter.org/
Phone: +1 415 235 3778

Remember to vote!
Consider donating to Postgres: http://www.postgresql.org/about/donate
>From 41e10d687817f12eb0eadd5d4b967696eccd1c1f Mon Sep 17 00:00:00 2001
From: David Fetter <da...@fetter.org>
Date: Mon, 18 Dec 2017 16:35:28 -0500
Subject: [PATCH] Schema-qualified function calls

---
 src/backend/catalog/information_schema.sql | 156 ++++++++++++++---------------
 1 file changed, 78 insertions(+), 78 deletions(-)

diff --git a/src/backend/catalog/information_schema.sql b/src/backend/catalog/information_schema.sql
index 360725d59a..de4dcac3c3 100644
--- a/src/backend/catalog/information_schema.sql
+++ b/src/backend/catalog/information_schema.sql
@@ -186,7 +186,7 @@ CREATE FUNCTION _pg_interval_type(typid oid, mod int4) RETURNS text
     AS
 $$SELECT
   CASE WHEN $1 IN (1186) /* interval */
-           THEN upper(substring(format_type($1, $2) from 'interval[()0-9]* #"%#"' for '#'))
+           THEN pg_catalog.upper(substring(format_type($1, $2) from 'interval[()0-9]* #"%#"' for '#'))
        ELSE null
   END$$;
 
@@ -262,7 +262,7 @@ CREATE VIEW applicable_roles AS
     FROM pg_auth_members m
          JOIN pg_authid a ON (m.member = a.oid)
          JOIN pg_authid b ON (m.roleid = b.oid)
-    WHERE pg_has_role(a.oid, 'USAGE');
+    WHERE pg_catalog.pg_has_role(a.oid, 'USAGE');
 
 GRANT SELECT ON applicable_roles TO PUBLIC;
 
@@ -312,12 +312,12 @@ CREATE VIEW attributes AS
              AS data_type,
 
            CAST(
-             _pg_char_max_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_char_max_length(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS character_maximum_length,
 
            CAST(
-             _pg_char_octet_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_char_octet_length(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS character_octet_length,
 
@@ -330,27 +330,27 @@ CREATE VIEW attributes AS
            CAST(co.collname AS sql_identifier) AS collation_name,
 
            CAST(
-             _pg_numeric_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_numeric_precision(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS numeric_precision,
 
            CAST(
-             _pg_numeric_precision_radix(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_numeric_precision_radix(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS numeric_precision_radix,
 
            CAST(
-             _pg_numeric_scale(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_numeric_scale(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS numeric_scale,
 
            CAST(
-             _pg_datetime_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_datetime_precision(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS datetime_precision,
 
            CAST(
-             _pg_interval_type(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_interval_type(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS character_data)
              AS interval_type,
            CAST(null AS cardinal_number) AS interval_precision,
@@ -425,7 +425,7 @@ CREATE VIEW check_constraint_routine_usage AS
       AND d.refobjid = p.oid
       AND d.refclassid = 'pg_catalog.pg_proc'::regclass
       AND p.pronamespace = np.oid
-      AND pg_has_role(p.proowner, 'USAGE');
+      AND pg_catalog.pg_has_role(p.proowner, 'USAGE');
 
 GRANT SELECT ON check_constraint_routine_usage TO PUBLIC;
 
@@ -445,7 +445,7 @@ CREATE VIEW check_constraints AS
            LEFT OUTER JOIN pg_namespace rs ON (rs.oid = con.connamespace)
            LEFT OUTER JOIN pg_class c ON (c.oid = con.conrelid)
            LEFT OUTER JOIN pg_type t ON (t.oid = con.contypid)
-    WHERE pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE')
+    WHERE pg_catalog.pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE')
       AND con.contype = 'c'
 
     UNION
@@ -463,7 +463,7 @@ CREATE VIEW check_constraints AS
       AND NOT a.attisdropped
       AND a.attnotnull
       AND r.relkind IN ('r', 'p')
-      AND pg_has_role(r.relowner, 'USAGE');
+      AND pg_catalog.pg_has_role(r.relowner, 'USAGE');
 
 GRANT SELECT ON check_constraints TO PUBLIC;
 
@@ -537,7 +537,7 @@ CREATE VIEW column_domain_usage AS
           AND c.relkind IN ('r', 'v', 'f', 'p')
           AND a.attnum > 0
           AND NOT a.attisdropped
-          AND pg_has_role(t.typowner, 'USAGE');
+          AND pg_catalog.pg_has_role(t.typowner, 'USAGE');
 
 GRANT SELECT ON column_domain_usage TO PUBLIC;
 
@@ -558,7 +558,7 @@ CREATE VIEW column_privileges AS
            CAST(
              CASE WHEN
                   -- object owner always has grant options
-                  pg_has_role(x.grantee, x.relowner, 'USAGE')
+                  pg_catalog.pg_has_role(x.grantee, x.relowner, 'USAGE')
                   OR x.grantable
                   THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
 
@@ -610,7 +610,7 @@ CREATE VIEW column_privileges AS
           AND x.grantor = u_grantor.oid
           AND x.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'REFERENCES')
           AND (pg_has_role(u_grantor.oid, 'USAGE')
-               OR pg_has_role(grantee.oid, 'USAGE')
+               OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
                OR grantee.rolname = 'PUBLIC');
 
 GRANT SELECT ON column_privileges TO PUBLIC;
@@ -640,7 +640,7 @@ CREATE VIEW column_udt_usage AS
           AND nc.oid = c.relnamespace
           AND a.attnum > 0 AND NOT a.attisdropped
           AND c.relkind in ('r', 'v', 'f', 'p')
-          AND pg_has_role(coalesce(bt.typowner, t.typowner), 'USAGE');
+          AND pg_catalog.pg_has_role(coalesce(bt.typowner, t.typowner), 'USAGE');
 
 GRANT SELECT ON column_udt_usage TO PUBLIC;
 
@@ -675,37 +675,37 @@ CREATE VIEW columns AS
              AS data_type,
 
            CAST(
-             _pg_char_max_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_char_max_length(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS character_maximum_length,
 
            CAST(
-             _pg_char_octet_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_char_octet_length(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS character_octet_length,
 
            CAST(
-             _pg_numeric_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_numeric_precision(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS numeric_precision,
 
            CAST(
-             _pg_numeric_precision_radix(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_numeric_precision_radix(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS numeric_precision_radix,
 
            CAST(
-             _pg_numeric_scale(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_numeric_scale(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS numeric_scale,
 
            CAST(
-             _pg_datetime_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_datetime_precision(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS cardinal_number)
              AS datetime_precision,
 
            CAST(
-             _pg_interval_type(_pg_truetypid(a, t), _pg_truetypmod(a, t))
+             information_schema._pg_interval_type(_pg_truetypid(a, t), information_schema._pg_truetypmod(a, t))
              AS character_data)
              AS interval_type,
            CAST(null AS cardinal_number) AS interval_precision,
@@ -750,7 +750,7 @@ CREATE VIEW columns AS
 
            CAST(CASE WHEN c.relkind IN ('r', 'p') OR
                           (c.relkind IN ('v', 'f') AND
-                           pg_column_is_updatable(c.oid, a.attnum, false))
+                           pg_catalog.pg_column_is_updatable(c.oid, a.attnum, false))
                 THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_updatable
 
     FROM (pg_attribute a LEFT JOIN pg_attrdef ad ON attrelid = adrelid AND attnum = adnum)
@@ -763,7 +763,7 @@ CREATE VIEW columns AS
          LEFT JOIN (pg_depend dep JOIN pg_sequence seq ON (dep.classid = 'pg_class'::regclass AND dep.objid = seq.seqrelid AND dep.deptype = 'i'))
            ON (dep.refclassid = 'pg_class'::regclass AND dep.refobjid = c.oid AND dep.refobjsubid = a.attnum)
 
-    WHERE (NOT pg_is_other_temp_schema(nc.oid))
+    WHERE (NOT pg_catalog.pg_is_other_temp_schema(nc.oid))
 
           AND a.attnum > 0 AND NOT a.attisdropped
           AND c.relkind IN ('r', 'v', 'f', 'p')
@@ -822,7 +822,7 @@ CREATE VIEW constraint_column_usage AS
 
       ) AS x (tblschema, tblname, tblowner, colname, cstrschema, cstrname)
 
-    WHERE pg_has_role(x.tblowner, 'USAGE');
+    WHERE pg_catalog.pg_has_role(x.tblowner, 'USAGE');
 
 GRANT SELECT ON constraint_column_usage TO PUBLIC;
 
@@ -855,7 +855,7 @@ CREATE VIEW constraint_table_usage AS
           AND ( (c.contype = 'f' AND c.confrelid = r.oid)
              OR (c.contype IN ('p', 'u') AND c.conrelid = r.oid) )
           AND r.relkind IN ('r', 'p')
-          AND pg_has_role(r.relowner, 'USAGE');
+          AND pg_catalog.pg_has_role(r.relowner, 'USAGE');
 
 GRANT SELECT ON constraint_table_usage TO PUBLIC;
 
@@ -925,7 +925,7 @@ CREATE VIEW domain_udt_usage AS
           AND t.typbasetype = bt.oid
           AND bt.typnamespace = nbt.oid
           AND t.typtype = 'd'
-          AND pg_has_role(bt.typowner, 'USAGE');
+          AND pg_catalog.pg_has_role(bt.typowner, 'USAGE');
 
 GRANT SELECT ON domain_udt_usage TO PUBLIC;
 
@@ -948,12 +948,12 @@ CREATE VIEW domains AS
              AS data_type,
 
            CAST(
-             _pg_char_max_length(t.typbasetype, t.typtypmod)
+             information_schema._pg_char_max_length(t.typbasetype, t.typtypmod)
              AS cardinal_number)
              AS character_maximum_length,
 
            CAST(
-             _pg_char_octet_length(t.typbasetype, t.typtypmod)
+             information_schema._pg_char_octet_length(t.typbasetype, t.typtypmod)
              AS cardinal_number)
              AS character_octet_length,
 
@@ -966,27 +966,27 @@ CREATE VIEW domains AS
            CAST(co.collname AS sql_identifier) AS collation_name,
 
            CAST(
-             _pg_numeric_precision(t.typbasetype, t.typtypmod)
+             information_schema._pg_numeric_precision(t.typbasetype, t.typtypmod)
              AS cardinal_number)
              AS numeric_precision,
 
            CAST(
-             _pg_numeric_precision_radix(t.typbasetype, t.typtypmod)
+             information_schema._pg_numeric_precision_radix(t.typbasetype, t.typtypmod)
              AS cardinal_number)
              AS numeric_precision_radix,
 
            CAST(
-             _pg_numeric_scale(t.typbasetype, t.typtypmod)
+             information_schema._pg_numeric_scale(t.typbasetype, t.typtypmod)
              AS cardinal_number)
              AS numeric_scale,
 
            CAST(
-             _pg_datetime_precision(t.typbasetype, t.typtypmod)
+             information_schema._pg_datetime_precision(t.typbasetype, t.typtypmod)
              AS cardinal_number)
              AS datetime_precision,
 
            CAST(
-             _pg_interval_type(t.typbasetype, t.typtypmod)
+             information_schema._pg_interval_type(t.typbasetype, t.typtypmod)
              AS character_data)
              AS interval_type,
            CAST(null AS cardinal_number) AS interval_precision,
@@ -1027,7 +1027,7 @@ GRANT SELECT ON domains TO PUBLIC;
 CREATE VIEW enabled_roles AS
     SELECT CAST(a.rolname AS sql_identifier) AS role_name
     FROM pg_authid a
-    WHERE pg_has_role(a.oid, 'USAGE');
+    WHERE pg_catalog.pg_has_role(a.oid, 'USAGE');
 
 GRANT SELECT ON enabled_roles TO PUBLIC;
 
@@ -1055,7 +1055,7 @@ CREATE VIEW key_column_usage AS
            CAST(a.attname AS sql_identifier) AS column_name,
            CAST((ss.x).n AS cardinal_number) AS ordinal_position,
            CAST(CASE WHEN contype = 'f' THEN
-                       _pg_index_position(ss.conindid, ss.confkey[(ss.x).n])
+                       information_schema._pg_index_position(ss.conindid, ss.confkey[(ss.x).n])
                      ELSE NULL
                 END AS cardinal_number)
              AS position_in_unique_constraint
@@ -1064,7 +1064,7 @@ CREATE VIEW key_column_usage AS
                  nc.nspname AS nc_nspname, nr.nspname AS nr_nspname,
                  c.oid AS coid, c.conname, c.contype, c.conindid,
                  c.confkey, c.confrelid,
-                 _pg_expandarray(c.conkey) AS x
+                 information_schema._pg_expandarray(c.conkey) AS x
           FROM pg_namespace nr, pg_class r, pg_namespace nc,
                pg_constraint c
           WHERE nr.oid = r.relnamespace
@@ -1072,7 +1072,7 @@ CREATE VIEW key_column_usage AS
                 AND nc.oid = c.connamespace
                 AND c.contype IN ('p', 'u', 'f')
                 AND r.relkind IN ('r', 'p')
-                AND (NOT pg_is_other_temp_schema(nr.oid)) ) AS ss
+                AND (NOT pg_catalog.pg_is_other_temp_schema(nr.oid)) ) AS ss
     WHERE ss.roid = a.attrelid
           AND a.attnum = (ss.x).x
           AND NOT a.attisdropped
@@ -1156,15 +1156,15 @@ CREATE VIEW parameters AS
            CAST(null AS cardinal_number) AS maximum_cardinality,
            CAST((ss.x).n AS sql_identifier) AS dtd_identifier,
            CAST(
-             CASE WHEN pg_has_role(proowner, 'USAGE')
-                  THEN pg_get_function_arg_default(p_oid, (ss.x).n)
+             CASE WHEN pg_catalog.pg_has_role(proowner, 'USAGE')
+                  THEN pg_catalog.pg_get_function_arg_default(p_oid, (ss.x).n)
                   ELSE NULL END
              AS character_data) AS parameter_default
 
     FROM pg_type t, pg_namespace nt,
          (SELECT n.nspname AS n_nspname, p.proname, p.oid AS p_oid, p.proowner,
                  p.proargnames, p.proargmodes,
-                 _pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
+                 information_schema._pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
           FROM pg_namespace n, pg_proc p
           WHERE n.oid = p.pronamespace
                 AND (pg_has_role(p.proowner, 'USAGE') OR
@@ -1244,7 +1244,7 @@ CREATE VIEW referential_constraints AS
             AND pkc.conrelid = con.confrelid
          LEFT JOIN pg_namespace npkc ON pkc.connamespace = npkc.oid
 
-    WHERE pg_has_role(c.relowner, 'USAGE')
+    WHERE pg_catalog.pg_has_role(c.relowner, 'USAGE')
           -- SELECT privilege omitted, per SQL standard
           OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
           OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') ;
@@ -1328,7 +1328,7 @@ CREATE VIEW routine_privileges AS
            CAST(
              CASE WHEN
                   -- object owner always has grant options
-                  pg_has_role(grantee.oid, p.proowner, 'USAGE')
+                  pg_catalog.pg_has_role(grantee.oid, p.proowner, 'USAGE')
                   OR p.grantable
                   THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
 
@@ -1348,7 +1348,7 @@ CREATE VIEW routine_privileges AS
           AND u_grantor.oid = p.grantor
           AND p.prtype IN ('EXECUTE')
           AND (pg_has_role(u_grantor.oid, 'USAGE')
-               OR pg_has_role(grantee.oid, 'USAGE')
+               OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
                OR grantee.rolname = 'PUBLIC');
 
 GRANT SELECT ON routine_privileges TO PUBLIC;
@@ -1454,7 +1454,7 @@ CREATE VIEW routines AS
            CAST(CASE WHEN l.lanname = 'sql' THEN 'SQL' ELSE 'EXTERNAL' END AS character_data)
              AS routine_body,
            CAST(
-             CASE WHEN pg_has_role(p.proowner, 'USAGE') THEN p.prosrc ELSE null END
+             CASE WHEN pg_catalog.pg_has_role(p.proowner, 'USAGE') THEN p.prosrc ELSE null END
              AS character_data) AS routine_definition,
            CAST(
              CASE WHEN l.lanname = 'c' THEN p.prosrc ELSE null END
@@ -1562,7 +1562,7 @@ CREATE VIEW sequences AS
     WHERE c.relnamespace = nc.oid
           AND c.relkind = 'S'
           AND NOT EXISTS (SELECT 1 FROM pg_depend WHERE classid = 'pg_class'::regclass AND objid = c.oid AND deptype = 'i')
-          AND (NOT pg_is_other_temp_schema(nc.oid))
+          AND (NOT pg_catalog.pg_is_other_temp_schema(nc.oid))
           AND c.oid = s.seqrelid
           AND (pg_has_role(c.relowner, 'USAGE')
                OR has_sequence_privilege(c.oid, 'SELECT, UPDATE, USAGE') );
@@ -1794,7 +1794,7 @@ CREATE VIEW table_constraints AS
           AND c.conrelid = r.oid
           AND c.contype NOT IN ('t', 'x')  -- ignore nonstandard constraints
           AND r.relkind IN ('r', 'p')
-          AND (NOT pg_is_other_temp_schema(nr.oid))
+          AND (NOT pg_catalog.pg_is_other_temp_schema(nr.oid))
           AND (pg_has_role(r.relowner, 'USAGE')
                -- SELECT privilege omitted, per SQL standard
                OR has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
@@ -1824,7 +1824,7 @@ CREATE VIEW table_constraints AS
           AND a.attnum > 0
           AND NOT a.attisdropped
           AND r.relkind IN ('r', 'p')
-          AND (NOT pg_is_other_temp_schema(nr.oid))
+          AND (NOT pg_catalog.pg_is_other_temp_schema(nr.oid))
           AND (pg_has_role(r.relowner, 'USAGE')
                -- SELECT privilege omitted, per SQL standard
                OR has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
@@ -1856,7 +1856,7 @@ CREATE VIEW table_privileges AS
            CAST(
              CASE WHEN
                   -- object owner always has grant options
-                  pg_has_role(grantee.oid, c.relowner, 'USAGE')
+                  pg_catalog.pg_has_role(grantee.oid, c.relowner, 'USAGE')
                   OR c.grantable
                   THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable,
            CAST(CASE WHEN c.prtype = 'SELECT' THEN 'YES' ELSE 'NO' END AS yes_or_no) AS with_hierarchy
@@ -1878,7 +1878,7 @@ CREATE VIEW table_privileges AS
           AND c.grantor = u_grantor.oid
           AND c.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'REFERENCES', 'TRIGGER')
           AND (pg_has_role(u_grantor.oid, 'USAGE')
-               OR pg_has_role(grantee.oid, 'USAGE')
+               OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
                OR grantee.rolname = 'PUBLIC');
 
 GRANT SELECT ON table_privileges TO PUBLIC;
@@ -1916,7 +1916,7 @@ CREATE VIEW tables AS
            CAST(c.relname AS sql_identifier) AS table_name,
 
            CAST(
-             CASE WHEN nc.oid = pg_my_temp_schema() THEN 'LOCAL TEMPORARY'
+             CASE WHEN nc.oid = pg_catalog.pg_my_temp_schema() THEN 'LOCAL TEMPORARY'
                   WHEN c.relkind IN ('r', 'p') THEN 'BASE TABLE'
                   WHEN c.relkind = 'v' THEN 'VIEW'
                   WHEN c.relkind = 'f' THEN 'FOREIGN'
@@ -1933,7 +1933,7 @@ CREATE VIEW tables AS
            CAST(CASE WHEN c.relkind IN ('r', 'p') OR
                           (c.relkind IN ('v', 'f') AND
                            -- 1 << CMD_INSERT
-                           pg_relation_is_updatable(c.oid, false) & 8 = 8)
+                           pg_catalog.pg_relation_is_updatable(c.oid, false) & 8 = 8)
                 THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_insertable_into,
 
            CAST(CASE WHEN t.typname IS NOT NULL THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_typed,
@@ -1943,7 +1943,7 @@ CREATE VIEW tables AS
            LEFT JOIN (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid)) ON (c.reloftype = t.oid)
 
     WHERE c.relkind IN ('r', 'v', 'f', 'p')
-          AND (NOT pg_is_other_temp_schema(nc.oid))
+          AND (NOT pg_catalog.pg_is_other_temp_schema(nc.oid))
           AND (pg_has_role(c.relowner, 'USAGE')
                OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
                OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
@@ -2023,7 +2023,7 @@ CREATE VIEW triggered_update_columns AS
           AND t.oid = ta.tgoid
           AND (a.attrelid, a.attnum) = (t.tgrelid, ta.tgattnum)
           AND NOT t.tgisinternal
-          AND (NOT pg_is_other_temp_schema(n.oid))
+          AND (NOT pg_catalog.pg_is_other_temp_schema(n.oid))
           AND (pg_has_role(c.relowner, 'USAGE')
                -- SELECT privilege omitted, per SQL standard
                OR has_column_privilege(c.oid, a.attnum, 'INSERT, UPDATE, REFERENCES') );
@@ -2087,7 +2087,7 @@ CREATE VIEW triggers AS
            CAST(null AS cardinal_number) AS action_order,
            -- XXX strange hacks follow
            CAST(
-             CASE WHEN pg_has_role(c.relowner, 'USAGE')
+             CASE WHEN pg_catalog.pg_has_role(c.relowner, 'USAGE')
                THEN (regexp_match(pg_get_triggerdef(t.oid), E'.{35,} WHEN \\((.+)\\) EXECUTE PROCEDURE'))[1]
                ELSE null END
              AS character_data) AS action_condition,
@@ -2120,7 +2120,7 @@ CREATE VIEW triggers AS
           AND c.oid = t.tgrelid
           AND t.tgtype & em.num <> 0
           AND NOT t.tgisinternal
-          AND (NOT pg_is_other_temp_schema(n.oid))
+          AND (NOT pg_catalog.pg_is_other_temp_schema(n.oid))
           AND (pg_has_role(c.relowner, 'USAGE')
                -- SELECT privilege omitted, per SQL standard
                OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
@@ -2144,7 +2144,7 @@ CREATE VIEW udt_privileges AS
            CAST(
              CASE WHEN
                   -- object owner always has grant options
-                  pg_has_role(grantee.oid, t.typowner, 'USAGE')
+                  pg_catalog.pg_has_role(grantee.oid, t.typowner, 'USAGE')
                   OR t.grantable
                   THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
 
@@ -2165,7 +2165,7 @@ CREATE VIEW udt_privileges AS
           AND t.grantor = u_grantor.oid
           AND t.prtype IN ('USAGE')
           AND (pg_has_role(u_grantor.oid, 'USAGE')
-               OR pg_has_role(grantee.oid, 'USAGE')
+               OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
                OR grantee.rolname = 'PUBLIC');
 
 GRANT SELECT ON udt_privileges TO PUBLIC;
@@ -2230,7 +2230,7 @@ CREATE VIEW usage_privileges AS
            CAST(
              CASE WHEN
                   -- object owner always has grant options
-                  pg_has_role(grantee.oid, t.typowner, 'USAGE')
+                  pg_catalog.pg_has_role(grantee.oid, t.typowner, 'USAGE')
                   OR t.grantable
                   THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
 
@@ -2251,7 +2251,7 @@ CREATE VIEW usage_privileges AS
           AND t.grantor = u_grantor.oid
           AND t.prtype IN ('USAGE')
           AND (pg_has_role(u_grantor.oid, 'USAGE')
-               OR pg_has_role(grantee.oid, 'USAGE')
+               OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
                OR grantee.rolname = 'PUBLIC')
 
     UNION ALL
@@ -2267,7 +2267,7 @@ CREATE VIEW usage_privileges AS
            CAST(
              CASE WHEN
                   -- object owner always has grant options
-                  pg_has_role(grantee.oid, fdw.fdwowner, 'USAGE')
+                  pg_catalog.pg_has_role(grantee.oid, fdw.fdwowner, 'USAGE')
                   OR fdw.grantable
                   THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
 
@@ -2285,7 +2285,7 @@ CREATE VIEW usage_privileges AS
           AND grantee.oid = fdw.grantee
           AND fdw.prtype IN ('USAGE')
           AND (pg_has_role(u_grantor.oid, 'USAGE')
-               OR pg_has_role(grantee.oid, 'USAGE')
+               OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
                OR grantee.rolname = 'PUBLIC')
 
     UNION ALL
@@ -2301,7 +2301,7 @@ CREATE VIEW usage_privileges AS
            CAST(
              CASE WHEN
                   -- object owner always has grant options
-                  pg_has_role(grantee.oid, srv.srvowner, 'USAGE')
+                  pg_catalog.pg_has_role(grantee.oid, srv.srvowner, 'USAGE')
                   OR srv.grantable
                   THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
 
@@ -2319,7 +2319,7 @@ CREATE VIEW usage_privileges AS
           AND grantee.oid = srv.grantee
           AND srv.prtype IN ('USAGE')
           AND (pg_has_role(u_grantor.oid, 'USAGE')
-               OR pg_has_role(grantee.oid, 'USAGE')
+               OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
                OR grantee.rolname = 'PUBLIC')
 
     UNION ALL
@@ -2335,7 +2335,7 @@ CREATE VIEW usage_privileges AS
            CAST(
              CASE WHEN
                   -- object owner always has grant options
-                  pg_has_role(grantee.oid, c.relowner, 'USAGE')
+                  pg_catalog.pg_has_role(grantee.oid, c.relowner, 'USAGE')
                   OR c.grantable
                   THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
 
@@ -2356,7 +2356,7 @@ CREATE VIEW usage_privileges AS
           AND c.grantor = u_grantor.oid
           AND c.prtype IN ('USAGE')
           AND (pg_has_role(u_grantor.oid, 'USAGE')
-               OR pg_has_role(grantee.oid, 'USAGE')
+               OR pg_catalog.pg_has_role(grantee.oid, 'USAGE')
                OR grantee.rolname = 'PUBLIC');
 
 GRANT SELECT ON usage_privileges TO PUBLIC;
@@ -2464,7 +2464,7 @@ CREATE VIEW view_column_usage AS
           AND t.relkind IN ('r', 'v', 'f', 'p')
           AND t.oid = a.attrelid
           AND dt.refobjsubid = a.attnum
-          AND pg_has_role(t.relowner, 'USAGE');
+          AND pg_catalog.pg_has_role(t.relowner, 'USAGE');
 
 GRANT SELECT ON view_column_usage TO PUBLIC;
 
@@ -2505,7 +2505,7 @@ CREATE VIEW view_routine_usage AS
           AND dp.refclassid = 'pg_catalog.pg_proc'::regclass
           AND dp.refobjid = p.oid
           AND p.pronamespace = np.oid
-          AND pg_has_role(p.proowner, 'USAGE');
+          AND pg_catalog.pg_has_role(p.proowner, 'USAGE');
 
 GRANT SELECT ON view_routine_usage TO PUBLIC;
 
@@ -2540,7 +2540,7 @@ CREATE VIEW view_table_usage AS
           AND dt.refobjid = t.oid
           AND t.relnamespace = nt.oid
           AND t.relkind IN ('r', 'v', 'f', 'p')
-          AND pg_has_role(t.relowner, 'USAGE');
+          AND pg_catalog.pg_has_role(t.relowner, 'USAGE');
 
 GRANT SELECT ON view_table_usage TO PUBLIC;
 
@@ -2556,8 +2556,8 @@ CREATE VIEW views AS
            CAST(c.relname AS sql_identifier) AS table_name,
 
            CAST(
-             CASE WHEN pg_has_role(c.relowner, 'USAGE')
-                  THEN pg_get_viewdef(c.oid)
+             CASE WHEN pg_catalog.pg_has_role(c.relowner, 'USAGE')
+                  THEN pg_catalog.pg_get_viewdef(c.oid)
                   ELSE null END
              AS character_data) AS view_definition,
 
@@ -2571,13 +2571,13 @@ CREATE VIEW views AS
 
            CAST(
              -- (1 << CMD_UPDATE) + (1 << CMD_DELETE)
-             CASE WHEN pg_relation_is_updatable(c.oid, false) & 20 = 20
+             CASE WHEN pg_catalog.pg_relation_is_updatable(c.oid, false) & 20 = 20
                   THEN 'YES' ELSE 'NO' END
              AS yes_or_no) AS is_updatable,
 
            CAST(
              -- 1 << CMD_INSERT
-             CASE WHEN pg_relation_is_updatable(c.oid, false) & 8 = 8
+             CASE WHEN pg_catalog.pg_relation_is_updatable(c.oid, false) & 8 = 8
                   THEN 'YES' ELSE 'NO' END
              AS yes_or_no) AS is_insertable_into,
 
@@ -2603,7 +2603,7 @@ CREATE VIEW views AS
 
     WHERE c.relnamespace = nc.oid
           AND c.relkind = 'v'
-          AND (NOT pg_is_other_temp_schema(nc.oid))
+          AND (NOT pg_catalog.pg_is_other_temp_schema(nc.oid))
           AND (pg_has_role(c.relowner, 'USAGE')
                OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
                OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
@@ -2709,7 +2709,7 @@ CREATE VIEW element_types AS
            SELECT pronamespace, CAST(proname || '_' || CAST(oid AS text) AS sql_identifier),
                   'ROUTINE'::text, (ss.x).n, (ss.x).x, 0
            FROM (SELECT p.pronamespace, p.proname, p.oid,
-                        _pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
+                        information_schema._pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
                  FROM pg_proc p) AS ss
 
            UNION ALL
@@ -2943,12 +2943,12 @@ CREATE VIEW user_mapping_options AS
            foreign_server_name,
            CAST(opts.option_name AS sql_identifier) AS option_name,
            CAST(CASE WHEN (umuser <> 0 AND authorization_identifier = current_user)
-                       OR (umuser = 0 AND pg_has_role(srvowner, 'USAGE'))
+                       OR (umuser = 0 AND pg_catalog.pg_has_role(srvowner, 'USAGE'))
                        OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
                      THEN opts.option_value
                      ELSE NULL END AS character_data) AS option_value
     FROM _pg_user_mappings um,
-         pg_options_to_table(um.umoptions) opts;
+         pg_catalog.pg_options_to_table(um.umoptions) opts;
 
 GRANT SELECT ON user_mapping_options TO PUBLIC;
 
-- 
2.14.3

Reply via email to