2 * SQL Information Schema
3 * as defined in ISO/IEC 9075-11:2003
5 * Copyright (c) 2003-2009, PostgreSQL Global Development Group
7 * $PostgreSQL: pgsql/src/backend/catalog/information_schema.sql,v 1.55 2009/07/07 18:23:13 petere Exp $
11 * Note: Generally, the definitions in this file should be ordered
12 * according to the clause numbers in the SQL standard, which is also the
13 * alphabetical order. In some cases it is convenient or necessary to
14 * define one information schema view by using another one; in that case,
15 * put the referencing view at the very end and leave a note where it
16 * should have been put.
22 * INFORMATION_SCHEMA schema
25 CREATE SCHEMA information_schema;
26 GRANT USAGE ON SCHEMA information_schema TO PUBLIC;
27 SET search_path TO information_schema, public;
31 * A few supporting functions first ...
34 /* Expand any 1-D array into a set with integers 1..N */
35 CREATE FUNCTION _pg_expandarray(IN anyarray, OUT x anyelement, OUT n int)
37 LANGUAGE sql STRICT IMMUTABLE
38 AS 'select $1[s], s - pg_catalog.array_lower($1,1) + 1
39 from pg_catalog.generate_series(pg_catalog.array_lower($1,1),
40 pg_catalog.array_upper($1,1),
43 CREATE FUNCTION _pg_keysequal(smallint[], smallint[]) RETURNS boolean
44 LANGUAGE sql IMMUTABLE -- intentionally not STRICT, to allow inlining
45 AS 'select $1 <@ $2 and $2 <@ $1';
47 /* Get the OID of the unique index that an FK constraint depends on */
48 CREATE FUNCTION _pg_underlying_index(oid) RETURNS oid
49 LANGUAGE sql STRICT STABLE
51 SELECT refobjid FROM pg_catalog.pg_depend
52 WHERE classid = 'pg_catalog.pg_constraint'::pg_catalog.regclass AND
54 refclassid = 'pg_catalog.pg_class'::pg_catalog.regclass AND
55 refobjsubid = 0 AND deptype = 'n'
58 /* Given an index's OID and an underlying-table column number, return the
59 * column's position in the index (NULL if not there) */
60 CREATE FUNCTION _pg_index_position(oid, smallint) RETURNS int
61 LANGUAGE sql STRICT STABLE
64 (SELECT information_schema._pg_expandarray(indkey) AS a
65 FROM pg_catalog.pg_index WHERE indexrelid = $1) ss
69 CREATE FUNCTION _pg_truetypid(pg_attribute, pg_type) RETURNS oid
72 RETURNS NULL ON NULL INPUT
74 $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typbasetype ELSE $1.atttypid END$$;
76 CREATE FUNCTION _pg_truetypmod(pg_attribute, pg_type) RETURNS int4
79 RETURNS NULL ON NULL INPUT
81 $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typtypmod ELSE $1.atttypmod END$$;
83 -- these functions encapsulate knowledge about the encoding of typmod:
85 CREATE FUNCTION _pg_char_max_length(typid oid, typmod int4) RETURNS integer
88 RETURNS NULL ON NULL INPUT
91 CASE WHEN $2 = -1 /* default typmod */
93 WHEN $1 IN (1042, 1043) /* char, varchar */
95 WHEN $1 IN (1560, 1562) /* bit, varbit */
100 CREATE FUNCTION _pg_char_octet_length(typid oid, typmod int4) RETURNS integer
103 RETURNS NULL ON NULL INPUT
106 CASE WHEN $1 IN (25, 1042, 1043) /* text, char, varchar */
107 THEN CASE WHEN $2 = -1 /* default typmod */
108 THEN CAST(2^30 AS integer)
109 ELSE information_schema._pg_char_max_length($1, $2) * pg_catalog.pg_encoding_max_length((SELECT encoding FROM pg_database WHERE datname = current_database()))
114 CREATE FUNCTION _pg_numeric_precision(typid oid, typmod int4) RETURNS integer
117 RETURNS NULL ON NULL INPUT
121 WHEN 21 /*int2*/ THEN 16
122 WHEN 23 /*int4*/ THEN 32
123 WHEN 20 /*int8*/ THEN 64
124 WHEN 1700 /*numeric*/ THEN
127 ELSE (($2 - 4) >> 16) & 65535
129 WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/
130 WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/
134 CREATE FUNCTION _pg_numeric_precision_radix(typid oid, typmod int4) RETURNS integer
137 RETURNS NULL ON NULL INPUT
140 CASE WHEN $1 IN (21, 23, 20, 700, 701) THEN 2
141 WHEN $1 IN (1700) THEN 10
145 CREATE FUNCTION _pg_numeric_scale(typid oid, typmod int4) RETURNS integer
148 RETURNS NULL ON NULL INPUT
151 CASE WHEN $1 IN (21, 23, 20) THEN 0
152 WHEN $1 IN (1700) THEN
155 ELSE ($2 - 4) & 65535
160 CREATE FUNCTION _pg_datetime_precision(typid oid, typmod int4) RETURNS integer
163 RETURNS NULL ON NULL INPUT
166 CASE WHEN $1 IN (1082) /* date */
168 WHEN $1 IN (1083, 1114, 1184, 1266) /* time, timestamp, same + tz */
169 THEN CASE WHEN $2 < 0 THEN 6 ELSE $2 END
170 WHEN $1 IN (1186) /* interval */
171 THEN CASE WHEN $2 < 0 THEN 6 ELSE $2 & 65535 END
176 -- 5.2 INFORMATION_SCHEMA_CATALOG_NAME view appears later.
181 * CARDINAL_NUMBER domain
184 CREATE DOMAIN cardinal_number AS integer
185 CONSTRAINT cardinal_number_domain_check CHECK (value >= 0);
190 * CHARACTER_DATA domain
193 CREATE DOMAIN character_data AS character varying;
198 * SQL_IDENTIFIER domain
201 CREATE DOMAIN sql_identifier AS character varying;
206 * INFORMATION_SCHEMA_CATALOG_NAME view
209 CREATE VIEW information_schema_catalog_name AS
210 SELECT CAST(current_database() AS sql_identifier) AS catalog_name;
212 GRANT SELECT ON information_schema_catalog_name TO PUBLIC;
220 CREATE DOMAIN time_stamp AS timestamp(2) with time zone
221 DEFAULT current_timestamp(2);
224 -- 5.7 ADMINISTRABLE_ROLE_AUTHORIZATIONS view appears later.
229 * APPLICABLE_ROLES view
232 CREATE VIEW applicable_roles AS
233 SELECT CAST(a.rolname AS sql_identifier) AS grantee,
234 CAST(b.rolname AS sql_identifier) AS role_name,
235 CAST(CASE WHEN m.admin_option THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
236 FROM pg_auth_members m
237 JOIN pg_authid a ON (m.member = a.oid)
238 JOIN pg_authid b ON (m.roleid = b.oid)
239 WHERE pg_has_role(a.oid, 'USAGE');
241 GRANT SELECT ON applicable_roles TO PUBLIC;
246 * ADMINISTRABLE_ROLE_AUTHORIZATIONS view
249 CREATE VIEW administrable_role_authorizations AS
251 FROM applicable_roles
252 WHERE is_grantable = 'YES';
254 GRANT SELECT ON administrable_role_authorizations TO PUBLIC;
262 -- feature not supported
270 CREATE VIEW attributes AS
271 SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
272 CAST(nc.nspname AS sql_identifier) AS udt_schema,
273 CAST(c.relname AS sql_identifier) AS udt_name,
274 CAST(a.attname AS sql_identifier) AS attribute_name,
275 CAST(a.attnum AS cardinal_number) AS ordinal_position,
276 CAST(pg_get_expr(ad.adbin, ad.adrelid) AS character_data) AS attribute_default,
277 CAST(CASE WHEN a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) THEN 'NO' ELSE 'YES' END
282 CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
283 WHEN nt.nspname = 'pg_catalog' THEN format_type(a.atttypid, null)
284 ELSE 'USER-DEFINED' END
289 _pg_char_max_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
291 AS character_maximum_length,
294 _pg_char_octet_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
296 AS character_octet_length,
298 CAST(null AS sql_identifier) AS character_set_catalog,
299 CAST(null AS sql_identifier) AS character_set_schema,
300 CAST(null AS sql_identifier) AS character_set_name,
302 CAST(null AS sql_identifier) AS collation_catalog,
303 CAST(null AS sql_identifier) AS collation_schema,
304 CAST(null AS sql_identifier) AS collation_name,
307 _pg_numeric_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
309 AS numeric_precision,
312 _pg_numeric_precision_radix(_pg_truetypid(a, t), _pg_truetypmod(a, t))
314 AS numeric_precision_radix,
317 _pg_numeric_scale(_pg_truetypid(a, t), _pg_truetypmod(a, t))
322 _pg_datetime_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
324 AS datetime_precision,
326 CAST(null AS character_data) AS interval_type, -- FIXME
327 CAST(null AS character_data) AS interval_precision, -- FIXME
329 CAST(current_database() AS sql_identifier) AS attribute_udt_catalog,
330 CAST(nt.nspname AS sql_identifier) AS attribute_udt_schema,
331 CAST(t.typname AS sql_identifier) AS attribute_udt_name,
333 CAST(null AS sql_identifier) AS scope_catalog,
334 CAST(null AS sql_identifier) AS scope_schema,
335 CAST(null AS sql_identifier) AS scope_name,
337 CAST(null AS cardinal_number) AS maximum_cardinality,
338 CAST(a.attnum AS sql_identifier) AS dtd_identifier,
339 CAST('NO' AS character_data) AS is_derived_reference_attribute
341 FROM (pg_attribute a LEFT JOIN pg_attrdef ad ON attrelid = adrelid AND attnum = adnum),
342 pg_class c, pg_namespace nc,
343 (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid))
345 WHERE a.attrelid = c.oid
346 AND a.atttypid = t.oid
347 AND nc.oid = c.relnamespace
348 AND a.attnum > 0 AND NOT a.attisdropped
349 AND c.relkind in ('c');
351 GRANT SELECT ON attributes TO PUBLIC;
356 * CHARACTER_SETS view
359 -- feature not supported
364 * CHECK_CONSTRAINT_ROUTINE_USAGE view
367 CREATE VIEW check_constraint_routine_usage AS
368 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
369 CAST(nc.nspname AS sql_identifier) AS constraint_schema,
370 CAST(c.conname AS sql_identifier) AS constraint_name,
371 CAST(current_database() AS sql_identifier) AS specific_catalog,
372 CAST(np.nspname AS sql_identifier) AS specific_schema,
373 CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name
374 FROM pg_namespace nc, pg_constraint c, pg_depend d, pg_proc p, pg_namespace np
375 WHERE nc.oid = c.connamespace
378 AND d.classid = 'pg_catalog.pg_constraint'::regclass
379 AND d.refobjid = p.oid
380 AND d.refclassid = 'pg_catalog.pg_proc'::regclass
381 AND p.pronamespace = np.oid
382 AND pg_has_role(p.proowner, 'USAGE');
384 GRANT SELECT ON check_constraint_routine_usage TO PUBLIC;
389 * CHECK_CONSTRAINTS view
392 CREATE VIEW check_constraints AS
393 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
394 CAST(rs.nspname AS sql_identifier) AS constraint_schema,
395 CAST(con.conname AS sql_identifier) AS constraint_name,
396 CAST(substring(pg_get_constraintdef(con.oid) from 7) AS character_data)
398 FROM pg_constraint con
399 LEFT OUTER JOIN pg_namespace rs ON (rs.oid = con.connamespace)
400 LEFT OUTER JOIN pg_class c ON (c.oid = con.conrelid)
401 LEFT OUTER JOIN pg_type t ON (t.oid = con.contypid)
402 WHERE pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE')
403 AND con.contype = 'c'
406 -- not-null constraints
408 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
409 CAST(n.nspname AS sql_identifier) AS constraint_schema,
410 CAST(CAST(n.oid AS text) || '_' || CAST(r.oid AS text) || '_' || CAST(a.attnum AS text) || '_not_null' AS sql_identifier) AS constraint_name, -- XXX
411 CAST(a.attname || ' IS NOT NULL' AS character_data)
413 FROM pg_namespace n, pg_class r, pg_attribute a
414 WHERE n.oid = r.relnamespace
415 AND r.oid = a.attrelid
417 AND NOT a.attisdropped
420 AND pg_has_role(r.relowner, 'USAGE');
422 GRANT SELECT ON check_constraints TO PUBLIC;
430 -- feature not supported
434 * COLLATION_CHARACTER_SET_APPLICABILITY view
437 -- feature not supported
442 * COLUMN_COLUMN_USAGE view
445 -- feature not supported
450 * COLUMN_DOMAIN_USAGE view
453 CREATE VIEW column_domain_usage AS
454 SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
455 CAST(nt.nspname AS sql_identifier) AS domain_schema,
456 CAST(t.typname AS sql_identifier) AS domain_name,
457 CAST(current_database() AS sql_identifier) AS table_catalog,
458 CAST(nc.nspname AS sql_identifier) AS table_schema,
459 CAST(c.relname AS sql_identifier) AS table_name,
460 CAST(a.attname AS sql_identifier) AS column_name
462 FROM pg_type t, pg_namespace nt, pg_class c, pg_namespace nc,
465 WHERE t.typnamespace = nt.oid
466 AND c.relnamespace = nc.oid
467 AND a.attrelid = c.oid
468 AND a.atttypid = t.oid
470 AND c.relkind IN ('r', 'v')
472 AND NOT a.attisdropped
473 AND pg_has_role(t.typowner, 'USAGE');
475 GRANT SELECT ON column_domain_usage TO PUBLIC;
483 CREATE VIEW column_privileges AS
484 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
485 CAST(grantee.rolname AS sql_identifier) AS grantee,
486 CAST(current_database() AS sql_identifier) AS table_catalog,
487 CAST(nc.nspname AS sql_identifier) AS table_schema,
488 CAST(c.relname AS sql_identifier) AS table_name,
489 CAST(a.attname AS sql_identifier) AS column_name,
490 CAST(pr.type AS character_data) AS privilege_type,
493 -- object owner always has grant options
494 pg_has_role(grantee.oid, c.relowner, 'USAGE')
495 OR aclcontains(c.relacl,
496 makeaclitem(grantee.oid, u_grantor.oid, pr.type, true))
497 OR aclcontains(a.attacl,
498 makeaclitem(grantee.oid, u_grantor.oid, pr.type, true))
499 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
506 SELECT oid, rolname FROM pg_authid
508 SELECT 0::oid, 'PUBLIC'
509 ) AS grantee (oid, rolname),
513 ('REFERENCES')) AS pr (type)
515 WHERE a.attrelid = c.oid
516 AND c.relnamespace = nc.oid
518 AND NOT a.attisdropped
519 AND c.relkind IN ('r', 'v')
520 AND (aclcontains(c.relacl,
521 makeaclitem(grantee.oid, u_grantor.oid, pr.type, false))
522 OR aclcontains(a.attacl,
523 makeaclitem(grantee.oid, u_grantor.oid, pr.type, false)))
524 AND (pg_has_role(u_grantor.oid, 'USAGE')
525 OR pg_has_role(grantee.oid, 'USAGE')
526 OR grantee.rolname = 'PUBLIC');
528 GRANT SELECT ON column_privileges TO PUBLIC;
533 * COLUMN_UDT_USAGE view
536 CREATE VIEW column_udt_usage AS
537 SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
538 CAST(coalesce(nbt.nspname, nt.nspname) AS sql_identifier) AS udt_schema,
539 CAST(coalesce(bt.typname, t.typname) AS sql_identifier) AS udt_name,
540 CAST(current_database() AS sql_identifier) AS table_catalog,
541 CAST(nc.nspname AS sql_identifier) AS table_schema,
542 CAST(c.relname AS sql_identifier) AS table_name,
543 CAST(a.attname AS sql_identifier) AS column_name
545 FROM pg_attribute a, pg_class c, pg_namespace nc,
546 (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid))
547 LEFT JOIN (pg_type bt JOIN pg_namespace nbt ON (bt.typnamespace = nbt.oid))
548 ON (t.typtype = 'd' AND t.typbasetype = bt.oid)
550 WHERE a.attrelid = c.oid
551 AND a.atttypid = t.oid
552 AND nc.oid = c.relnamespace
553 AND a.attnum > 0 AND NOT a.attisdropped AND c.relkind in ('r', 'v')
554 AND pg_has_role(coalesce(bt.typowner, t.typowner), 'USAGE');
556 GRANT SELECT ON column_udt_usage TO PUBLIC;
564 CREATE VIEW columns AS
565 SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
566 CAST(nc.nspname AS sql_identifier) AS table_schema,
567 CAST(c.relname AS sql_identifier) AS table_name,
568 CAST(a.attname AS sql_identifier) AS column_name,
569 CAST(a.attnum AS cardinal_number) AS ordinal_position,
570 CAST(pg_get_expr(ad.adbin, ad.adrelid) AS character_data) AS column_default,
571 CAST(CASE WHEN a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) THEN 'NO' ELSE 'YES' END
576 CASE WHEN t.typtype = 'd' THEN
577 CASE WHEN bt.typelem <> 0 AND bt.typlen = -1 THEN 'ARRAY'
578 WHEN nbt.nspname = 'pg_catalog' THEN format_type(t.typbasetype, null)
579 ELSE 'USER-DEFINED' END
581 CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
582 WHEN nt.nspname = 'pg_catalog' THEN format_type(a.atttypid, null)
583 ELSE 'USER-DEFINED' END
589 _pg_char_max_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
591 AS character_maximum_length,
594 _pg_char_octet_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
596 AS character_octet_length,
599 _pg_numeric_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
601 AS numeric_precision,
604 _pg_numeric_precision_radix(_pg_truetypid(a, t), _pg_truetypmod(a, t))
606 AS numeric_precision_radix,
609 _pg_numeric_scale(_pg_truetypid(a, t), _pg_truetypmod(a, t))
614 _pg_datetime_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
616 AS datetime_precision,
618 CAST(null AS character_data) AS interval_type, -- FIXME
619 CAST(null AS character_data) AS interval_precision, -- FIXME
621 CAST(null AS sql_identifier) AS character_set_catalog,
622 CAST(null AS sql_identifier) AS character_set_schema,
623 CAST(null AS sql_identifier) AS character_set_name,
625 CAST(null AS sql_identifier) AS collation_catalog,
626 CAST(null AS sql_identifier) AS collation_schema,
627 CAST(null AS sql_identifier) AS collation_name,
629 CAST(CASE WHEN t.typtype = 'd' THEN current_database() ELSE null END
630 AS sql_identifier) AS domain_catalog,
631 CAST(CASE WHEN t.typtype = 'd' THEN nt.nspname ELSE null END
632 AS sql_identifier) AS domain_schema,
633 CAST(CASE WHEN t.typtype = 'd' THEN t.typname ELSE null END
634 AS sql_identifier) AS domain_name,
636 CAST(current_database() AS sql_identifier) AS udt_catalog,
637 CAST(coalesce(nbt.nspname, nt.nspname) AS sql_identifier) AS udt_schema,
638 CAST(coalesce(bt.typname, t.typname) AS sql_identifier) AS udt_name,
640 CAST(null AS sql_identifier) AS scope_catalog,
641 CAST(null AS sql_identifier) AS scope_schema,
642 CAST(null AS sql_identifier) AS scope_name,
644 CAST(null AS cardinal_number) AS maximum_cardinality,
645 CAST(a.attnum AS sql_identifier) AS dtd_identifier,
646 CAST('NO' AS character_data) AS is_self_referencing,
648 CAST('NO' AS character_data) AS is_identity,
649 CAST(null AS character_data) AS identity_generation,
650 CAST(null AS character_data) AS identity_start,
651 CAST(null AS character_data) AS identity_increment,
652 CAST(null AS character_data) AS identity_maximum,
653 CAST(null AS character_data) AS identity_minimum,
654 CAST(null AS character_data) AS identity_cycle,
656 CAST('NEVER' AS character_data) AS is_generated,
657 CAST(null AS character_data) AS generation_expression,
659 CAST(CASE WHEN c.relkind = 'r'
661 AND EXISTS (SELECT 1 FROM pg_rewrite WHERE ev_class = c.oid AND ev_type = '2' AND is_instead)
662 AND EXISTS (SELECT 1 FROM pg_rewrite WHERE ev_class = c.oid AND ev_type = '4' AND is_instead))
663 THEN 'YES' ELSE 'NO' END AS character_data) AS is_updatable
665 FROM (pg_attribute a LEFT JOIN pg_attrdef ad ON attrelid = adrelid AND attnum = adnum),
666 pg_class c, pg_namespace nc,
667 (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid))
668 LEFT JOIN (pg_type bt JOIN pg_namespace nbt ON (bt.typnamespace = nbt.oid))
669 ON (t.typtype = 'd' AND t.typbasetype = bt.oid)
671 WHERE a.attrelid = c.oid
672 AND a.atttypid = t.oid
673 AND nc.oid = c.relnamespace
674 AND (NOT pg_is_other_temp_schema(nc.oid))
676 AND a.attnum > 0 AND NOT a.attisdropped AND c.relkind in ('r', 'v')
678 AND (pg_has_role(c.relowner, 'USAGE')
679 OR has_column_privilege(c.oid, a.attnum,
680 'SELECT, INSERT, UPDATE, REFERENCES'));
682 GRANT SELECT ON columns TO PUBLIC;
687 * CONSTRAINT_COLUMN_USAGE view
690 CREATE VIEW constraint_column_usage AS
691 SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
692 CAST(tblschema AS sql_identifier) AS table_schema,
693 CAST(tblname AS sql_identifier) AS table_name,
694 CAST(colname AS sql_identifier) AS column_name,
695 CAST(current_database() AS sql_identifier) AS constraint_catalog,
696 CAST(cstrschema AS sql_identifier) AS constraint_schema,
697 CAST(cstrname AS sql_identifier) AS constraint_name
700 /* check constraints */
701 SELECT DISTINCT nr.nspname, r.relname, r.relowner, a.attname, nc.nspname, c.conname
702 FROM pg_namespace nr, pg_class r, pg_attribute a, pg_depend d, pg_namespace nc, pg_constraint c
703 WHERE nr.oid = r.relnamespace
704 AND r.oid = a.attrelid
705 AND d.refclassid = 'pg_catalog.pg_class'::regclass
706 AND d.refobjid = r.oid
707 AND d.refobjsubid = a.attnum
708 AND d.classid = 'pg_catalog.pg_constraint'::regclass
710 AND c.connamespace = nc.oid
713 AND NOT a.attisdropped
717 /* unique/primary key/foreign key constraints */
718 SELECT nr.nspname, r.relname, r.relowner, a.attname, nc.nspname, c.conname
719 FROM pg_namespace nr, pg_class r, pg_attribute a, pg_namespace nc,
721 WHERE nr.oid = r.relnamespace
722 AND r.oid = a.attrelid
723 AND nc.oid = c.connamespace
724 AND (CASE WHEN c.contype = 'f' THEN r.oid = c.confrelid AND a.attnum = ANY (c.confkey)
725 ELSE r.oid = c.conrelid AND a.attnum = ANY (c.conkey) END)
726 AND NOT a.attisdropped
727 AND c.contype IN ('p', 'u', 'f')
730 ) AS x (tblschema, tblname, tblowner, colname, cstrschema, cstrname)
732 WHERE pg_has_role(x.tblowner, 'USAGE');
734 GRANT SELECT ON constraint_column_usage TO PUBLIC;
739 * CONSTRAINT_TABLE_USAGE view
742 CREATE VIEW constraint_table_usage AS
743 SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
744 CAST(nr.nspname AS sql_identifier) AS table_schema,
745 CAST(r.relname AS sql_identifier) AS table_name,
746 CAST(current_database() AS sql_identifier) AS constraint_catalog,
747 CAST(nc.nspname AS sql_identifier) AS constraint_schema,
748 CAST(c.conname AS sql_identifier) AS constraint_name
750 FROM pg_constraint c, pg_namespace nc,
751 pg_class r, pg_namespace nr
753 WHERE c.connamespace = nc.oid AND r.relnamespace = nr.oid
754 AND ( (c.contype = 'f' AND c.confrelid = r.oid)
755 OR (c.contype IN ('p', 'u') AND c.conrelid = r.oid) )
757 AND pg_has_role(r.relowner, 'USAGE');
759 GRANT SELECT ON constraint_table_usage TO PUBLIC;
762 -- 5.23 DATA_TYPE_PRIVILEGES view appears later.
767 * DIRECT_SUPERTABLES view
770 -- feature not supported
775 * DIRECT_SUPERTYPES view
778 -- feature not supported
783 * DOMAIN_CONSTRAINTS view
786 CREATE VIEW domain_constraints AS
787 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
788 CAST(rs.nspname AS sql_identifier) AS constraint_schema,
789 CAST(con.conname AS sql_identifier) AS constraint_name,
790 CAST(current_database() AS sql_identifier) AS domain_catalog,
791 CAST(n.nspname AS sql_identifier) AS domain_schema,
792 CAST(t.typname AS sql_identifier) AS domain_name,
793 CAST(CASE WHEN condeferrable THEN 'YES' ELSE 'NO' END
794 AS character_data) AS is_deferrable,
795 CAST(CASE WHEN condeferred THEN 'YES' ELSE 'NO' END
796 AS character_data) AS initially_deferred
797 FROM pg_namespace rs, pg_namespace n, pg_constraint con, pg_type t
798 WHERE rs.oid = con.connamespace
799 AND n.oid = t.typnamespace
800 AND t.oid = con.contypid;
802 GRANT SELECT ON domain_constraints TO PUBLIC;
806 * DOMAIN_UDT_USAGE view
807 * apparently removed in SQL:2003
810 CREATE VIEW domain_udt_usage AS
811 SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
812 CAST(nbt.nspname AS sql_identifier) AS udt_schema,
813 CAST(bt.typname AS sql_identifier) AS udt_name,
814 CAST(current_database() AS sql_identifier) AS domain_catalog,
815 CAST(nt.nspname AS sql_identifier) AS domain_schema,
816 CAST(t.typname AS sql_identifier) AS domain_name
818 FROM pg_type t, pg_namespace nt,
819 pg_type bt, pg_namespace nbt
821 WHERE t.typnamespace = nt.oid
822 AND t.typbasetype = bt.oid
823 AND bt.typnamespace = nbt.oid
825 AND pg_has_role(bt.typowner, 'USAGE');
827 GRANT SELECT ON domain_udt_usage TO PUBLIC;
835 CREATE VIEW domains AS
836 SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
837 CAST(nt.nspname AS sql_identifier) AS domain_schema,
838 CAST(t.typname AS sql_identifier) AS domain_name,
841 CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
842 WHEN nbt.nspname = 'pg_catalog' THEN format_type(t.typbasetype, null)
843 ELSE 'USER-DEFINED' END
848 _pg_char_max_length(t.typbasetype, t.typtypmod)
850 AS character_maximum_length,
853 _pg_char_octet_length(t.typbasetype, t.typtypmod)
855 AS character_octet_length,
857 CAST(null AS sql_identifier) AS character_set_catalog,
858 CAST(null AS sql_identifier) AS character_set_schema,
859 CAST(null AS sql_identifier) AS character_set_name,
861 CAST(null AS sql_identifier) AS collation_catalog,
862 CAST(null AS sql_identifier) AS collation_schema,
863 CAST(null AS sql_identifier) AS collation_name,
866 _pg_numeric_precision(t.typbasetype, t.typtypmod)
868 AS numeric_precision,
871 _pg_numeric_precision_radix(t.typbasetype, t.typtypmod)
873 AS numeric_precision_radix,
876 _pg_numeric_scale(t.typbasetype, t.typtypmod)
881 _pg_datetime_precision(t.typbasetype, t.typtypmod)
883 AS datetime_precision,
885 CAST(null AS character_data) AS interval_type, -- FIXME
886 CAST(null AS character_data) AS interval_precision, -- FIXME
888 CAST(t.typdefault AS character_data) AS domain_default,
890 CAST(current_database() AS sql_identifier) AS udt_catalog,
891 CAST(nbt.nspname AS sql_identifier) AS udt_schema,
892 CAST(bt.typname AS sql_identifier) AS udt_name,
894 CAST(null AS sql_identifier) AS scope_catalog,
895 CAST(null AS sql_identifier) AS scope_schema,
896 CAST(null AS sql_identifier) AS scope_name,
898 CAST(null AS cardinal_number) AS maximum_cardinality,
899 CAST(1 AS sql_identifier) AS dtd_identifier
901 FROM pg_type t, pg_namespace nt,
902 pg_type bt, pg_namespace nbt
904 WHERE t.typnamespace = nt.oid
905 AND t.typbasetype = bt.oid
906 AND bt.typnamespace = nbt.oid
909 GRANT SELECT ON domains TO PUBLIC;
912 -- 5.28 ELEMENT_TYPES view appears later.
920 CREATE VIEW enabled_roles AS
921 SELECT CAST(a.rolname AS sql_identifier) AS role_name
923 WHERE pg_has_role(a.oid, 'USAGE');
925 GRANT SELECT ON enabled_roles TO PUBLIC;
933 -- feature not supported
938 * KEY_COLUMN_USAGE view
941 CREATE VIEW key_column_usage AS
942 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
943 CAST(nc_nspname AS sql_identifier) AS constraint_schema,
944 CAST(conname AS sql_identifier) AS constraint_name,
945 CAST(current_database() AS sql_identifier) AS table_catalog,
946 CAST(nr_nspname AS sql_identifier) AS table_schema,
947 CAST(relname AS sql_identifier) AS table_name,
948 CAST(a.attname AS sql_identifier) AS column_name,
949 CAST((ss.x).n AS cardinal_number) AS ordinal_position,
950 CAST(CASE WHEN contype = 'f' THEN
951 _pg_index_position(_pg_underlying_index(ss.coid),
952 ss.confkey[(ss.x).n])
954 END AS cardinal_number)
955 AS position_in_unique_constraint
957 (SELECT r.oid AS roid, r.relname, r.relowner,
958 nc.nspname AS nc_nspname, nr.nspname AS nr_nspname,
959 c.oid AS coid, c.conname, c.contype, c.confkey, c.confrelid,
960 _pg_expandarray(c.conkey) AS x
961 FROM pg_namespace nr, pg_class r, pg_namespace nc,
963 WHERE nr.oid = r.relnamespace
964 AND r.oid = c.conrelid
965 AND nc.oid = c.connamespace
966 AND c.contype IN ('p', 'u', 'f')
968 AND (NOT pg_is_other_temp_schema(nr.oid)) ) AS ss
969 WHERE ss.roid = a.attrelid
970 AND a.attnum = (ss.x).x
971 AND NOT a.attisdropped
972 AND (pg_has_role(relowner, 'USAGE')
973 OR has_column_privilege(roid, a.attnum,
974 'SELECT, INSERT, UPDATE, REFERENCES'));
976 GRANT SELECT ON key_column_usage TO PUBLIC;
981 * METHOD_SPECIFICATION_PARAMETERS view
984 -- feature not supported
989 * METHOD_SPECIFICATIONS view
992 -- feature not supported
1000 CREATE VIEW parameters AS
1001 SELECT CAST(current_database() AS sql_identifier) AS specific_catalog,
1002 CAST(n_nspname AS sql_identifier) AS specific_schema,
1003 CAST(proname || '_' || CAST(p_oid AS text) AS sql_identifier) AS specific_name,
1004 CAST((ss.x).n AS cardinal_number) AS ordinal_position,
1006 CASE WHEN proargmodes IS NULL THEN 'IN'
1007 WHEN proargmodes[(ss.x).n] = 'i' THEN 'IN'
1008 WHEN proargmodes[(ss.x).n] = 'o' THEN 'OUT'
1009 WHEN proargmodes[(ss.x).n] = 'b' THEN 'INOUT'
1010 WHEN proargmodes[(ss.x).n] = 'v' THEN 'IN'
1011 WHEN proargmodes[(ss.x).n] = 't' THEN 'OUT'
1012 END AS character_data) AS parameter_mode,
1013 CAST('NO' AS character_data) AS is_result,
1014 CAST('NO' AS character_data) AS as_locator,
1015 CAST(NULLIF(proargnames[(ss.x).n], '') AS sql_identifier) AS parameter_name,
1017 CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
1018 WHEN nt.nspname = 'pg_catalog' THEN format_type(t.oid, null)
1019 ELSE 'USER-DEFINED' END AS character_data)
1021 CAST(null AS cardinal_number) AS character_maximum_length,
1022 CAST(null AS cardinal_number) AS character_octet_length,
1023 CAST(null AS sql_identifier) AS character_set_catalog,
1024 CAST(null AS sql_identifier) AS character_set_schema,
1025 CAST(null AS sql_identifier) AS character_set_name,
1026 CAST(null AS sql_identifier) AS collation_catalog,
1027 CAST(null AS sql_identifier) AS collation_schema,
1028 CAST(null AS sql_identifier) AS collation_name,
1029 CAST(null AS cardinal_number) AS numeric_precision,
1030 CAST(null AS cardinal_number) AS numeric_precision_radix,
1031 CAST(null AS cardinal_number) AS numeric_scale,
1032 CAST(null AS cardinal_number) AS datetime_precision,
1033 CAST(null AS character_data) AS interval_type,
1034 CAST(null AS character_data) AS interval_precision,
1035 CAST(current_database() AS sql_identifier) AS udt_catalog,
1036 CAST(nt.nspname AS sql_identifier) AS udt_schema,
1037 CAST(t.typname AS sql_identifier) AS udt_name,
1038 CAST(null AS sql_identifier) AS scope_catalog,
1039 CAST(null AS sql_identifier) AS scope_schema,
1040 CAST(null AS sql_identifier) AS scope_name,
1041 CAST(null AS cardinal_number) AS maximum_cardinality,
1042 CAST((ss.x).n AS sql_identifier) AS dtd_identifier
1044 FROM pg_type t, pg_namespace nt,
1045 (SELECT n.nspname AS n_nspname, p.proname, p.oid AS p_oid,
1046 p.proargnames, p.proargmodes,
1047 _pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
1048 FROM pg_namespace n, pg_proc p
1049 WHERE n.oid = p.pronamespace
1050 AND (pg_has_role(p.proowner, 'USAGE') OR
1051 has_function_privilege(p.oid, 'EXECUTE'))) AS ss
1052 WHERE t.oid = (ss.x).x AND t.typnamespace = nt.oid;
1054 GRANT SELECT ON parameters TO PUBLIC;
1059 * REFERENCED_TYPES view
1062 -- feature not supported
1067 * REFERENTIAL_CONSTRAINTS view
1070 CREATE VIEW referential_constraints AS
1071 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
1072 CAST(ncon.nspname AS sql_identifier) AS constraint_schema,
1073 CAST(con.conname AS sql_identifier) AS constraint_name,
1075 CASE WHEN npkc.nspname IS NULL THEN NULL
1076 ELSE current_database() END
1077 AS sql_identifier) AS unique_constraint_catalog,
1078 CAST(npkc.nspname AS sql_identifier) AS unique_constraint_schema,
1079 CAST(pkc.conname AS sql_identifier) AS unique_constraint_name,
1082 CASE con.confmatchtype WHEN 'f' THEN 'FULL'
1083 WHEN 'p' THEN 'PARTIAL'
1084 WHEN 'u' THEN 'NONE' END
1085 AS character_data) AS match_option,
1088 CASE con.confupdtype WHEN 'c' THEN 'CASCADE'
1089 WHEN 'n' THEN 'SET NULL'
1090 WHEN 'd' THEN 'SET DEFAULT'
1091 WHEN 'r' THEN 'RESTRICT'
1092 WHEN 'a' THEN 'NO ACTION' END
1093 AS character_data) AS update_rule,
1096 CASE con.confdeltype WHEN 'c' THEN 'CASCADE'
1097 WHEN 'n' THEN 'SET NULL'
1098 WHEN 'd' THEN 'SET DEFAULT'
1099 WHEN 'r' THEN 'RESTRICT'
1100 WHEN 'a' THEN 'NO ACTION' END
1101 AS character_data) AS delete_rule
1103 FROM (pg_namespace ncon
1104 INNER JOIN pg_constraint con ON ncon.oid = con.connamespace
1105 INNER JOIN pg_class c ON con.conrelid = c.oid)
1108 INNER JOIN pg_namespace npkc ON pkc.connamespace = npkc.oid)
1109 ON con.confrelid = pkc.conrelid
1110 AND _pg_keysequal(con.confkey, pkc.conkey)
1112 WHERE c.relkind = 'r'
1113 AND con.contype = 'f'
1114 AND (pkc.contype IN ('p', 'u') OR pkc.contype IS NULL)
1115 AND (pg_has_role(c.relowner, 'USAGE')
1116 -- SELECT privilege omitted, per SQL standard
1117 OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
1118 OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') );
1120 GRANT SELECT ON referential_constraints TO PUBLIC;
1125 * ROLE_COLUMN_GRANTS view
1128 CREATE VIEW role_column_grants AS
1129 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
1130 CAST(g_grantee.rolname AS sql_identifier) AS grantee,
1131 CAST(current_database() AS sql_identifier) AS table_catalog,
1132 CAST(nc.nspname AS sql_identifier) AS table_schema,
1133 CAST(c.relname AS sql_identifier) AS table_name,
1134 CAST(a.attname AS sql_identifier) AS column_name,
1135 CAST(pr.type AS character_data) AS privilege_type,
1138 -- object owner always has grant options
1139 pg_has_role(g_grantee.oid, c.relowner, 'USAGE')
1140 OR aclcontains(c.relacl,
1141 makeaclitem(g_grantee.oid, u_grantor.oid, pr.type, true))
1142 OR aclcontains(a.attacl,
1143 makeaclitem(g_grantee.oid, u_grantor.oid, pr.type, true))
1144 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
1146 FROM pg_attribute a,
1149 pg_authid u_grantor,
1150 pg_authid g_grantee,
1154 ('REFERENCES')) AS pr (type)
1156 WHERE a.attrelid = c.oid
1157 AND c.relnamespace = nc.oid
1159 AND NOT a.attisdropped
1160 AND c.relkind IN ('r', 'v')
1161 AND (aclcontains(c.relacl,
1162 makeaclitem(g_grantee.oid, u_grantor.oid, pr.type, false))
1163 OR aclcontains(a.attacl,
1164 makeaclitem(g_grantee.oid, u_grantor.oid, pr.type, false)))
1165 AND (u_grantor.rolname IN (SELECT role_name FROM enabled_roles)
1166 OR g_grantee.rolname IN (SELECT role_name FROM enabled_roles));
1168 GRANT SELECT ON role_column_grants TO PUBLIC;
1173 * ROLE_ROUTINE_GRANTS view
1176 CREATE VIEW role_routine_grants AS
1177 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
1178 CAST(g_grantee.rolname AS sql_identifier) AS grantee,
1179 CAST(current_database() AS sql_identifier) AS specific_catalog,
1180 CAST(n.nspname AS sql_identifier) AS specific_schema,
1181 CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name,
1182 CAST(current_database() AS sql_identifier) AS routine_catalog,
1183 CAST(n.nspname AS sql_identifier) AS routine_schema,
1184 CAST(p.proname AS sql_identifier) AS routine_name,
1185 CAST('EXECUTE' AS character_data) AS privilege_type,
1188 -- object owner always has grant options
1189 pg_has_role(g_grantee.oid, p.proowner, 'USAGE')
1190 OR aclcontains(p.proacl,
1191 makeaclitem(g_grantee.oid, u_grantor.oid, 'EXECUTE', true))
1192 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
1196 pg_authid u_grantor,
1199 WHERE p.pronamespace = n.oid
1200 AND aclcontains(p.proacl,
1201 makeaclitem(g_grantee.oid, u_grantor.oid, 'EXECUTE', false))
1202 AND (u_grantor.rolname IN (SELECT role_name FROM enabled_roles)
1203 OR g_grantee.rolname IN (SELECT role_name FROM enabled_roles));
1205 GRANT SELECT ON role_routine_grants TO PUBLIC;
1210 * ROLE_TABLE_GRANTS view
1213 CREATE VIEW role_table_grants AS
1214 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
1215 CAST(g_grantee.rolname AS sql_identifier) AS grantee,
1216 CAST(current_database() AS sql_identifier) AS table_catalog,
1217 CAST(nc.nspname AS sql_identifier) AS table_schema,
1218 CAST(c.relname AS sql_identifier) AS table_name,
1219 CAST(pr.type AS character_data) AS privilege_type,
1222 -- object owner always has grant options
1223 pg_has_role(g_grantee.oid, c.relowner, 'USAGE')
1224 OR aclcontains(c.relacl,
1225 makeaclitem(g_grantee.oid, u_grantor.oid, pr.type, true))
1226 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable,
1227 CAST('NO' AS character_data) AS with_hierarchy
1231 pg_authid u_grantor,
1232 pg_authid g_grantee,
1239 ('TRIGGER')) AS pr (type)
1241 WHERE c.relnamespace = nc.oid
1242 AND c.relkind IN ('r', 'v')
1243 AND aclcontains(c.relacl,
1244 makeaclitem(g_grantee.oid, u_grantor.oid, pr.type, false))
1245 AND (u_grantor.rolname IN (SELECT role_name FROM enabled_roles)
1246 OR g_grantee.rolname IN (SELECT role_name FROM enabled_roles));
1248 GRANT SELECT ON role_table_grants TO PUBLIC;
1253 * ROLE_TABLE_METHOD_GRANTS view
1256 -- feature not supported
1261 * ROLE_USAGE_GRANTS view
1264 CREATE VIEW role_usage_grants AS
1266 /* foreign-data wrappers */
1267 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
1268 CAST(g_grantee.rolname AS sql_identifier) AS grantee,
1269 CAST(current_database() AS sql_identifier) AS object_catalog,
1270 CAST('' AS sql_identifier) AS object_schema,
1271 CAST(fdw.fdwname AS sql_identifier) AS object_name,
1272 CAST('FOREIGN DATA WRAPPER' AS character_data) AS object_type,
1273 CAST('USAGE' AS character_data) AS privilege_type,
1276 -- object owner always has grant options
1277 pg_has_role(g_grantee.oid, fdw.fdwowner, 'USAGE')
1278 OR aclcontains(fdw.fdwacl,
1279 makeaclitem(g_grantee.oid, u_grantor.oid, 'USAGE', true))
1280 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
1282 FROM pg_foreign_data_wrapper fdw,
1283 pg_authid u_grantor,
1286 WHERE aclcontains(fdw.fdwacl,
1287 makeaclitem(g_grantee.oid, u_grantor.oid, 'USAGE', false))
1288 AND (u_grantor.rolname IN (SELECT role_name FROM enabled_roles)
1289 OR g_grantee.rolname IN (SELECT role_name FROM enabled_roles))
1293 /* foreign server */
1294 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
1295 CAST(g_grantee.rolname AS sql_identifier) AS grantee,
1296 CAST(current_database() AS sql_identifier) AS object_catalog,
1297 CAST('' AS sql_identifier) AS object_schema,
1298 CAST(srv.srvname AS sql_identifier) AS object_name,
1299 CAST('FOREIGN SERVER' AS character_data) AS object_type,
1300 CAST('USAGE' AS character_data) AS privilege_type,
1303 -- object owner always has grant options
1304 pg_has_role(g_grantee.oid, srv.srvowner, 'USAGE')
1305 OR aclcontains(srv.srvacl,
1306 makeaclitem(g_grantee.oid, u_grantor.oid, 'USAGE', true))
1307 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
1309 FROM pg_foreign_server srv,
1310 pg_authid u_grantor,
1313 WHERE aclcontains(srv.srvacl,
1314 makeaclitem(g_grantee.oid, u_grantor.oid, 'USAGE', false))
1315 AND (u_grantor.rolname IN (SELECT role_name FROM enabled_roles)
1316 OR g_grantee.rolname IN (SELECT role_name FROM enabled_roles));
1318 GRANT SELECT ON role_usage_grants TO PUBLIC;
1323 * ROLE_UDT_GRANTS view
1326 -- feature not supported
1331 * ROUTINE_COLUMN_USAGE view
1334 -- not tracked by PostgreSQL
1339 * ROUTINE_PRIVILEGES view
1342 CREATE VIEW routine_privileges AS
1343 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
1344 CAST(grantee.rolname AS sql_identifier) AS grantee,
1345 CAST(current_database() AS sql_identifier) AS specific_catalog,
1346 CAST(n.nspname AS sql_identifier) AS specific_schema,
1347 CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name,
1348 CAST(current_database() AS sql_identifier) AS routine_catalog,
1349 CAST(n.nspname AS sql_identifier) AS routine_schema,
1350 CAST(p.proname AS sql_identifier) AS routine_name,
1351 CAST('EXECUTE' AS character_data) AS privilege_type,
1354 -- object owner always has grant options
1355 pg_has_role(grantee.oid, p.proowner, 'USAGE')
1356 OR aclcontains(p.proacl,
1357 makeaclitem(grantee.oid, u_grantor.oid, 'EXECUTE', true))
1358 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
1362 pg_authid u_grantor,
1364 SELECT oid, rolname FROM pg_authid
1366 SELECT 0::oid, 'PUBLIC'
1367 ) AS grantee (oid, rolname)
1369 WHERE p.pronamespace = n.oid
1370 AND aclcontains(p.proacl,
1371 makeaclitem(grantee.oid, u_grantor.oid, 'EXECUTE', false))
1372 AND (pg_has_role(u_grantor.oid, 'USAGE')
1373 OR pg_has_role(grantee.oid, 'USAGE')
1374 OR grantee.rolname = 'PUBLIC');
1376 GRANT SELECT ON routine_privileges TO PUBLIC;
1381 * ROUTINE_ROUTINE_USAGE view
1384 -- not tracked by PostgreSQL
1389 * ROUTINE_SEQUENCE_USAGE view
1392 -- not tracked by PostgreSQL
1397 * ROUTINE_TABLE_USAGE view
1400 -- not tracked by PostgreSQL
1408 CREATE VIEW routines AS
1409 SELECT CAST(current_database() AS sql_identifier) AS specific_catalog,
1410 CAST(n.nspname AS sql_identifier) AS specific_schema,
1411 CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name,
1412 CAST(current_database() AS sql_identifier) AS routine_catalog,
1413 CAST(n.nspname AS sql_identifier) AS routine_schema,
1414 CAST(p.proname AS sql_identifier) AS routine_name,
1415 CAST('FUNCTION' AS character_data) AS routine_type,
1416 CAST(null AS sql_identifier) AS module_catalog,
1417 CAST(null AS sql_identifier) AS module_schema,
1418 CAST(null AS sql_identifier) AS module_name,
1419 CAST(null AS sql_identifier) AS udt_catalog,
1420 CAST(null AS sql_identifier) AS udt_schema,
1421 CAST(null AS sql_identifier) AS udt_name,
1424 CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
1425 WHEN nt.nspname = 'pg_catalog' THEN format_type(t.oid, null)
1426 ELSE 'USER-DEFINED' END AS character_data)
1428 CAST(null AS cardinal_number) AS character_maximum_length,
1429 CAST(null AS cardinal_number) AS character_octet_length,
1430 CAST(null AS sql_identifier) AS character_set_catalog,
1431 CAST(null AS sql_identifier) AS character_set_schema,
1432 CAST(null AS sql_identifier) AS character_set_name,
1433 CAST(null AS sql_identifier) AS collation_catalog,
1434 CAST(null AS sql_identifier) AS collation_schema,
1435 CAST(null AS sql_identifier) AS collation_name,
1436 CAST(null AS cardinal_number) AS numeric_precision,
1437 CAST(null AS cardinal_number) AS numeric_precision_radix,
1438 CAST(null AS cardinal_number) AS numeric_scale,
1439 CAST(null AS cardinal_number) AS datetime_precision,
1440 CAST(null AS character_data) AS interval_type,
1441 CAST(null AS character_data) AS interval_precision,
1442 CAST(current_database() AS sql_identifier) AS type_udt_catalog,
1443 CAST(nt.nspname AS sql_identifier) AS type_udt_schema,
1444 CAST(t.typname AS sql_identifier) AS type_udt_name,
1445 CAST(null AS sql_identifier) AS scope_catalog,
1446 CAST(null AS sql_identifier) AS scope_schema,
1447 CAST(null AS sql_identifier) AS scope_name,
1448 CAST(null AS cardinal_number) AS maximum_cardinality,
1449 CAST(0 AS sql_identifier) AS dtd_identifier,
1451 CAST(CASE WHEN l.lanname = 'sql' THEN 'SQL' ELSE 'EXTERNAL' END AS character_data)
1454 CASE WHEN pg_has_role(p.proowner, 'USAGE') THEN p.prosrc ELSE null END
1455 AS character_data) AS routine_definition,
1457 CASE WHEN l.lanname = 'c' THEN p.prosrc ELSE null END
1458 AS character_data) AS external_name,
1459 CAST(upper(l.lanname) AS character_data) AS external_language,
1461 CAST('GENERAL' AS character_data) AS parameter_style,
1462 CAST(CASE WHEN p.provolatile = 'i' THEN 'YES' ELSE 'NO' END AS character_data) AS is_deterministic,
1463 CAST('MODIFIES' AS character_data) AS sql_data_access,
1464 CAST(CASE WHEN p.proisstrict THEN 'YES' ELSE 'NO' END AS character_data) AS is_null_call,
1465 CAST(null AS character_data) AS sql_path,
1466 CAST('YES' AS character_data) AS schema_level_routine,
1467 CAST(0 AS cardinal_number) AS max_dynamic_result_sets,
1468 CAST(null AS character_data) AS is_user_defined_cast,
1469 CAST(null AS character_data) AS is_implicitly_invocable,
1470 CAST(CASE WHEN p.prosecdef THEN 'DEFINER' ELSE 'INVOKER' END AS character_data) AS security_type,
1471 CAST(null AS sql_identifier) AS to_sql_specific_catalog,
1472 CAST(null AS sql_identifier) AS to_sql_specific_schema,
1473 CAST(null AS sql_identifier) AS to_sql_specific_name,
1474 CAST('NO' AS character_data) AS as_locator,
1475 CAST(null AS time_stamp) AS created,
1476 CAST(null AS time_stamp) AS last_altered,
1477 CAST(null AS character_data) AS new_savepoint_level,
1478 CAST('YES' AS character_data) AS is_udt_dependent, -- FIXME?
1480 CAST(null AS character_data) AS result_cast_from_data_type,
1481 CAST(null AS character_data) AS result_cast_as_locator,
1482 CAST(null AS cardinal_number) AS result_cast_char_max_length,
1483 CAST(null AS cardinal_number) AS result_cast_char_octet_length,
1484 CAST(null AS sql_identifier) AS result_cast_char_set_catalog,
1485 CAST(null AS sql_identifier) AS result_cast_char_set_schema,
1486 CAST(null AS sql_identifier) AS result_cast_character_set_name,
1487 CAST(null AS sql_identifier) AS result_cast_collation_catalog,
1488 CAST(null AS sql_identifier) AS result_cast_collation_schema,
1489 CAST(null AS sql_identifier) AS result_cast_collation_name,
1490 CAST(null AS cardinal_number) AS result_cast_numeric_precision,
1491 CAST(null AS cardinal_number) AS result_cast_numeric_precision_radix,
1492 CAST(null AS cardinal_number) AS result_cast_numeric_scale,
1493 CAST(null AS cardinal_number) AS result_cast_datetime_precision,
1494 CAST(null AS character_data) AS result_cast_interval_type,
1495 CAST(null AS character_data) AS result_cast_interval_precision,
1496 CAST(null AS sql_identifier) AS result_cast_type_udt_catalog,
1497 CAST(null AS sql_identifier) AS result_cast_type_udt_schema,
1498 CAST(null AS sql_identifier) AS result_cast_type_udt_name,
1499 CAST(null AS sql_identifier) AS result_cast_scope_catalog,
1500 CAST(null AS sql_identifier) AS result_cast_scope_schema,
1501 CAST(null AS sql_identifier) AS result_cast_scope_name,
1502 CAST(null AS cardinal_number) AS result_cast_maximum_cardinality,
1503 CAST(null AS sql_identifier) AS result_cast_dtd_identifier
1505 FROM pg_namespace n, pg_proc p, pg_language l,
1506 pg_type t, pg_namespace nt
1508 WHERE n.oid = p.pronamespace AND p.prolang = l.oid
1509 AND p.prorettype = t.oid AND t.typnamespace = nt.oid
1510 AND (pg_has_role(p.proowner, 'USAGE')
1511 OR has_function_privilege(p.oid, 'EXECUTE'));
1513 GRANT SELECT ON routines TO PUBLIC;
1521 CREATE VIEW schemata AS
1522 SELECT CAST(current_database() AS sql_identifier) AS catalog_name,
1523 CAST(n.nspname AS sql_identifier) AS schema_name,
1524 CAST(u.rolname AS sql_identifier) AS schema_owner,
1525 CAST(null AS sql_identifier) AS default_character_set_catalog,
1526 CAST(null AS sql_identifier) AS default_character_set_schema,
1527 CAST(null AS sql_identifier) AS default_character_set_name,
1528 CAST(null AS character_data) AS sql_path
1529 FROM pg_namespace n, pg_authid u
1530 WHERE n.nspowner = u.oid AND pg_has_role(n.nspowner, 'USAGE');
1532 GRANT SELECT ON schemata TO PUBLIC;
1540 CREATE VIEW sequences AS
1541 SELECT CAST(current_database() AS sql_identifier) AS sequence_catalog,
1542 CAST(nc.nspname AS sql_identifier) AS sequence_schema,
1543 CAST(c.relname AS sql_identifier) AS sequence_name,
1544 CAST('bigint' AS character_data) AS data_type,
1545 CAST(64 AS cardinal_number) AS numeric_precision,
1546 CAST(2 AS cardinal_number) AS numeric_precision_radix,
1547 CAST(0 AS cardinal_number) AS numeric_scale,
1548 CAST(null AS cardinal_number) AS maximum_value, -- FIXME
1549 CAST(null AS cardinal_number) AS minimum_value, -- FIXME
1550 CAST(null AS cardinal_number) AS increment, -- FIXME
1551 CAST(null AS character_data) AS cycle_option -- FIXME
1552 FROM pg_namespace nc, pg_class c
1553 WHERE c.relnamespace = nc.oid
1555 AND (NOT pg_is_other_temp_schema(nc.oid))
1556 AND (pg_has_role(c.relowner, 'USAGE')
1557 OR has_table_privilege(c.oid, 'SELECT, UPDATE') );
1559 GRANT SELECT ON sequences TO PUBLIC;
1564 * SQL_FEATURES table
1567 CREATE TABLE sql_features (
1568 feature_id character_data,
1569 feature_name character_data,
1570 sub_feature_id character_data,
1571 sub_feature_name character_data,
1572 is_supported character_data,
1573 is_verified_by character_data,
1574 comments character_data
1577 -- Will be filled with external data by initdb.
1579 GRANT SELECT ON sql_features TO PUBLIC;
1584 * SQL_IMPLEMENTATION_INFO table
1587 -- Note: Implementation information items are defined in ISO/IEC 9075-3:2003,
1590 CREATE TABLE sql_implementation_info (
1591 implementation_info_id character_data,
1592 implementation_info_name character_data,
1593 integer_value cardinal_number,
1594 character_value character_data,
1595 comments character_data
1598 INSERT INTO sql_implementation_info VALUES ('10003', 'CATALOG NAME', NULL, 'Y', NULL);
1599 INSERT INTO sql_implementation_info VALUES ('10004', 'COLLATING SEQUENCE', NULL, '', 'not supported');
1600 INSERT INTO sql_implementation_info VALUES ('23', 'CURSOR COMMIT BEHAVIOR', 1, NULL, 'close cursors and retain prepared statements');
1601 INSERT INTO sql_implementation_info VALUES ('2', 'DATA SOURCE NAME', NULL, '', NULL);
1602 INSERT INTO sql_implementation_info VALUES ('17', 'DBMS NAME', NULL, (select trim(trailing ' ' from substring(version() from '^[^0-9]*'))), NULL);
1603 INSERT INTO sql_implementation_info VALUES ('18', 'DBMS VERSION', NULL, '???', NULL); -- filled by initdb
1604 INSERT INTO sql_implementation_info VALUES ('26', 'DEFAULT TRANSACTION ISOLATION', 2, NULL, 'READ COMMITTED; user-settable');
1605 INSERT INTO sql_implementation_info VALUES ('28', 'IDENTIFIER CASE', 3, NULL, 'stored in mixed case - case sensitive');
1606 INSERT INTO sql_implementation_info VALUES ('85', 'NULL COLLATION', 0, NULL, 'nulls higher than non-nulls');
1607 INSERT INTO sql_implementation_info VALUES ('13', 'SERVER NAME', NULL, '', NULL);
1608 INSERT INTO sql_implementation_info VALUES ('94', 'SPECIAL CHARACTERS', NULL, '', 'all non-ASCII characters allowed');
1609 INSERT INTO sql_implementation_info VALUES ('46', 'TRANSACTION CAPABLE', 2, NULL, 'both DML and DDL');
1611 GRANT SELECT ON sql_implementation_info TO PUBLIC;
1616 * SQL_LANGUAGES table
1619 CREATE TABLE sql_languages (
1620 sql_language_source character_data,
1621 sql_language_year character_data,
1622 sql_language_conformance character_data,
1623 sql_language_integrity character_data,
1624 sql_language_implementation character_data,
1625 sql_language_binding_style character_data,
1626 sql_language_programming_language character_data
1629 INSERT INTO sql_languages VALUES ('ISO 9075', '1999', 'CORE', NULL, NULL, 'DIRECT', NULL);
1630 INSERT INTO sql_languages VALUES ('ISO 9075', '1999', 'CORE', NULL, NULL, 'EMBEDDED', 'C');
1631 INSERT INTO sql_languages VALUES ('ISO 9075', '2003', 'CORE', NULL, NULL, 'DIRECT', NULL);
1632 INSERT INTO sql_languages VALUES ('ISO 9075', '2003', 'CORE', NULL, NULL, 'EMBEDDED', 'C');
1634 GRANT SELECT ON sql_languages TO PUBLIC;
1639 * SQL_PACKAGES table
1642 CREATE TABLE sql_packages (
1643 feature_id character_data,
1644 feature_name character_data,
1645 is_supported character_data,
1646 is_verified_by character_data,
1647 comments character_data
1650 INSERT INTO sql_packages VALUES ('PKG000', 'Core', 'NO', NULL, '');
1651 INSERT INTO sql_packages VALUES ('PKG001', 'Enhanced datetime facilities', 'YES', NULL, '');
1652 INSERT INTO sql_packages VALUES ('PKG002', 'Enhanced integrity management', 'NO', NULL, '');
1653 INSERT INTO sql_packages VALUES ('PKG003', 'OLAP facilities', 'NO', NULL, '');
1654 INSERT INTO sql_packages VALUES ('PKG004', 'PSM', 'NO', NULL, 'PL/pgSQL is similar.');
1655 INSERT INTO sql_packages VALUES ('PKG005', 'CLI', 'NO', NULL, 'ODBC is similar.');
1656 INSERT INTO sql_packages VALUES ('PKG006', 'Basic object support', 'NO', NULL, '');
1657 INSERT INTO sql_packages VALUES ('PKG007', 'Enhanced object support', 'NO', NULL, '');
1658 INSERT INTO sql_packages VALUES ('PKG008', 'Active database', 'NO', NULL, '');
1659 INSERT INTO sql_packages VALUES ('PKG010', 'OLAP', 'NO', NULL, 'NO');
1661 GRANT SELECT ON sql_packages TO PUBLIC;
1669 CREATE TABLE sql_parts (
1670 feature_id character_data,
1671 feature_name character_data,
1672 is_supported character_data,
1673 is_verified_by character_data,
1674 comments character_data
1677 INSERT INTO sql_parts VALUES ('1', 'Framework (SQL/Framework)', 'NO', NULL, '');
1678 INSERT INTO sql_parts VALUES ('2', 'Foundation (SQL/Foundation)', 'NO', NULL, '');
1679 INSERT INTO sql_parts VALUES ('3', 'Call-Level Interface (SQL/CLI)', 'NO', NULL, '');
1680 INSERT INTO sql_parts VALUES ('4', 'Persistent Stored Modules (SQL/PSM)', 'NO', NULL, '');
1681 INSERT INTO sql_parts VALUES ('9', 'Management of External Data (SQL/MED)', 'NO', NULL, '');
1682 INSERT INTO sql_parts VALUES ('10', 'Object Language Bindings (SQL/OLB)', 'NO', NULL, '');
1683 INSERT INTO sql_parts VALUES ('11', 'Information and Definition Schema (SQL/Schemata)', 'NO', NULL, '');
1684 INSERT INTO sql_parts VALUES ('13', 'Routines and Types Using the Java Programming Language (SQL/JRT)', 'NO', NULL, '');
1685 INSERT INTO sql_parts VALUES ('14', 'XML-Related Specifications (SQL/XML)', 'YES', NULL, '');
1693 -- Note: Sizing items are defined in ISO/IEC 9075-3:2003, clause 7.2.
1695 CREATE TABLE sql_sizing (
1696 sizing_id cardinal_number,
1697 sizing_name character_data,
1698 supported_value cardinal_number,
1699 comments character_data
1702 INSERT INTO sql_sizing VALUES (34, 'MAXIMUM CATALOG NAME LENGTH', 63, NULL);
1703 INSERT INTO sql_sizing VALUES (30, 'MAXIMUM COLUMN NAME LENGTH', 63, NULL);
1704 INSERT INTO sql_sizing VALUES (97, 'MAXIMUM COLUMNS IN GROUP BY', 0, NULL);
1705 INSERT INTO sql_sizing VALUES (99, 'MAXIMUM COLUMNS IN ORDER BY', 0, NULL);
1706 INSERT INTO sql_sizing VALUES (100, 'MAXIMUM COLUMNS IN SELECT', 1664, NULL); -- match MaxTupleAttributeNumber
1707 INSERT INTO sql_sizing VALUES (101, 'MAXIMUM COLUMNS IN TABLE', 1600, NULL); -- match MaxHeapAttributeNumber
1708 INSERT INTO sql_sizing VALUES (1, 'MAXIMUM CONCURRENT ACTIVITIES', 0, NULL);
1709 INSERT INTO sql_sizing VALUES (31, 'MAXIMUM CURSOR NAME LENGTH', 63, NULL);
1710 INSERT INTO sql_sizing VALUES (0, 'MAXIMUM DRIVER CONNECTIONS', NULL, NULL);
1711 INSERT INTO sql_sizing VALUES (10005, 'MAXIMUM IDENTIFIER LENGTH', 63, NULL);
1712 INSERT INTO sql_sizing VALUES (32, 'MAXIMUM SCHEMA NAME LENGTH', 63, NULL);
1713 INSERT INTO sql_sizing VALUES (20000, 'MAXIMUM STATEMENT OCTETS', 0, NULL);
1714 INSERT INTO sql_sizing VALUES (20001, 'MAXIMUM STATEMENT OCTETS DATA', 0, NULL);
1715 INSERT INTO sql_sizing VALUES (20002, 'MAXIMUM STATEMENT OCTETS SCHEMA', 0, NULL);
1716 INSERT INTO sql_sizing VALUES (35, 'MAXIMUM TABLE NAME LENGTH', 63, NULL);
1717 INSERT INTO sql_sizing VALUES (106, 'MAXIMUM TABLES IN SELECT', 0, NULL);
1718 INSERT INTO sql_sizing VALUES (107, 'MAXIMUM USER NAME LENGTH', 63, NULL);
1719 INSERT INTO sql_sizing VALUES (25000, 'MAXIMUM CURRENT DEFAULT TRANSFORM GROUP LENGTH', NULL, NULL);
1720 INSERT INTO sql_sizing VALUES (25001, 'MAXIMUM CURRENT TRANSFORM GROUP LENGTH', NULL, NULL);
1721 INSERT INTO sql_sizing VALUES (25002, 'MAXIMUM CURRENT PATH LENGTH', 0, NULL);
1722 INSERT INTO sql_sizing VALUES (25003, 'MAXIMUM CURRENT ROLE LENGTH', NULL, NULL);
1723 INSERT INTO sql_sizing VALUES (25004, 'MAXIMUM SESSION USER LENGTH', 63, NULL);
1724 INSERT INTO sql_sizing VALUES (25005, 'MAXIMUM SYSTEM USER LENGTH', 63, NULL);
1727 SET supported_value = (SELECT typlen-1 FROM pg_catalog.pg_type WHERE typname = 'name'),
1728 comments = 'Might be less, depending on character set.'
1729 WHERE supported_value = 63;
1731 GRANT SELECT ON sql_sizing TO PUBLIC;
1736 * SQL_SIZING_PROFILES table
1739 -- The data in this table are defined by various profiles of SQL.
1740 -- Since we don't have any information about such profiles, we provide
1743 CREATE TABLE sql_sizing_profiles (
1744 sizing_id cardinal_number,
1745 sizing_name character_data,
1746 profile_id character_data,
1747 required_value cardinal_number,
1748 comments character_data
1751 GRANT SELECT ON sql_sizing_profiles TO PUBLIC;
1756 * TABLE_CONSTRAINTS view
1759 CREATE VIEW table_constraints AS
1760 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
1761 CAST(nc.nspname AS sql_identifier) AS constraint_schema,
1762 CAST(c.conname AS sql_identifier) AS constraint_name,
1763 CAST(current_database() AS sql_identifier) AS table_catalog,
1764 CAST(nr.nspname AS sql_identifier) AS table_schema,
1765 CAST(r.relname AS sql_identifier) AS table_name,
1767 CASE c.contype WHEN 'c' THEN 'CHECK'
1768 WHEN 'f' THEN 'FOREIGN KEY'
1769 WHEN 'p' THEN 'PRIMARY KEY'
1770 WHEN 'u' THEN 'UNIQUE' END
1771 AS character_data) AS constraint_type,
1772 CAST(CASE WHEN c.condeferrable THEN 'YES' ELSE 'NO' END AS character_data)
1774 CAST(CASE WHEN c.condeferred THEN 'YES' ELSE 'NO' END AS character_data)
1775 AS initially_deferred
1777 FROM pg_namespace nc,
1782 WHERE nc.oid = c.connamespace AND nr.oid = r.relnamespace
1783 AND c.conrelid = r.oid
1785 AND (NOT pg_is_other_temp_schema(nr.oid))
1786 AND (pg_has_role(r.relowner, 'USAGE')
1787 -- SELECT privilege omitted, per SQL standard
1788 OR has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
1789 OR has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') )
1793 -- not-null constraints
1795 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
1796 CAST(nr.nspname AS sql_identifier) AS constraint_schema,
1797 CAST(CAST(nr.oid AS text) || '_' || CAST(r.oid AS text) || '_' || CAST(a.attnum AS text) || '_not_null' AS sql_identifier) AS constraint_name, -- XXX
1798 CAST(current_database() AS sql_identifier) AS table_catalog,
1799 CAST(nr.nspname AS sql_identifier) AS table_schema,
1800 CAST(r.relname AS sql_identifier) AS table_name,
1801 CAST('CHECK' AS character_data) AS constraint_type,
1802 CAST('NO' AS character_data) AS is_deferrable,
1803 CAST('NO' AS character_data) AS initially_deferred
1805 FROM pg_namespace nr,
1809 WHERE nr.oid = r.relnamespace
1810 AND r.oid = a.attrelid
1813 AND NOT a.attisdropped
1815 AND (NOT pg_is_other_temp_schema(nr.oid))
1816 AND (pg_has_role(r.relowner, 'USAGE')
1817 -- SELECT privilege omitted, per SQL standard
1818 OR has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
1819 OR has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') );
1821 GRANT SELECT ON table_constraints TO PUBLIC;
1826 * TABLE_METHOD_PRIVILEGES view
1829 -- feature not supported
1834 * TABLE_PRIVILEGES view
1837 CREATE VIEW table_privileges AS
1838 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
1839 CAST(grantee.rolname AS sql_identifier) AS grantee,
1840 CAST(current_database() AS sql_identifier) AS table_catalog,
1841 CAST(nc.nspname AS sql_identifier) AS table_schema,
1842 CAST(c.relname AS sql_identifier) AS table_name,
1843 CAST(pr.type AS character_data) AS privilege_type,
1846 -- object owner always has grant options
1847 pg_has_role(grantee.oid, c.relowner, 'USAGE')
1848 OR aclcontains(c.relacl,
1849 makeaclitem(grantee.oid, u_grantor.oid, pr.type, true))
1850 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable,
1851 CAST('NO' AS character_data) AS with_hierarchy
1855 pg_authid u_grantor,
1857 SELECT oid, rolname FROM pg_authid
1859 SELECT 0::oid, 'PUBLIC'
1860 ) AS grantee (oid, rolname),
1867 ('TRIGGER')) AS pr (type)
1869 WHERE c.relnamespace = nc.oid
1870 AND c.relkind IN ('r', 'v')
1871 AND aclcontains(c.relacl,
1872 makeaclitem(grantee.oid, u_grantor.oid, pr.type, false))
1873 AND (pg_has_role(u_grantor.oid, 'USAGE')
1874 OR pg_has_role(grantee.oid, 'USAGE')
1875 OR grantee.rolname = 'PUBLIC');
1877 GRANT SELECT ON table_privileges TO PUBLIC;
1885 CREATE VIEW tables AS
1886 SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
1887 CAST(nc.nspname AS sql_identifier) AS table_schema,
1888 CAST(c.relname AS sql_identifier) AS table_name,
1891 CASE WHEN nc.oid = pg_my_temp_schema() THEN 'LOCAL TEMPORARY'
1892 WHEN c.relkind = 'r' THEN 'BASE TABLE'
1893 WHEN c.relkind = 'v' THEN 'VIEW'
1895 AS character_data) AS table_type,
1897 CAST(null AS sql_identifier) AS self_referencing_column_name,
1898 CAST(null AS character_data) AS reference_generation,
1900 CAST(null AS sql_identifier) AS user_defined_type_catalog,
1901 CAST(null AS sql_identifier) AS user_defined_type_schema,
1902 CAST(null AS sql_identifier) AS user_defined_type_name,
1904 CAST(CASE WHEN c.relkind = 'r'
1906 AND EXISTS (SELECT 1 FROM pg_rewrite WHERE ev_class = c.oid AND ev_type = '3' AND is_instead))
1907 THEN 'YES' ELSE 'NO' END AS character_data) AS is_insertable_into,
1909 CAST('NO' AS character_data) AS is_typed,
1911 CASE WHEN nc.oid = pg_my_temp_schema() THEN 'PRESERVE' -- FIXME
1913 AS character_data) AS commit_action
1915 FROM pg_namespace nc, pg_class c
1917 WHERE c.relnamespace = nc.oid
1918 AND c.relkind IN ('r', 'v')
1919 AND (NOT pg_is_other_temp_schema(nc.oid))
1920 AND (pg_has_role(c.relowner, 'USAGE')
1921 OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
1922 OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
1924 GRANT SELECT ON tables TO PUBLIC;
1932 -- feature not supported
1940 -- feature not supported
1945 * TRIGGERED_UPDATE_COLUMNS view
1948 -- PostgreSQL doesn't allow the specification of individual triggered
1949 -- update columns, so this view is empty.
1951 CREATE VIEW triggered_update_columns AS
1952 SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
1953 CAST(null AS sql_identifier) AS trigger_schema,
1954 CAST(null AS sql_identifier) AS trigger_name,
1955 CAST(current_database() AS sql_identifier) AS event_object_catalog,
1956 CAST(null AS sql_identifier) AS event_object_schema,
1957 CAST(null AS sql_identifier) AS event_object_table,
1958 CAST(null AS sql_identifier) AS event_object_column
1961 GRANT SELECT ON triggered_update_columns TO PUBLIC;
1966 * TRIGGER_COLUMN_USAGE view
1969 -- not tracked by PostgreSQL
1974 * TRIGGER_ROUTINE_USAGE view
1977 -- not tracked by PostgreSQL
1982 * TRIGGER_SEQUENCE_USAGE view
1985 -- not tracked by PostgreSQL
1990 * TRIGGER_TABLE_USAGE view
1993 -- not tracked by PostgreSQL
2001 CREATE VIEW triggers AS
2002 SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
2003 CAST(n.nspname AS sql_identifier) AS trigger_schema,
2004 CAST(t.tgname AS sql_identifier) AS trigger_name,
2005 CAST(em.text AS character_data) AS event_manipulation,
2006 CAST(current_database() AS sql_identifier) AS event_object_catalog,
2007 CAST(n.nspname AS sql_identifier) AS event_object_schema,
2008 CAST(c.relname AS sql_identifier) AS event_object_table,
2009 CAST(null AS cardinal_number) AS action_order,
2010 CAST(null AS character_data) AS action_condition,
2012 substring(pg_get_triggerdef(t.oid) from
2013 position('EXECUTE PROCEDURE' in substring(pg_get_triggerdef(t.oid) from 48)) + 47)
2014 AS character_data) AS action_statement,
2016 CASE WHEN t.tgtype & 1 = 1 THEN 'ROW' ELSE 'STATEMENT' END
2017 AS character_data) AS action_orientation,
2019 CASE WHEN t.tgtype & 2 = 2 THEN 'BEFORE' ELSE 'AFTER' END
2020 AS character_data) AS condition_timing,
2021 CAST(null AS sql_identifier) AS condition_reference_old_table,
2022 CAST(null AS sql_identifier) AS condition_reference_new_table,
2023 CAST(null AS sql_identifier) AS condition_reference_old_row,
2024 CAST(null AS sql_identifier) AS condition_reference_new_row,
2025 CAST(null AS time_stamp) AS created
2027 FROM pg_namespace n, pg_class c, pg_trigger t,
2028 (VALUES (4, 'INSERT'),
2030 (16, 'UPDATE')) AS em (num, text)
2032 WHERE n.oid = c.relnamespace
2033 AND c.oid = t.tgrelid
2034 AND t.tgtype & em.num <> 0
2035 AND NOT t.tgisconstraint
2036 AND (NOT pg_is_other_temp_schema(n.oid))
2037 AND (pg_has_role(c.relowner, 'USAGE')
2038 -- SELECT privilege omitted, per SQL standard
2039 OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
2040 OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') );
2042 GRANT SELECT ON triggers TO PUBLIC;
2047 * UDT_PRIVILEGES view
2050 -- feature not supported
2055 * USAGE_PRIVILEGES view
2058 CREATE VIEW usage_privileges AS
2061 -- Domains have no real privileges, so we represent all domains with implicit usage privilege here.
2062 SELECT CAST(u.rolname AS sql_identifier) AS grantor,
2063 CAST('PUBLIC' AS sql_identifier) AS grantee,
2064 CAST(current_database() AS sql_identifier) AS object_catalog,
2065 CAST(n.nspname AS sql_identifier) AS object_schema,
2066 CAST(t.typname AS sql_identifier) AS object_name,
2067 CAST('DOMAIN' AS character_data) AS object_type,
2068 CAST('USAGE' AS character_data) AS privilege_type,
2069 CAST('NO' AS character_data) AS is_grantable
2075 WHERE u.oid = t.typowner
2076 AND t.typnamespace = n.oid
2081 /* foreign-data wrappers */
2082 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
2083 CAST(grantee.rolname AS sql_identifier) AS grantee,
2084 CAST(current_database() AS sql_identifier) AS object_catalog,
2085 CAST('' AS sql_identifier) AS object_schema,
2086 CAST(fdw.fdwname AS sql_identifier) AS object_name,
2087 CAST('FOREIGN DATA WRAPPER' AS character_data) AS object_type,
2088 CAST('USAGE' AS character_data) AS privilege_type,
2091 -- object owner always has grant options
2092 pg_has_role(grantee.oid, fdw.fdwowner, 'USAGE')
2093 OR aclcontains(fdw.fdwacl,
2094 makeaclitem(grantee.oid, u_grantor.oid, 'USAGE', true))
2095 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
2097 FROM pg_foreign_data_wrapper fdw,
2098 pg_authid u_grantor,
2100 SELECT oid, rolname FROM pg_authid
2102 SELECT 0::oid, 'PUBLIC'
2103 ) AS grantee (oid, rolname)
2105 WHERE aclcontains(fdw.fdwacl,
2106 makeaclitem(grantee.oid, u_grantor.oid, 'USAGE', false))
2107 AND (pg_has_role(u_grantor.oid, 'USAGE')
2108 OR pg_has_role(grantee.oid, 'USAGE')
2109 OR grantee.rolname = 'PUBLIC')
2113 /* foreign servers */
2114 SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
2115 CAST(grantee.rolname AS sql_identifier) AS grantee,
2116 CAST(current_database() AS sql_identifier) AS object_catalog,
2117 CAST('' AS sql_identifier) AS object_schema,
2118 CAST(srv.srvname AS sql_identifier) AS object_name,
2119 CAST('FOREIGN SERVER' AS character_data) AS object_type,
2120 CAST('USAGE' AS character_data) AS privilege_type,
2123 -- object owner always has grant options
2124 pg_has_role(grantee.oid, srv.srvowner, 'USAGE')
2125 OR aclcontains(srv.srvacl,
2126 makeaclitem(grantee.oid, u_grantor.oid, 'USAGE', true))
2127 THEN 'YES' ELSE 'NO' END AS character_data) AS is_grantable
2129 FROM pg_foreign_server srv,
2130 pg_authid u_grantor,
2132 SELECT oid, rolname FROM pg_authid
2134 SELECT 0::oid, 'PUBLIC'
2135 ) AS grantee (oid, rolname)
2137 WHERE aclcontains(srv.srvacl,
2138 makeaclitem(grantee.oid, u_grantor.oid, 'USAGE', false))
2139 AND (pg_has_role(u_grantor.oid, 'USAGE')
2140 OR pg_has_role(grantee.oid, 'USAGE')
2141 OR grantee.rolname = 'PUBLIC');
2143 GRANT SELECT ON usage_privileges TO PUBLIC;
2148 * USER_DEFINED_TYPES view
2151 -- feature not supported
2159 CREATE VIEW view_column_usage AS
2161 CAST(current_database() AS sql_identifier) AS view_catalog,
2162 CAST(nv.nspname AS sql_identifier) AS view_schema,
2163 CAST(v.relname AS sql_identifier) AS view_name,
2164 CAST(current_database() AS sql_identifier) AS table_catalog,
2165 CAST(nt.nspname AS sql_identifier) AS table_schema,
2166 CAST(t.relname AS sql_identifier) AS table_name,
2167 CAST(a.attname AS sql_identifier) AS column_name
2169 FROM pg_namespace nv, pg_class v, pg_depend dv,
2170 pg_depend dt, pg_class t, pg_namespace nt,
2173 WHERE nv.oid = v.relnamespace
2175 AND v.oid = dv.refobjid
2176 AND dv.refclassid = 'pg_catalog.pg_class'::regclass
2177 AND dv.classid = 'pg_catalog.pg_rewrite'::regclass
2178 AND dv.deptype = 'i'
2179 AND dv.objid = dt.objid
2180 AND dv.refobjid <> dt.refobjid
2181 AND dt.classid = 'pg_catalog.pg_rewrite'::regclass
2182 AND dt.refclassid = 'pg_catalog.pg_class'::regclass
2183 AND dt.refobjid = t.oid
2184 AND t.relnamespace = nt.oid
2185 AND t.relkind IN ('r', 'v')
2186 AND t.oid = a.attrelid
2187 AND dt.refobjsubid = a.attnum
2188 AND pg_has_role(t.relowner, 'USAGE');
2190 GRANT SELECT ON view_column_usage TO PUBLIC;
2195 * VIEW_ROUTINE_USAGE
2198 CREATE VIEW view_routine_usage AS
2200 CAST(current_database() AS sql_identifier) AS table_catalog,
2201 CAST(nv.nspname AS sql_identifier) AS table_schema,
2202 CAST(v.relname AS sql_identifier) AS table_name,
2203 CAST(current_database() AS sql_identifier) AS specific_catalog,
2204 CAST(np.nspname AS sql_identifier) AS specific_schema,
2205 CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier) AS specific_name
2207 FROM pg_namespace nv, pg_class v, pg_depend dv,
2208 pg_depend dp, pg_proc p, pg_namespace np
2210 WHERE nv.oid = v.relnamespace
2212 AND v.oid = dv.refobjid
2213 AND dv.refclassid = 'pg_catalog.pg_class'::regclass
2214 AND dv.classid = 'pg_catalog.pg_rewrite'::regclass
2215 AND dv.deptype = 'i'
2216 AND dv.objid = dp.objid
2217 AND dp.classid = 'pg_catalog.pg_rewrite'::regclass
2218 AND dp.refclassid = 'pg_catalog.pg_proc'::regclass
2219 AND dp.refobjid = p.oid
2220 AND p.pronamespace = np.oid
2221 AND pg_has_role(p.proowner, 'USAGE');
2223 GRANT SELECT ON view_routine_usage TO PUBLIC;
2231 CREATE VIEW view_table_usage AS
2233 CAST(current_database() AS sql_identifier) AS view_catalog,
2234 CAST(nv.nspname AS sql_identifier) AS view_schema,
2235 CAST(v.relname AS sql_identifier) AS view_name,
2236 CAST(current_database() AS sql_identifier) AS table_catalog,
2237 CAST(nt.nspname AS sql_identifier) AS table_schema,
2238 CAST(t.relname AS sql_identifier) AS table_name
2240 FROM pg_namespace nv, pg_class v, pg_depend dv,
2241 pg_depend dt, pg_class t, pg_namespace nt
2243 WHERE nv.oid = v.relnamespace
2245 AND v.oid = dv.refobjid
2246 AND dv.refclassid = 'pg_catalog.pg_class'::regclass
2247 AND dv.classid = 'pg_catalog.pg_rewrite'::regclass
2248 AND dv.deptype = 'i'
2249 AND dv.objid = dt.objid
2250 AND dv.refobjid <> dt.refobjid
2251 AND dt.classid = 'pg_catalog.pg_rewrite'::regclass
2252 AND dt.refclassid = 'pg_catalog.pg_class'::regclass
2253 AND dt.refobjid = t.oid
2254 AND t.relnamespace = nt.oid
2255 AND t.relkind IN ('r', 'v')
2256 AND pg_has_role(t.relowner, 'USAGE');
2258 GRANT SELECT ON view_table_usage TO PUBLIC;
2266 CREATE VIEW views AS
2267 SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
2268 CAST(nc.nspname AS sql_identifier) AS table_schema,
2269 CAST(c.relname AS sql_identifier) AS table_name,
2272 CASE WHEN pg_has_role(c.relowner, 'USAGE')
2273 THEN pg_get_viewdef(c.oid)
2275 AS character_data) AS view_definition,
2277 CAST('NONE' AS character_data) AS check_option,
2280 CASE WHEN EXISTS (SELECT 1 FROM pg_rewrite WHERE ev_class = c.oid AND ev_type = '2' AND is_instead)
2281 AND EXISTS (SELECT 1 FROM pg_rewrite WHERE ev_class = c.oid AND ev_type = '4' AND is_instead)
2282 THEN 'YES' ELSE 'NO' END
2283 AS character_data) AS is_updatable,
2286 CASE WHEN EXISTS (SELECT 1 FROM pg_rewrite WHERE ev_class = c.oid AND ev_type = '3' AND is_instead)
2287 THEN 'YES' ELSE 'NO' END
2288 AS character_data) AS is_insertable_into
2290 FROM pg_namespace nc, pg_class c
2292 WHERE c.relnamespace = nc.oid
2294 AND (NOT pg_is_other_temp_schema(nc.oid))
2295 AND (pg_has_role(c.relowner, 'USAGE')
2296 OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
2297 OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
2299 GRANT SELECT ON views TO PUBLIC;
2302 -- The following views have dependencies that force them to appear out of order.
2306 * DATA_TYPE_PRIVILEGES view
2309 CREATE VIEW data_type_privileges AS
2310 SELECT CAST(current_database() AS sql_identifier) AS object_catalog,
2311 CAST(x.objschema AS sql_identifier) AS object_schema,
2312 CAST(x.objname AS sql_identifier) AS object_name,
2313 CAST(x.objtype AS character_data) AS object_type,
2314 CAST(x.objdtdid AS sql_identifier) AS dtd_identifier
2318 SELECT udt_schema, udt_name, 'USER-DEFINED TYPE'::text, dtd_identifier FROM attributes
2320 SELECT table_schema, table_name, 'TABLE'::text, dtd_identifier FROM columns
2322 SELECT domain_schema, domain_name, 'DOMAIN'::text, dtd_identifier FROM domains
2324 SELECT specific_schema, specific_name, 'ROUTINE'::text, dtd_identifier FROM parameters
2326 SELECT specific_schema, specific_name, 'ROUTINE'::text, dtd_identifier FROM routines
2327 ) AS x (objschema, objname, objtype, objdtdid);
2329 GRANT SELECT ON data_type_privileges TO PUBLIC;
2334 * ELEMENT_TYPES view
2337 CREATE VIEW element_types AS
2338 SELECT CAST(current_database() AS sql_identifier) AS object_catalog,
2339 CAST(n.nspname AS sql_identifier) AS object_schema,
2340 CAST(x.objname AS sql_identifier) AS object_name,
2341 CAST(x.objtype AS character_data) AS object_type,
2342 CAST(x.objdtdid AS sql_identifier) AS collection_type_identifier,
2344 CASE WHEN nbt.nspname = 'pg_catalog' THEN format_type(bt.oid, null)
2345 ELSE 'USER-DEFINED' END AS character_data) AS data_type,
2347 CAST(null AS cardinal_number) AS character_maximum_length,
2348 CAST(null AS cardinal_number) AS character_octet_length,
2349 CAST(null AS sql_identifier) AS character_set_catalog,
2350 CAST(null AS sql_identifier) AS character_set_schema,
2351 CAST(null AS sql_identifier) AS character_set_name,
2352 CAST(null AS sql_identifier) AS collation_catalog,
2353 CAST(null AS sql_identifier) AS collation_schema,
2354 CAST(null AS sql_identifier) AS collation_name,
2355 CAST(null AS cardinal_number) AS numeric_precision,
2356 CAST(null AS cardinal_number) AS numeric_precision_radix,
2357 CAST(null AS cardinal_number) AS numeric_scale,
2358 CAST(null AS cardinal_number) AS datetime_precision,
2359 CAST(null AS character_data) AS interval_type,
2360 CAST(null AS character_data) AS interval_precision,
2362 CAST(null AS character_data) AS domain_default, -- XXX maybe a bug in the standard
2364 CAST(current_database() AS sql_identifier) AS udt_catalog,
2365 CAST(nbt.nspname AS sql_identifier) AS udt_schema,
2366 CAST(bt.typname AS sql_identifier) AS udt_name,
2368 CAST(null AS sql_identifier) AS scope_catalog,
2369 CAST(null AS sql_identifier) AS scope_schema,
2370 CAST(null AS sql_identifier) AS scope_name,
2372 CAST(null AS cardinal_number) AS maximum_cardinality,
2373 CAST('a' || CAST(x.objdtdid AS text) AS sql_identifier) AS dtd_identifier
2375 FROM pg_namespace n, pg_type at, pg_namespace nbt, pg_type bt,
2378 SELECT c.relnamespace, CAST(c.relname AS sql_identifier),
2379 'TABLE'::text, a.attnum, a.atttypid
2380 FROM pg_class c, pg_attribute a
2381 WHERE c.oid = a.attrelid
2382 AND c.relkind IN ('r', 'v')
2383 AND attnum > 0 AND NOT attisdropped
2388 SELECT t.typnamespace, CAST(t.typname AS sql_identifier),
2389 'DOMAIN'::text, 1, t.typbasetype
2391 WHERE t.typtype = 'd'
2396 SELECT pronamespace, CAST(proname || '_' || CAST(oid AS text) AS sql_identifier),
2397 'ROUTINE'::text, (ss.x).n, (ss.x).x
2398 FROM (SELECT p.pronamespace, p.proname, p.oid,
2399 _pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
2400 FROM pg_proc p) AS ss
2405 SELECT p.pronamespace, CAST(p.proname || '_' || CAST(p.oid AS text) AS sql_identifier),
2406 'ROUTINE'::text, 0, p.prorettype
2409 ) AS x (objschema, objname, objtype, objdtdid, objtypeid)
2411 WHERE n.oid = x.objschema
2412 AND at.oid = x.objtypeid
2413 AND (at.typelem <> 0 AND at.typlen = -1)
2414 AND at.typelem = bt.oid
2415 AND nbt.oid = bt.typnamespace
2417 AND (n.nspname, x.objname, x.objtype, CAST(x.objdtdid AS sql_identifier)) IN
2418 ( SELECT object_schema, object_name, object_type, dtd_identifier
2419 FROM data_type_privileges );
2421 GRANT SELECT ON element_types TO PUBLIC;
2424 -- SQL/MED views; these use section numbers from part 9 of the standard.
2426 /* Base view for foreign-data wrappers */
2427 CREATE VIEW _pg_foreign_data_wrappers AS
2431 CAST(current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
2432 CAST(fdwname AS sql_identifier) AS foreign_data_wrapper_name,
2433 CAST(u.rolname AS sql_identifier) AS authorization_identifier,
2434 CAST('c' AS character_data) AS foreign_data_wrapper_language
2435 FROM pg_foreign_data_wrapper w, pg_authid u
2436 WHERE u.oid = w.fdwowner
2437 AND (pg_has_role(fdwowner, 'USAGE')
2438 OR has_foreign_data_wrapper_privilege(w.oid, 'USAGE'));
2443 * FOREIGN_DATA_WRAPPER_OPTIONS view
2445 CREATE VIEW foreign_data_wrapper_options AS
2446 SELECT foreign_data_wrapper_catalog,
2447 foreign_data_wrapper_name,
2448 CAST((pg_options_to_table(w.fdwoptions)).option_name AS sql_identifier) AS option_name,
2449 CAST((pg_options_to_table(w.fdwoptions)).option_value AS character_data) AS option_value
2450 FROM _pg_foreign_data_wrappers w;
2452 GRANT SELECT ON foreign_data_wrapper_options TO PUBLIC;
2457 * FOREIGN_DATA_WRAPPERS view
2459 CREATE VIEW foreign_data_wrappers AS
2460 SELECT foreign_data_wrapper_catalog,
2461 foreign_data_wrapper_name,
2462 authorization_identifier,
2463 CAST(NULL AS character_data) AS library_name,
2464 foreign_data_wrapper_language
2465 FROM _pg_foreign_data_wrappers w;
2467 GRANT SELECT ON foreign_data_wrappers TO PUBLIC;
2470 /* Base view for foreign servers */
2471 CREATE VIEW _pg_foreign_servers AS
2474 CAST(current_database() AS sql_identifier) AS foreign_server_catalog,
2475 CAST(srvname AS sql_identifier) AS foreign_server_name,
2476 CAST(current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
2477 CAST(w.fdwname AS sql_identifier) AS foreign_data_wrapper_name,
2478 CAST(srvtype AS character_data) AS foreign_server_type,
2479 CAST(srvversion AS character_data) AS foreign_server_version,
2480 CAST(u.rolname AS sql_identifier) AS authorization_identifier
2481 FROM pg_foreign_server s, pg_foreign_data_wrapper w, pg_authid u
2482 WHERE w.oid = s.srvfdw
2483 AND u.oid = s.srvowner
2484 AND (pg_has_role(s.srvowner, 'USAGE')
2485 OR has_server_privilege(s.oid, 'USAGE'));
2490 * FOREIGN_SERVER_OPTIONS view
2492 CREATE VIEW foreign_server_options AS
2493 SELECT foreign_server_catalog,
2494 foreign_server_name,
2495 CAST((pg_options_to_table(s.srvoptions)).option_name AS sql_identifier) AS option_name,
2496 CAST((pg_options_to_table(s.srvoptions)).option_value AS character_data) AS option_value
2497 FROM _pg_foreign_servers s;
2499 GRANT SELECT ON TABLE foreign_server_options TO PUBLIC;
2504 * FOREIGN_SERVERS view
2506 CREATE VIEW foreign_servers AS
2507 SELECT foreign_server_catalog,
2508 foreign_server_name,
2509 foreign_data_wrapper_catalog,
2510 foreign_data_wrapper_name,
2511 foreign_server_type,
2512 foreign_server_version,
2513 authorization_identifier
2514 FROM _pg_foreign_servers;
2516 GRANT SELECT ON foreign_servers TO PUBLIC;
2519 /* Base view for user mappings */
2520 CREATE VIEW _pg_user_mappings AS
2524 CAST(COALESCE(u.rolname,'PUBLIC') AS sql_identifier ) AS authorization_identifier,
2525 s.foreign_server_catalog,
2526 s.foreign_server_name,
2527 s.authorization_identifier AS srvowner
2528 FROM pg_user_mapping um LEFT JOIN pg_authid u ON (u.oid = um.umuser),
2529 _pg_foreign_servers s
2530 WHERE s.oid = um.umserver;
2535 * USER_MAPPING_OPTIONS view
2537 CREATE VIEW user_mapping_options AS
2538 SELECT authorization_identifier,
2539 foreign_server_catalog,
2540 foreign_server_name,
2541 CAST((pg_options_to_table(um.umoptions)).option_name AS sql_identifier) AS option_name,
2542 CAST(CASE WHEN (umuser <> 0 AND authorization_identifier = current_user)
2543 OR (umuser = 0 AND pg_has_role(srvowner, 'USAGE'))
2544 OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user) THEN (pg_options_to_table(um.umoptions)).option_value
2545 ELSE NULL END AS character_data) AS option_value
2546 FROM _pg_user_mappings um;
2548 GRANT SELECT ON user_mapping_options TO PUBLIC;
2553 * USER_MAPPINGS view
2555 CREATE VIEW user_mappings AS
2556 SELECT authorization_identifier,
2557 foreign_server_catalog,
2559 FROM _pg_user_mappings;
2561 GRANT SELECT ON user_mappings TO PUBLIC;