CREATESCHEMA information_schema; GRANTUSAGEONSCHEMA information_schema TO PUBLIC; SET search_path TO information_schema;
/* *Afewsupportingfunctionsfirst...
*/
/* Expand any 1-D array into a set with integers 1..N */ CREATE FUNCTION _pg_expandarray(IN anyarray, OUT x anyelement, OUT n int)
RETURNS SETOF RECORD
LANGUAGE sql STRICT IMMUTABLE PARALLEL SAFE
ROWS 100 SUPPORT pg_catalog.array_unnest_support AS'SELECT * FROM pg_catalog.unnest($1) WITH ORDINALITY';
/* Given an index's OID and an underlying-table column number, return the
* column's position in the index (NULL if not there) */ CREATE FUNCTION _pg_index_position(oid, smallint) RETURNS int
LANGUAGE sql STRICT STABLE
BEGIN ATOMIC SELECT (ss.a).n FROM
(SELECT information_schema._pg_expandarray(indkey) AS a FROM pg_catalog.pg_index WHERE indexrelid = $1) ss WHERE (ss.a).x = $2;
END;
CREATE FUNCTION _pg_truetypid(pg_attribute, pg_type) RETURNS oid
LANGUAGE sql
IMMUTABLE
PARALLEL SAFE
RETURNS NULLONNULL INPUT RETURNCASEWHEN $2.typtype = 'd'THEN $2.typbasetype ELSE $1.atttypid END;
CREATE VIEW applicable_roles AS SELECT CAST(a.rolname AS sql_identifier) AS grantee,
CAST(b.rolname AS sql_identifier) AS role_name,
CAST(CASEWHEN m.admin_option THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable FROM (SELECT member, roleid, admin_option FROM pg_auth_members -- This UNION could be UNION ALL, but UNION works even if we start -- to allow explicit pg_database_owner membership. UNION SELECT datdba, pg_authid.oid, false FROM pg_database, pg_authid WHERE datname = current_database() AND rolname = 'pg_database_owner'
) 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');
GRANTSELECTON applicable_roles TO PUBLIC;
/* *6.9 *ADMINISTRABLE_ROLE_AUTHORIZATIONSview
*/
CREATE VIEW administrable_role_authorizations AS SELECT * FROM applicable_roles WHERE is_grantable = 'YES';
GRANTSELECTON administrable_role_authorizations TO PUBLIC;
/* *6.11 *ASSERTIONSview
*/
-- feature not supported
/* *6.12 *ATTRIBUTESview
*/
CREATE VIEW attributes AS SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(nc.nspname AS sql_identifier) AS udt_schema,
CAST(c.relname AS sql_identifier) AS udt_name,
CAST(a.attname AS sql_identifier) AS attribute_name,
CAST(a.attnum AS cardinal_number) AS ordinal_position,
CAST(pg_get_expr(ad.adbin, ad.adrelid) AS character_data) AS attribute_default,
CAST(CASEWHEN a.attnotnull OR (t.typtype = 'd'AND t.typnotnull) THEN'NO'ELSE'YES' END AS yes_or_no) AS is_nullable, -- This column was apparently removed between SQL:2003 and SQL:2008.
CAST( CASEWHEN t.typelem <> 0AND t.typlen = -1THEN'ARRAY' WHEN nt.nspname = 'pg_catalog'THEN format_type(a.atttypid, null) ELSE'USER-DEFINED' END AS character_data) AS data_type,
CAST(
_pg_char_max_length(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS character_maximum_length,
CAST(
_pg_char_octet_length(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS character_octet_length,
CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(nullAS sql_identifier) AS character_set_name,
CAST(CASEWHEN nco.nspname ISNOTNULLTHEN current_database() END AS sql_identifier) AS collation_catalog,
CAST(nco.nspname AS sql_identifier) AS collation_schema,
CAST(co.collname AS sql_identifier) AS collation_name,
CAST(
_pg_numeric_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS numeric_precision,
CAST(
_pg_numeric_precision_radix(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS numeric_precision_radix,
CAST(
_pg_numeric_scale(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS numeric_scale,
CAST(
_pg_datetime_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS datetime_precision,
CAST(
_pg_interval_type(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS character_data) AS interval_type,
CAST(nullAS cardinal_number) AS interval_precision,
CAST(current_database() AS sql_identifier) AS attribute_udt_catalog,
CAST(nt.nspname AS sql_identifier) AS attribute_udt_schema,
CAST(t.typname AS sql_identifier) AS attribute_udt_name,
CAST(nullAS sql_identifier) AS scope_catalog,
CAST(nullAS sql_identifier) AS scope_schema,
CAST(nullAS sql_identifier) AS scope_name,
CAST(nullAS cardinal_number) AS maximum_cardinality,
CAST(a.attnum AS sql_identifier) AS dtd_identifier,
CAST('NO'AS yes_or_no) AS is_derived_reference_attribute
FROM (pg_attribute a LEFTJOIN pg_attrdef ad ON attrelid = adrelid AND attnum = adnum) JOIN (pg_class c JOIN pg_namespace nc ON (c.relnamespace = nc.oid)) ON a.attrelid = c.oid JOIN (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid)) ON a.atttypid = t.oid LEFTJOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid)) ON a.attcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
WHERE a.attnum > 0ANDNOT a.attisdropped AND c.relkind IN ('c') AND (pg_has_role(c.relowner, 'USAGE') OR has_type_privilege(c.reltype, 'USAGE'));
GRANTSELECTON attributes TO PUBLIC;
/* *6.13 *CHARACTER_SETSview
*/
CREATE VIEW character_sets AS SELECT CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(getdatabaseencoding() AS sql_identifier) AS character_set_name,
CAST(CASEWHEN getdatabaseencoding() = 'UTF8'THEN'UCS'ELSE getdatabaseencoding() END ASsql_identifier) AS character_repertoire,
CAST(getdatabaseencoding() AS sql_identifier) AS form_of_use,
CAST(current_database() AS sql_identifier) AS default_collate_catalog,
CAST(nc.nspname AS sql_identifier) AS default_collate_schema,
CAST(c.collname AS sql_identifier) AS default_collate_name FROM pg_database d LEFTJOIN (pg_collation c JOIN pg_namespace nc ON (c.collnamespace = nc.oid)) ON (datcollate = collcollate AND datctype = collctype) WHERE d.datname = current_database() ORDERBY char_length(c.collname) DESC, c.collname ASC-- prefer full/canonical name LIMIT1;
GRANTSELECTON character_sets TO PUBLIC;
/* *6.14 *CHECK_CONSTRAINT_ROUTINE_USAGEview
*/
CREATE VIEW check_constraint_routine_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(nc.nspname AS sql_identifier) AS constraint_schema,
CAST(c.conname AS sql_identifier) AS constraint_name,
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name FROM pg_namespace nc, pg_constraint c, pg_depend d, pg_proc p, pg_namespace np WHERE nc.oid = c.connamespace AND c.contype = 'c' AND c.oid = d.objid AND d.classid = 'pg_catalog.pg_constraint'::regclass 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');
GRANTSELECTON check_constraint_routine_usage TO PUBLIC;
/* *6.15 *CHECK_CONSTRAINTSview
*/
CREATE VIEW check_constraints AS SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(rs.nspname AS sql_identifier) AS constraint_schema,
CAST(con.conname AS sql_identifier) AS constraint_name,
CAST(pg_get_expr(con.conbin, coalesce(c.oid, 0)) AS character_data) AS check_clause FROM pg_constraint con LEFTOUTERJOIN pg_namespace rs ON (rs.oid = con.connamespace) LEFTOUTERJOIN pg_class c ON (c.oid = con.conrelid) LEFTOUTERJOIN pg_type t ON (t.oid = con.contypid) WHERE pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE') AND con.contype = 'c'
UNIONALL -- not-null constraints SELECT current_database()::information_schema.sql_identifier AS constraint_catalog,
rs.nspname::information_schema.sql_identifier AS constraint_schema,
con.conname::information_schema.sql_identifier AS constraint_name,
pg_catalog.format('%s IS NOT NULL', coalesce(at.attname, 'VALUE'))::information_schema.character_data AS check_clause FROM pg_constraint con LEFTJOIN pg_namespace rs ON rs.oid = con.connamespace LEFTJOIN pg_class c ON c.oid = con.conrelid LEFTJOIN pg_type t ON t.oid = con.contypid LEFTJOIN pg_attribute at ON (con.conrelid = at.attrelid AND con.conkey[1] = at.attnum) WHERE pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE'::text) AND con.contype = 'n';
GRANTSELECTON check_constraints TO PUBLIC;
/* *6.16 *COLLATIONSview
*/
CREATE VIEW collations AS SELECT CAST(current_database() AS sql_identifier) AS collation_catalog,
CAST(nc.nspname AS sql_identifier) AS collation_schema,
CAST(c.collname AS sql_identifier) AS collation_name,
CAST('NO PAD'AS character_data) AS pad_attribute FROM pg_collation c, pg_namespace nc WHERE c.collnamespace = nc.oid AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()));
CREATE VIEW collation_character_set_applicability AS SELECT CAST(current_database() AS sql_identifier) AS collation_catalog,
CAST(nc.nspname AS sql_identifier) AS collation_schema,
CAST(c.collname AS sql_identifier) AS collation_name,
CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(getdatabaseencoding() AS sql_identifier) AS character_set_name FROM pg_collation c, pg_namespace nc WHERE c.collnamespace = nc.oid AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()));
GRANTSELECTON collation_character_set_applicability TO PUBLIC;
/* *6.18 *COLUMN_COLUMN_USAGEview
*/
CREATE VIEW column_column_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(n.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(ac.attname AS sql_identifier) AS column_name,
CAST(ad.attname AS sql_identifier) AS dependent_column
FROM pg_namespace n, pg_class c, pg_depend d,
pg_attribute ac, pg_attribute ad, pg_attrdef atd
WHERE n.oid = c.relnamespace AND c.oid = ac.attrelid AND c.oid = ad.attrelid AND ac.attnum <> ad.attnum AND ad.attrelid = atd.adrelid AND ad.attnum = atd.adnum AND d.classid = 'pg_catalog.pg_attrdef'::regclass AND d.refclassid = 'pg_catalog.pg_class'::regclass AND d.objid = atd.oid AND d.refobjid = ac.attrelid AND d.refobjsubid = ac.attnum AND ad.attgenerated <> '' AND pg_has_role(c.relowner, 'USAGE');
GRANTSELECTON column_column_usage TO PUBLIC;
/* *6.19 *COLUMN_DOMAIN_USAGEview
*/
CREATE VIEW column_domain_usage AS SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
CAST(nt.nspname AS sql_identifier) AS domain_schema,
CAST(t.typname AS sql_identifier) AS domain_name,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name
FROM pg_type t, pg_namespace nt, pg_class c, pg_namespace nc,
pg_attribute a
WHERE t.typnamespace = nt.oid AND c.relnamespace = nc.oid AND a.attrelid = c.oid AND a.atttypid = t.oid AND t.typtype = 'd' AND c.relkind IN ('r', 'v', 'f', 'p') AND a.attnum > 0 ANDNOT a.attisdropped AND pg_has_role(t.typowner, 'USAGE');
GRANTSELECTON column_domain_usage TO PUBLIC;
/* *6.20 *COLUMN_PRIVILEGES
*/
CREATE VIEW column_privileges AS SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(x.relname AS sql_identifier) AS table_name,
CAST(x.attname AS sql_identifier) AS column_name,
CAST(x.prtype AS character_data) AS privilege_type,
CAST( CASEWHEN -- object owner always has grant options
pg_has_role(x.grantee, x.relowner, 'USAGE') OR x.grantable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable
FROM ( SELECT pr_c.grantor,
pr_c.grantee,
attname,
relname,
relnamespace,
pr_c.prtype,
pr_c.grantable,
pr_c.relowner FROM (SELECT oid, relname, relnamespace, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class WHERE relkind IN ('r', 'v', 'f', 'p')
) pr_c (oid, relname, relnamespace, relowner, grantor, grantee, prtype, grantable),
pg_attribute a WHERE a.attrelid = pr_c.oid AND a.attnum > 0 ANDNOT a.attisdropped UNION SELECT pr_a.grantor,
pr_a.grantee,
attname,
relname,
relnamespace,
pr_a.prtype,
pr_a.grantable,
c.relowner FROM (SELECT attrelid, attname, (aclexplode(coalesce(attacl, acldefault('c', relowner)))).* FROM pg_attribute a JOIN pg_class cc ON (a.attrelid = cc.oid) WHERE attnum > 0 ANDNOT attisdropped
) pr_a (attrelid, attname, grantor, grantee, prtype, grantable),
pg_class c WHERE pr_a.attrelid = c.oid AND relkind IN ('r', 'v', 'f', 'p')
) x,
pg_namespace nc,
pg_authid u_grantor,
( SELECT oid, rolname FROM pg_authid UNIONALL SELECT0::oid, 'PUBLIC'
) AS grantee (oid, rolname)
WHERE x.relnamespace = nc.oid AND x.grantee = grantee.oid 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 grantee.rolname = 'PUBLIC');
GRANTSELECTON column_privileges TO PUBLIC;
/* *6.21 *COLUMN_UDT_USAGEview
*/
CREATE VIEW column_udt_usage AS SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(coalesce(nbt.nspname, nt.nspname) AS sql_identifier) AS udt_schema,
CAST(coalesce(bt.typname, t.typname) AS sql_identifier) AS udt_name,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name
FROM pg_attribute a, pg_class c, pg_namespace nc,
(pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid)) LEFTJOIN (pg_type bt JOIN pg_namespace nbt ON (bt.typnamespace = nbt.oid)) ON (t.typtype = 'd'AND t.typbasetype = bt.oid)
WHERE a.attrelid = c.oid AND a.atttypid = t.oid AND nc.oid = c.relnamespace AND a.attnum > 0ANDNOT a.attisdropped AND c.relkind in ('r', 'v', 'f', 'p') AND pg_has_role(coalesce(bt.typowner, t.typowner), 'USAGE');
GRANTSELECTON column_udt_usage TO PUBLIC;
/* *6.22 *COLUMNSview
*/
CREATE VIEW columns AS SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name,
CAST(a.attnum AS cardinal_number) AS ordinal_position,
CAST(CASEWHEN a.attgenerated = ''THEN pg_get_expr(ad.adbin, ad.adrelid) END AS character_data) AS column_default,
CAST(CASEWHEN a.attnotnull OR (t.typtype = 'd'AND t.typnotnull) THEN'NO'ELSE'YES' END AS yes_or_no) AS is_nullable,
CAST( CASEWHEN t.typtype = 'd'THEN CASEWHEN bt.typelem <> 0AND bt.typlen = -1THEN'ARRAY' WHEN nbt.nspname = 'pg_catalog'THEN format_type(t.typbasetype, null) ELSE'USER-DEFINED' END ELSE CASEWHEN t.typelem <> 0AND t.typlen = -1THEN'ARRAY' WHEN nt.nspname = 'pg_catalog'THEN format_type(a.atttypid, null) ELSE'USER-DEFINED' END
END AS character_data) AS data_type,
CAST(
_pg_char_max_length(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS character_maximum_length,
CAST(
_pg_char_octet_length(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS character_octet_length,
CAST(
_pg_numeric_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS numeric_precision,
CAST(
_pg_numeric_precision_radix(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS numeric_precision_radix,
CAST(
_pg_numeric_scale(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS numeric_scale,
CAST(
_pg_datetime_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS cardinal_number) AS datetime_precision,
CAST(
_pg_interval_type(_pg_truetypid(a, t), _pg_truetypmod(a, t)) AS character_data) AS interval_type,
CAST(nullAS cardinal_number) AS interval_precision,
CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(nullAS sql_identifier) AS character_set_name,
CAST(CASEWHEN nco.nspname ISNOTNULLTHEN current_database() END AS sql_identifier) AS collation_catalog,
CAST(nco.nspname AS sql_identifier) AS collation_schema,
CAST(co.collname AS sql_identifier) AS collation_name,
CAST(CASEWHEN t.typtype = 'd'THEN current_database() ELSEnull END AS sql_identifier) AS domain_catalog,
CAST(CASEWHEN t.typtype = 'd'THEN nt.nspname ELSEnull END AS sql_identifier) AS domain_schema,
CAST(CASEWHEN t.typtype = 'd'THEN t.typname ELSEnull END AS sql_identifier) AS domain_name,
CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(coalesce(nbt.nspname, nt.nspname) AS sql_identifier) AS udt_schema,
CAST(coalesce(bt.typname, t.typname) AS sql_identifier) AS udt_name,
CAST(nullAS sql_identifier) AS scope_catalog,
CAST(nullAS sql_identifier) AS scope_schema,
CAST(nullAS sql_identifier) AS scope_name,
CAST(nullAS cardinal_number) AS maximum_cardinality,
CAST(a.attnum AS sql_identifier) AS dtd_identifier,
CAST('NO'AS yes_or_no) AS is_self_referencing,
CAST(CASEWHEN a.attidentity IN ('a', 'd') THEN'YES'ELSE'NO' END AS yes_or_no) AS is_identity,
CAST(CASE a.attidentity WHEN'a'THEN'ALWAYS'WHEN'd'THEN'BY DEFAULT' END AS character_data) AS identity_generation,
CAST(seq.seqstart AS character_data) AS identity_start,
CAST(seq.seqincrement AS character_data) AS identity_increment,
CAST(seq.seqmax AS character_data) AS identity_maximum,
CAST(seq.seqmin AS character_data) AS identity_minimum,
CAST(CASEWHEN seq.seqcycle THEN'YES'ELSE'NO' END AS yes_or_no) AS identity_cycle,
CAST(CASEWHEN a.attgenerated <> ''THEN'ALWAYS'ELSE'NEVER' END AS character_data) AS is_generated,
CAST(CASEWHEN a.attgenerated <> ''THEN pg_get_expr(ad.adbin, ad.adrelid) END AS character_data) AS generation_expression,
CAST(CASEWHEN c.relkind IN ('r', 'p') OR
(c.relkind IN ('v', 'f') AND
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 LEFTJOIN pg_attrdef ad ON attrelid = adrelid AND attnum = adnum) JOIN (pg_class c JOIN pg_namespace nc ON (c.relnamespace = nc.oid)) ON a.attrelid = c.oid JOIN (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid)) ON a.atttypid = t.oid LEFTJOIN (pg_type bt JOIN pg_namespace nbt ON (bt.typnamespace = nbt.oid)) ON (t.typtype = 'd'AND t.typbasetype = bt.oid) LEFTJOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid)) ON a.attcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default') LEFTJOIN (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))
AND a.attnum > 0ANDNOT a.attisdropped AND c.relkind IN ('r', 'v', 'f', 'p')
AND (pg_has_role(c.relowner, 'USAGE') OR has_column_privilege(c.oid, a.attnum, 'SELECT, INSERT, UPDATE, REFERENCES'));
GRANTSELECTON columns TO PUBLIC;
/* *6.23 *CONSTRAINT_COLUMN_USAGEview
*/
CREATE VIEW constraint_column_usage AS SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(tblschema AS sql_identifier) AS table_schema,
CAST(tblname AS sql_identifier) AS table_name,
CAST(colname AS sql_identifier) AS column_name,
CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(cstrschema AS sql_identifier) AS constraint_schema,
CAST(cstrname AS sql_identifier) AS constraint_name
FROM ( /* check constraints */ SELECTDISTINCT nr.nspname, r.relname, r.relowner, a.attname, nc.nspname, c.conname FROM pg_namespace nr, pg_class r, pg_attribute a, pg_depend d, pg_namespace nc, pg_constraint c WHERE nr.oid = r.relnamespace AND r.oid = a.attrelid AND d.refclassid = 'pg_catalog.pg_class'::regclass AND d.refobjid = r.oid AND d.refobjsubid = a.attnum AND d.classid = 'pg_catalog.pg_constraint'::regclass AND d.objid = c.oid AND c.connamespace = nc.oid AND c.contype = 'c' AND r.relkind IN ('r', 'p') ANDNOT a.attisdropped
UNIONALL
/* not-null constraints */ SELECTDISTINCT nr.nspname, r.relname, r.relowner, a.attname, nc.nspname, c.conname FROM pg_namespace nr, pg_class r, pg_attribute a, pg_namespace nc, pg_constraint c WHERE nr.oid = r.relnamespace AND r.oid = a.attrelid AND r.oid = c.conrelid AND a.attnum = c.conkey[1] AND c.connamespace = nc.oid AND c.contype = 'n' AND r.relkind in ('r', 'p') ANDnot a.attisdropped
UNIONALL
/* unique/primary key/foreign key constraints */ SELECT nr.nspname, r.relname, r.relowner, a.attname, nc.nspname, c.conname FROM pg_namespace nr, pg_class r, pg_attribute a, pg_namespace nc,
pg_constraint c WHERE nr.oid = r.relnamespace AND r.oid = a.attrelid AND nc.oid = c.connamespace AND r.oid = CASE c.contype WHEN'f'THEN c.confrelid ELSE c.conrelid END AND a.attnum = ANY (CASE c.contype WHEN'f'THEN c.confkey ELSE c.conkey END) ANDNOT a.attisdropped AND c.contype IN ('p', 'u', 'f') AND r.relkind IN ('r', 'p')
) AS x (tblschema, tblname, tblowner, colname, cstrschema, cstrname)
WHERE pg_has_role(x.tblowner, 'USAGE');
GRANTSELECTON constraint_column_usage TO PUBLIC;
/* *6.24 *CONSTRAINT_PERIOD_USAGEview
*/
-- feature not supported
/* *6.25 *CONSTRAINT_TABLE_USAGEview
*/
CREATE VIEW constraint_table_usage AS SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nr.nspname AS sql_identifier) AS table_schema,
CAST(r.relname AS sql_identifier) AS table_name,
CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(nc.nspname AS sql_identifier) AS constraint_schema,
CAST(c.conname AS sql_identifier) AS constraint_name
FROM pg_constraint c, pg_namespace nc,
pg_class r, pg_namespace nr
WHERE c.connamespace = nc.oid AND r.relnamespace = nr.oid 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');
GRANTSELECTON constraint_table_usage TO PUBLIC;
-- 6.26 DATA_TYPE_PRIVILEGES view appears later.
/* *6.27 *DIRECT_SUPERTABLESview
*/
-- feature not supported
/* *6.28 *DIRECT_SUPERTYPESview
*/
-- feature not supported
/* *6.29 *DOMAIN_CONSTRAINTSview
*/
CREATE VIEW domain_constraints AS SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(rs.nspname AS sql_identifier) AS constraint_schema,
CAST(con.conname AS sql_identifier) AS constraint_name,
CAST(current_database() AS sql_identifier) AS domain_catalog,
CAST(n.nspname AS sql_identifier) AS domain_schema,
CAST(t.typname AS sql_identifier) AS domain_name,
CAST(CASEWHEN condeferrable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_deferrable,
CAST(CASEWHEN condeferred THEN'YES'ELSE'NO' END AS yes_or_no) AS initially_deferred FROM pg_namespace rs, pg_namespace n, pg_constraint con, pg_type t WHERE rs.oid = con.connamespace AND n.oid = t.typnamespace AND t.oid = con.contypid AND (pg_has_role(t.typowner, 'USAGE') OR has_type_privilege(t.oid, 'USAGE'));
CREATE VIEW domain_udt_usage AS SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(nbt.nspname AS sql_identifier) AS udt_schema,
CAST(bt.typname AS sql_identifier) AS udt_name,
CAST(current_database() AS sql_identifier) AS domain_catalog,
CAST(nt.nspname AS sql_identifier) AS domain_schema,
CAST(t.typname AS sql_identifier) AS domain_name
FROM pg_type t, pg_namespace nt,
pg_type bt, pg_namespace nbt
WHERE t.typnamespace = nt.oid AND t.typbasetype = bt.oid AND bt.typnamespace = nbt.oid AND t.typtype = 'd' AND pg_has_role(bt.typowner, 'USAGE');
GRANTSELECTON domain_udt_usage TO PUBLIC;
/* *6.30 *DOMAINSview
*/
CREATE VIEW domains AS SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
CAST(nt.nspname AS sql_identifier) AS domain_schema,
CAST(t.typname AS sql_identifier) AS domain_name,
CAST( CASEWHEN t.typelem <> 0AND t.typlen = -1THEN'ARRAY' WHEN nbt.nspname = 'pg_catalog'THEN format_type(t.typbasetype, null) ELSE'USER-DEFINED' END AS character_data) AS data_type,
CAST(
_pg_char_max_length(t.typbasetype, t.typtypmod) AS cardinal_number) AS character_maximum_length,
CAST(
_pg_char_octet_length(t.typbasetype, t.typtypmod) AS cardinal_number) AS character_octet_length,
CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(nullAS sql_identifier) AS character_set_name,
CAST(CASEWHEN nco.nspname ISNOTNULLTHEN current_database() END AS sql_identifier) AS collation_catalog,
CAST(nco.nspname AS sql_identifier) AS collation_schema,
CAST(co.collname AS sql_identifier) AS collation_name,
CAST(
_pg_numeric_precision(t.typbasetype, t.typtypmod) AS cardinal_number) AS numeric_precision,
CAST(
_pg_numeric_precision_radix(t.typbasetype, t.typtypmod) AS cardinal_number) AS numeric_precision_radix,
CAST(
_pg_numeric_scale(t.typbasetype, t.typtypmod) AS cardinal_number) AS numeric_scale,
CAST(
_pg_datetime_precision(t.typbasetype, t.typtypmod) AS cardinal_number) AS datetime_precision,
CAST(
_pg_interval_type(t.typbasetype, t.typtypmod) AS character_data) AS interval_type,
CAST(nullAS cardinal_number) AS interval_precision,
CAST(t.typdefault AS character_data) AS domain_default,
CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(nbt.nspname AS sql_identifier) AS udt_schema,
CAST(bt.typname AS sql_identifier) AS udt_name,
CAST(nullAS sql_identifier) AS scope_catalog,
CAST(nullAS sql_identifier) AS scope_schema,
CAST(nullAS sql_identifier) AS scope_name,
CAST(nullAS cardinal_number) AS maximum_cardinality,
CAST(1AS sql_identifier) AS dtd_identifier
FROM (pg_type t JOIN pg_namespace nt ON t.typnamespace = nt.oid) JOIN (pg_type bt JOIN pg_namespace nbt ON bt.typnamespace = nbt.oid) ON (t.typbasetype = bt.oid AND t.typtype = 'd') LEFTJOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid)) ON t.typcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
WHERE (pg_has_role(t.typowner, 'USAGE') OR has_type_privilege(t.oid, 'USAGE'));
GRANTSELECTON domains TO PUBLIC;
-- 6.31 ELEMENT_TYPES view appears later.
/* *6.32 *ENABLED_ROLESview
*/
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');
GRANTSELECTON enabled_roles TO PUBLIC;
/* *6.33 *FIELDSview
*/
-- feature not supported
/* *6.34 *KEY_COLUMN_USAGEview
*/
CREATE VIEW key_column_usage AS SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(nc_nspname AS sql_identifier) AS constraint_schema,
CAST(conname AS sql_identifier) AS constraint_name,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nr_nspname AS sql_identifier) AS table_schema,
CAST(relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name,
CAST((ss.x).n AS cardinal_number) AS ordinal_position,
CAST(CASEWHEN contype = 'f'THEN
_pg_index_position(ss.conindid, ss.confkey[(ss.x).n]) ELSENULL
END AS cardinal_number) AS position_in_unique_constraint FROM pg_attribute a,
(SELECT r.oid AS roid, r.relname, r.relowner,
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 FROM pg_namespace nr, pg_class r, pg_namespace nc,
pg_constraint c WHERE nr.oid = r.relnamespace AND r.oid = c.conrelid 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 WHERE ss.roid = a.attrelid AND a.attnum = (ss.x).x ANDNOT a.attisdropped AND (pg_has_role(relowner, 'USAGE') OR has_column_privilege(roid, a.attnum, 'SELECT, INSERT, UPDATE, REFERENCES'));
GRANTSELECTON key_column_usage TO PUBLIC;
/* *6.35 *KEY_PERIOD_USAGEview
*/
-- feature not supported
/* *6.36 *METHOD_SPECIFICATION_PARAMETERSview
*/
-- feature not supported
/* *6.37 *METHOD_SPECIFICATIONSview
*/
-- feature not supported
/* *6.38 *PARAMETERSview
*/
CREATE VIEW parameters AS SELECT CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(n_nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(proname, p_oid) AS sql_identifier) AS specific_name,
CAST((ss.x).n AS cardinal_number) AS ordinal_position,
CAST( CASEWHEN proargmodes ISNULLTHEN'IN' WHEN proargmodes[(ss.x).n] = 'i'THEN'IN' WHEN proargmodes[(ss.x).n] = 'o'THEN'OUT' WHEN proargmodes[(ss.x).n] = 'b'THEN'INOUT' WHEN proargmodes[(ss.x).n] = 'v'THEN'IN' WHEN proargmodes[(ss.x).n] = 't'THEN'OUT'
END AS character_data) AS parameter_mode,
CAST('NO'AS yes_or_no) AS is_result,
CAST('NO'AS yes_or_no) AS as_locator,
CAST(NULLIF(proargnames[(ss.x).n], '') AS sql_identifier) AS parameter_name,
CAST( CASEWHEN t.typelem <> 0AND t.typlen = -1THEN'ARRAY' WHEN nt.nspname = 'pg_catalog'THEN format_type(t.oid, null) ELSE'USER-DEFINED' END AS character_data) AS data_type,
CAST(nullAS cardinal_number) AS character_maximum_length,
CAST(nullAS cardinal_number) AS character_octet_length,
CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(nullAS sql_identifier) AS character_set_name,
CAST(nullAS sql_identifier) AS collation_catalog,
CAST(nullAS sql_identifier) AS collation_schema,
CAST(nullAS sql_identifier) AS collation_name,
CAST(nullAS cardinal_number) AS numeric_precision,
CAST(nullAS cardinal_number) AS numeric_precision_radix,
CAST(nullAS cardinal_number) AS numeric_scale,
CAST(nullAS cardinal_number) AS datetime_precision,
CAST(nullAS character_data) AS interval_type,
CAST(nullAS cardinal_number) AS interval_precision,
CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(nt.nspname AS sql_identifier) AS udt_schema,
CAST(t.typname AS sql_identifier) AS udt_name,
CAST(nullAS sql_identifier) AS scope_catalog,
CAST(nullAS sql_identifier) AS scope_schema,
CAST(nullAS sql_identifier) AS scope_name,
CAST(nullAS cardinal_number) AS maximum_cardinality,
CAST((ss.x).n AS sql_identifier) AS dtd_identifier,
CAST( CASEWHEN pg_has_role(proowner, 'USAGE') THEN pg_get_function_arg_default(p_oid, (ss.x).n) ELSENULL 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 FROM pg_namespace n, pg_proc p WHERE n.oid = p.pronamespace AND (pg_has_role(p.proowner, 'USAGE') OR
has_function_privilege(p.oid, 'EXECUTE'))) AS ss WHERE t.oid = (ss.x).x AND t.typnamespace = nt.oid;
GRANTSELECTON parameters TO PUBLIC;
/* *6.39 *PERIODSview
*/
-- feature not supported
/* *6.40 *PRIVATE_PARAMETERSview
*/
-- feature not supported
/* *6.41 *REFERENCED_TYPESview
*/
-- feature not supported
/* *6.42 *REFERENTIAL_CONSTRAINTSview
*/
CREATE VIEW referential_constraints AS SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(ncon.nspname AS sql_identifier) AS constraint_schema,
CAST(con.conname AS sql_identifier) AS constraint_name,
CAST( CASEWHEN npkc.nspname ISNULLTHENNULL ELSE current_database() END AS sql_identifier) AS unique_constraint_catalog,
CAST(npkc.nspname AS sql_identifier) AS unique_constraint_schema,
CAST(pkc.conname AS sql_identifier) AS unique_constraint_name,
CAST( CASE con.confmatchtype WHEN'f'THEN'FULL' WHEN'p'THEN'PARTIAL' WHEN's'THEN'NONE' END AS character_data) AS match_option,
CAST( CASE con.confupdtype WHEN'c'THEN'CASCADE' WHEN'n'THEN'SET NULL' WHEN'd'THEN'SET DEFAULT' WHEN'r'THEN'RESTRICT' WHEN'a'THEN'NO ACTION' END AS character_data) AS update_rule,
CAST( CASE con.confdeltype WHEN'c'THEN'CASCADE' WHEN'n'THEN'SET NULL' WHEN'd'THEN'SET DEFAULT' WHEN'r'THEN'RESTRICT' WHEN'a'THEN'NO ACTION' END AS character_data) AS delete_rule
FROM (pg_namespace ncon INNERJOIN pg_constraint con ON ncon.oid = con.connamespace INNERJOIN pg_class c ON con.conrelid = c.oid AND con.contype = 'f') LEFTJOIN pg_depend d1 -- find constraint's dependency on an index ON d1.objid = con.oid AND d1.classid = 'pg_constraint'::regclass AND d1.refclassid = 'pg_class'::regclass AND d1.refobjsubid = 0 LEFTJOIN pg_depend d2 -- find pkey/unique constraint for that index ON d2.refclassid = 'pg_constraint'::regclass AND d2.classid = 'pg_class'::regclass AND d2.objid = d1.refobjid AND d2.objsubid = 0 AND d2.deptype = 'i' LEFTJOIN pg_constraint pkc ON pkc.oid = d2.refobjid AND pkc.contype IN ('p', 'u') AND pkc.conrelid = con.confrelid LEFTJOIN pg_namespace npkc ON pkc.connamespace = npkc.oid
WHERE 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') ;
GRANTSELECTON referential_constraints TO PUBLIC;
/* *6.43 *ROLE_COLUMN_GRANTSview
*/
CREATE VIEW role_column_grants AS SELECT grantor,
grantee,
table_catalog,
table_schema,
table_name,
column_name,
privilege_type,
is_grantable FROM column_privileges WHERE grantor IN (SELECT role_name FROM enabled_roles) OR grantee IN (SELECT role_name FROM enabled_roles);
GRANTSELECTON role_column_grants TO PUBLIC;
-- 6.44 ROLE_ROUTINE_GRANTS view is based on 6.51 ROUTINE_PRIVILEGES and is defined there instead.
-- 6.45 ROLE_TABLE_GRANTS view is based on 6.64 TABLE_PRIVILEGES and is defined there instead.
/* *6.46 *ROLE_TABLE_METHOD_GRANTSview
*/
-- feature not supported
-- 6.47 ROLE_USAGE_GRANTS view is based on 6.76 USAGE_PRIVILEGES and is defined there instead.
-- 6.48 ROLE_UDT_GRANTS view is based on 6.75 UDT_PRIVILEGES and is defined there instead.
/* *6.49 *ROUTINE_COLUMN_USAGEview
*/
CREATE VIEW routine_column_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
CAST(current_database() AS sql_identifier) AS routine_catalog,
CAST(np.nspname AS sql_identifier) AS routine_schema,
CAST(p.proname AS sql_identifier) AS routine_name,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nt.nspname AS sql_identifier) AS table_schema,
CAST(t.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name
FROM pg_namespace np, pg_proc p, pg_depend d,
pg_class t, pg_namespace nt, pg_attribute a
WHERE np.oid = p.pronamespace AND p.oid = d.objid AND d.classid = 'pg_catalog.pg_proc'::regclass AND d.refobjid = t.oid AND d.refclassid = 'pg_catalog.pg_class'::regclass AND t.relnamespace = nt.oid AND t.relkind IN ('r', 'v', 'f', 'p') AND t.oid = a.attrelid AND d.refobjsubid = a.attnum AND pg_has_role(t.relowner, 'USAGE');
GRANTSELECTON routine_column_usage TO PUBLIC;
/* *6.50 *ROUTINE_PERIOD_USAGEview
*/
-- feature not supported
/* *6.51 *ROUTINE_PRIVILEGESview
*/
CREATE VIEW routine_privileges AS SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(n.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
CAST(current_database() AS sql_identifier) AS routine_catalog,
CAST(n.nspname AS sql_identifier) AS routine_schema,
CAST(p.proname AS sql_identifier) AS routine_name,
CAST('EXECUTE'AS character_data) AS privilege_type,
CAST( CASEWHEN -- object owner always has grant options
pg_has_role(grantee.oid, p.proowner, 'USAGE') OR p.grantable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable
FROM ( SELECT oid, proname, proowner, pronamespace, (aclexplode(coalesce(proacl, acldefault('f', proowner)))).* FROM pg_proc
) p (oid, proname, proowner, pronamespace, grantor, grantee, prtype, grantable),
pg_namespace n,
pg_authid u_grantor,
( SELECT oid, rolname FROM pg_authid UNIONALL SELECT0::oid, 'PUBLIC'
) AS grantee (oid, rolname)
WHERE p.pronamespace = n.oid AND grantee.oid = p.grantee 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 grantee.rolname = 'PUBLIC');
GRANTSELECTON routine_privileges TO PUBLIC;
/* *6.43 *ROLE_ROUTINE_GRANTSview
*/
CREATE VIEW role_routine_grants AS SELECT grantor,
grantee,
specific_catalog,
specific_schema,
specific_name,
routine_catalog,
routine_schema,
routine_name,
privilege_type,
is_grantable FROM routine_privileges WHERE grantor IN (SELECT role_name FROM enabled_roles) OR grantee IN (SELECT role_name FROM enabled_roles);
GRANTSELECTON role_routine_grants TO PUBLIC;
/* *6.52 *ROUTINE_ROUTINE_USAGEview
*/
CREATE VIEW routine_routine_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
CAST(current_database() AS sql_identifier) AS routine_catalog,
CAST(np1.nspname AS sql_identifier) AS routine_schema,
CAST(nameconcatoid(p1.proname, p1.oid) AS sql_identifier) AS routine_name
WHERE np.oid = p.pronamespace AND p.oid = d.objid AND d.classid = 'pg_catalog.pg_proc'::regclass AND d.refobjid = p1.oid AND d.refclassid = 'pg_catalog.pg_proc'::regclass AND p1.pronamespace = np1.oid AND p.prokind IN ('f', 'p') AND p1.prokind IN ('f', 'p') AND pg_has_role(p1.proowner, 'USAGE');
GRANTSELECTON routine_routine_usage TO PUBLIC;
/* *6.53 *ROUTINE_SEQUENCE_USAGEview
*/
CREATE VIEW routine_sequence_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
CAST(current_database() AS sql_identifier) AS routine_catalog,
CAST(np.nspname AS sql_identifier) AS routine_schema,
CAST(p.proname AS sql_identifier) AS routine_name,
CAST(current_database() AS sql_identifier) AS sequence_catalog,
CAST(ns.nspname AS sql_identifier) AS sequence_schema,
CAST(s.relname AS sql_identifier) AS sequence_name
WHERE np.oid = p.pronamespace AND p.oid = d.objid AND d.classid = 'pg_catalog.pg_proc'::regclass AND d.refobjid = s.oid AND d.refclassid = 'pg_catalog.pg_class'::regclass AND s.relnamespace = ns.oid AND s.relkind = 'S' AND pg_has_role(s.relowner, 'USAGE');
GRANTSELECTON routine_sequence_usage TO PUBLIC;
/* *6.54 *ROUTINE_TABLE_USAGEview
*/
CREATE VIEW routine_table_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
CAST(current_database() AS sql_identifier) AS routine_catalog,
CAST(np.nspname AS sql_identifier) AS routine_schema,
CAST(p.proname AS sql_identifier) AS routine_name,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nt.nspname AS sql_identifier) AS table_schema,
CAST(t.relname AS sql_identifier) AS table_name
FROM pg_namespace np, pg_proc p, pg_depend d,
pg_class t, pg_namespace nt
WHERE np.oid = p.pronamespace AND p.oid = d.objid AND d.classid = 'pg_catalog.pg_proc'::regclass AND d.refobjid = t.oid AND d.refclassid = 'pg_catalog.pg_class'::regclass AND t.relnamespace = nt.oid AND t.relkind IN ('r', 'v', 'f', 'p') AND pg_has_role(t.relowner, 'USAGE');
GRANTSELECTON routine_table_usage TO PUBLIC;
/* *6.55 *ROUTINESview
*/
CREATE VIEW routines AS SELECT CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(n.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
CAST(current_database() AS sql_identifier) AS routine_catalog,
CAST(n.nspname AS sql_identifier) AS routine_schema,
CAST(p.proname AS sql_identifier) AS routine_name,
CAST(CASE p.prokind WHEN'f'THEN'FUNCTION'WHEN'p'THEN'PROCEDURE' END AS character_data) AS routine_type,
CAST(nullAS sql_identifier) AS module_catalog,
CAST(nullAS sql_identifier) AS module_schema,
CAST(nullAS sql_identifier) AS module_name,
CAST(nullAS sql_identifier) AS udt_catalog,
CAST(nullAS sql_identifier) AS udt_schema,
CAST(nullAS sql_identifier) AS udt_name,
CAST( CASEWHEN p.prokind = 'p'THENNULL WHEN t.typelem <> 0AND t.typlen = -1THEN'ARRAY' WHEN nt.nspname = 'pg_catalog'THEN format_type(t.oid, null) ELSE'USER-DEFINED' END AS character_data) AS data_type,
CAST(nullAS cardinal_number) AS character_maximum_length,
CAST(nullAS cardinal_number) AS character_octet_length,
CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(nullAS sql_identifier) AS character_set_name,
CAST(nullAS sql_identifier) AS collation_catalog,
CAST(nullAS sql_identifier) AS collation_schema,
CAST(nullAS sql_identifier) AS collation_name,
CAST(nullAS cardinal_number) AS numeric_precision,
CAST(nullAS cardinal_number) AS numeric_precision_radix,
CAST(nullAS cardinal_number) AS numeric_scale,
CAST(nullAS cardinal_number) AS datetime_precision,
CAST(nullAS character_data) AS interval_type,
CAST(nullAS cardinal_number) AS interval_precision,
CAST(CASEWHEN nt.nspname ISNOTNULLTHEN current_database() END AS sql_identifier) AS type_udt_catalog,
CAST(nt.nspname AS sql_identifier) AS type_udt_schema,
CAST(t.typname AS sql_identifier) AS type_udt_name,
CAST(nullAS sql_identifier) AS scope_catalog,
CAST(nullAS sql_identifier) AS scope_schema,
CAST(nullAS sql_identifier) AS scope_name,
CAST(nullAS cardinal_number) AS maximum_cardinality,
CAST(CASEWHEN p.prokind <> 'p'THEN0 END AS sql_identifier) AS dtd_identifier,
CAST(CASEWHEN l.lanname = 'sql'THEN'SQL'ELSE'EXTERNAL' END AS character_data) AS routine_body,
CAST( CASEWHEN pg_has_role(p.proowner, 'USAGE') THEN p.prosrc ELSEnull END AS character_data) AS routine_definition,
CAST( CASEWHEN l.lanname = 'c'THEN p.prosrc ELSEnull END AS character_data) AS external_name,
CAST(upper(l.lanname) AS character_data) AS external_language,
CAST('GENERAL'AS character_data) AS parameter_style,
CAST(CASEWHEN p.provolatile = 'i'THEN'YES'ELSE'NO' END AS yes_or_no) AS is_deterministic,
CAST('MODIFIES'AS character_data) AS sql_data_access,
CAST(CASEWHEN p.prokind <> 'p'THEN CASEWHEN p.proisstrict THEN'YES'ELSE'NO' END END AS yes_or_no) AS is_null_call,
CAST(nullAS character_data) AS sql_path,
CAST('YES'AS yes_or_no) AS schema_level_routine,
CAST(0AS cardinal_number) AS max_dynamic_result_sets,
CAST(nullAS yes_or_no) AS is_user_defined_cast,
CAST(nullAS yes_or_no) AS is_implicitly_invocable,
CAST(CASEWHEN p.prosecdef THEN'DEFINER'ELSE'INVOKER' END AS character_data) AS security_type,
CAST(nullAS sql_identifier) AS to_sql_specific_catalog,
CAST(nullAS sql_identifier) AS to_sql_specific_schema,
CAST(nullAS sql_identifier) AS to_sql_specific_name,
CAST('NO'AS yes_or_no) AS as_locator,
CAST(nullAS time_stamp) AS created,
CAST(nullAS time_stamp) AS last_altered,
CAST(nullAS yes_or_no) AS new_savepoint_level,
CAST('NO'AS yes_or_no) AS is_udt_dependent,
CAST(nullAS character_data) AS result_cast_from_data_type,
CAST(nullAS yes_or_no) AS result_cast_as_locator,
CAST(nullAS cardinal_number) AS result_cast_char_max_length,
CAST(nullAS cardinal_number) AS result_cast_char_octet_length,
CAST(nullAS sql_identifier) AS result_cast_char_set_catalog,
CAST(nullAS sql_identifier) AS result_cast_char_set_schema,
CAST(nullAS sql_identifier) AS result_cast_char_set_name,
CAST(nullAS sql_identifier) AS result_cast_collation_catalog,
CAST(nullAS sql_identifier) AS result_cast_collation_schema,
CAST(nullAS sql_identifier) AS result_cast_collation_name,
CAST(nullAS cardinal_number) AS result_cast_numeric_precision,
CAST(nullAS cardinal_number) AS result_cast_numeric_precision_radix,
CAST(nullAS cardinal_number) AS result_cast_numeric_scale,
CAST(nullAS cardinal_number) AS result_cast_datetime_precision,
CAST(nullAS character_data) AS result_cast_interval_type,
CAST(nullAS cardinal_number) AS result_cast_interval_precision,
CAST(nullAS sql_identifier) AS result_cast_type_udt_catalog,
CAST(nullAS sql_identifier) AS result_cast_type_udt_schema,
CAST(nullAS sql_identifier) AS result_cast_type_udt_name,
CAST(nullAS sql_identifier) AS result_cast_scope_catalog,
CAST(nullAS sql_identifier) AS result_cast_scope_schema,
CAST(nullAS sql_identifier) AS result_cast_scope_name,
CAST(nullAS cardinal_number) AS result_cast_maximum_cardinality,
CAST(nullAS sql_identifier) AS result_cast_dtd_identifier
FROM (pg_namespace n JOIN pg_proc p ON n.oid = p.pronamespace JOIN pg_language l ON p.prolang = l.oid) LEFTJOIN
(pg_type t JOIN pg_namespace nt ON t.typnamespace = nt.oid) ON p.prorettype = t.oid AND p.prokind <> 'p'
WHERE (pg_has_role(p.proowner, 'USAGE') OR has_function_privilege(p.oid, 'EXECUTE'));
GRANTSELECTON routines TO PUBLIC;
/* *6.56 *SCHEMATAview
*/
CREATE VIEW schemata AS SELECT CAST(current_database() AS sql_identifier) AS catalog_name,
CAST(n.nspname AS sql_identifier) AS schema_name,
CAST(u.rolname AS sql_identifier) AS schema_owner,
CAST(nullAS sql_identifier) AS default_character_set_catalog,
CAST(nullAS sql_identifier) AS default_character_set_schema,
CAST(nullAS sql_identifier) AS default_character_set_name,
CAST(nullAS character_data) AS sql_path FROM pg_namespace n, pg_authid u WHERE n.nspowner = u.oid AND (pg_has_role(n.nspowner, 'USAGE') OR has_schema_privilege(n.oid, 'CREATE, USAGE'));
GRANTSELECTON schemata TO PUBLIC;
/* *6.57 *SEQUENCESview
*/
CREATE VIEW sequences AS SELECT CAST(current_database() AS sql_identifier) AS sequence_catalog,
CAST(nc.nspname AS sql_identifier) AS sequence_schema,
CAST(c.relname AS sql_identifier) AS sequence_name,
CAST(format_type(s.seqtypid, null) AS character_data) AS data_type,
CAST(_pg_numeric_precision(s.seqtypid, -1) AS cardinal_number) AS numeric_precision,
CAST(2AS cardinal_number) AS numeric_precision_radix,
CAST(0AS cardinal_number) AS numeric_scale,
CAST(s.seqstart AS character_data) AS start_value,
CAST(s.seqmin AS character_data) AS minimum_value,
CAST(s.seqmax AS character_data) AS maximum_value,
CAST(s.seqincrement AS character_data) AS increment,
CAST(CASEWHEN s.seqcycle THEN'YES'ELSE'NO' END AS yes_or_no) AS cycle_option FROM pg_namespace nc, pg_class c, pg_sequence s WHERE c.relnamespace = nc.oid AND c.relkind = 'S' ANDNOTEXISTS (SELECT1FROM pg_depend WHERE classid = 'pg_class'::regclass AND objid = c.oid AND deptype = 'i') AND (NOT 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') );
INSERTINTO sql_sizing VALUES (34, 'MAXIMUM CATALOG NAME LENGTH', 63, NULL); INSERTINTO sql_sizing VALUES (30, 'MAXIMUM COLUMN NAME LENGTH', 63, NULL); INSERTINTO sql_sizing VALUES (97, 'MAXIMUM COLUMNS IN GROUP BY', 0, NULL); INSERTINTO sql_sizing VALUES (99, 'MAXIMUM COLUMNS IN ORDER BY', 0, NULL); INSERTINTO sql_sizing VALUES (100, 'MAXIMUM COLUMNS IN SELECT', 1664, NULL); -- match MaxTupleAttributeNumber INSERTINTO sql_sizing VALUES (101, 'MAXIMUM COLUMNS IN TABLE', 1600, NULL); -- match MaxHeapAttributeNumber INSERTINTO sql_sizing VALUES (1, 'MAXIMUM CONCURRENT ACTIVITIES', 0, NULL); INSERTINTO sql_sizing VALUES (31, 'MAXIMUM CURSOR NAME LENGTH', 63, NULL); INSERTINTO sql_sizing VALUES (0, 'MAXIMUM DRIVER CONNECTIONS', NULL, NULL); INSERTINTO sql_sizing VALUES (10005, 'MAXIMUM IDENTIFIER LENGTH', 63, NULL); INSERTINTO sql_sizing VALUES (32, 'MAXIMUM SCHEMA NAME LENGTH', 63, NULL); INSERTINTO sql_sizing VALUES (20000, 'MAXIMUM STATEMENT OCTETS', 0, NULL); INSERTINTO sql_sizing VALUES (20001, 'MAXIMUM STATEMENT OCTETS DATA', 0, NULL); INSERTINTO sql_sizing VALUES (20002, 'MAXIMUM STATEMENT OCTETS SCHEMA', 0, NULL); INSERTINTO sql_sizing VALUES (35, 'MAXIMUM TABLE NAME LENGTH', 63, NULL); INSERTINTO sql_sizing VALUES (106, 'MAXIMUM TABLES IN SELECT', 0, NULL); INSERTINTO sql_sizing VALUES (107, 'MAXIMUM USER NAME LENGTH', 63, NULL); INSERTINTO sql_sizing VALUES (25000, 'MAXIMUM CURRENT DEFAULT TRANSFORM GROUP LENGTH', NULL, NULL); INSERTINTO sql_sizing VALUES (25001, 'MAXIMUM CURRENT TRANSFORM GROUP LENGTH', NULL, NULL); INSERTINTO sql_sizing VALUES (25002, 'MAXIMUM CURRENT PATH LENGTH', 0, NULL); INSERTINTO sql_sizing VALUES (25003, 'MAXIMUM CURRENT ROLE LENGTH', NULL, NULL); INSERTINTO sql_sizing VALUES (25004, 'MAXIMUM SESSION USER LENGTH', 63, NULL); INSERTINTO sql_sizing VALUES (25005, 'MAXIMUM SYSTEM USER LENGTH', 63, NULL);
UPDATE sql_sizing SET supported_value = (SELECT typlen-1FROM pg_catalog.pg_type WHERE typname = 'name'),
comments = 'Might be less, depending on character set.' WHERE supported_value = 63;
GRANTSELECTON sql_sizing TO PUBLIC;
/* *6.62 *TABLE_CONSTRAINTSview
*/
CREATE VIEW table_constraints AS SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(nc.nspname AS sql_identifier) AS constraint_schema,
CAST(c.conname AS sql_identifier) AS constraint_name,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nr.nspname AS sql_identifier) AS table_schema,
CAST(r.relname AS sql_identifier) AS table_name,
CAST( CASE c.contype WHEN'c'THEN'CHECK' WHEN'n'THEN'CHECK' WHEN'f'THEN'FOREIGN KEY' WHEN'p'THEN'PRIMARY KEY' WHEN'u'THEN'UNIQUE' END AS character_data) AS constraint_type,
CAST(CASEWHEN c.condeferrable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_deferrable,
CAST(CASEWHEN c.condeferred THEN'YES'ELSE'NO' END AS yes_or_no) AS initially_deferred,
CAST(CASEWHEN c.conenforced THEN'YES'ELSE'NO' END AS yes_or_no) AS enforced,
CAST(CASEWHEN c.contype = 'u' THENCASEWHEN (SELECTNOT indnullsnotdistinct FROM pg_index WHERE indexrelid = conindid) THEN'YES'ELSE'NO' END
END AS yes_or_no) AS nulls_distinct
FROM pg_namespace nc,
pg_namespace nr,
pg_constraint c,
pg_class r
WHERE nc.oid = c.connamespace AND nr.oid = r.relnamespace AND c.conrelid = r.oid AND c.contype NOTIN ('t', 'x') -- ignore nonstandard constraints AND r.relkind IN ('r', 'p') AND (NOT 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') OR has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') );
GRANTSELECTON table_constraints TO PUBLIC;
/* *6.63 *TABLE_METHOD_PRIVILEGESview
*/
-- feature not supported
/* *6.64 *TABLE_PRIVILEGESview
*/
CREATE VIEW table_privileges AS SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(c.prtype AS character_data) AS privilege_type,
CAST( CASEWHEN -- object owner always has grant options
pg_has_role(grantee.oid, c.relowner, 'USAGE') OR c.grantable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable,
CAST(CASEWHEN c.prtype = 'SELECT'THEN'YES'ELSE'NO' END AS yes_or_no) AS with_hierarchy
FROM ( SELECT oid, relname, relnamespace, relkind, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class
) AS c (oid, relname, relnamespace, relkind, relowner, grantor, grantee, prtype, grantable),
pg_namespace nc,
pg_authid u_grantor,
( SELECT oid, rolname FROM pg_authid UNIONALL SELECT0::oid, 'PUBLIC'
) AS grantee (oid, rolname)
WHERE c.relnamespace = nc.oid AND c.relkind IN ('r', 'v', 'f', 'p') AND c.grantee = grantee.oid 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 grantee.rolname = 'PUBLIC');
GRANTSELECTON table_privileges TO PUBLIC;
/* *6.45 *ROLE_TABLE_GRANTSview
*/
CREATE VIEW role_table_grants AS SELECT grantor,
grantee,
table_catalog,
table_schema,
table_name,
privilege_type,
is_grantable,
with_hierarchy FROM table_privileges WHERE grantor IN (SELECT role_name FROM enabled_roles) OR grantee IN (SELECT role_name FROM enabled_roles);
GRANTSELECTON role_table_grants TO PUBLIC;
/* *6.65 *TABLESview
*/
CREATE VIEW tables AS SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST( CASEWHEN nc.oid = 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' ELSEnull END AS character_data) AS table_type,
CAST(nullAS sql_identifier) AS self_referencing_column_name,
CAST(nullAS character_data) AS reference_generation,
CAST(CASEWHEN t.typname ISNOTNULLTHEN current_database() ELSEnull END AS sql_identifier) AS user_defined_type_catalog,
CAST(nt.nspname AS sql_identifier) AS user_defined_type_schema,
CAST(t.typname AS sql_identifier) AS user_defined_type_name,
CAST(CASEWHEN c.relkind IN ('r', 'p') OR
(c.relkind IN ('v', 'f') AND -- 1 << CMD_INSERT
pg_relation_is_updatable(c.oid, false) & 8 = 8) THEN'YES'ELSE'NO' END AS yes_or_no) AS is_insertable_into,
CAST(CASEWHEN t.typname ISNOTNULLTHEN'YES'ELSE'NO' END AS yes_or_no) AS is_typed,
CAST(nullAS character_data) AS commit_action
FROM pg_namespace nc JOIN pg_class c ON (nc.oid = c.relnamespace) LEFTJOIN (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 (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') );
GRANTSELECTON tables TO PUBLIC;
/* *6.66 *TRANSFORMSview
*/
CREATE VIEW transforms AS SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(nt.nspname AS sql_identifier) AS udt_schema,
CAST(t.typname AS sql_identifier) AS udt_name,
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
CAST(l.lanname AS sql_identifier) AS group_name,
CAST('FROM SQL'AS character_data) AS transform_type FROM pg_type t JOIN pg_transform x ON t.oid = x.trftype JOIN pg_language l ON x.trflang = l.oid JOIN pg_proc p ON x.trffromsql = p.oid JOIN pg_namespace nt ON t.typnamespace = nt.oid JOIN pg_namespace np ON p.pronamespace = np.oid
UNION
SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(nt.nspname AS sql_identifier) AS udt_schema,
CAST(t.typname AS sql_identifier) AS udt_name,
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
CAST(l.lanname AS sql_identifier) AS group_name,
CAST('TO SQL'AS character_data) AS transform_type FROM pg_type t JOIN pg_transform x ON t.oid = x.trftype JOIN pg_language l ON x.trflang = l.oid JOIN pg_proc p ON x.trftosql = p.oid JOIN pg_namespace nt ON t.typnamespace = nt.oid JOIN pg_namespace np ON p.pronamespace = np.oid
ORDERBY udt_catalog, udt_schema, udt_name, group_name, transform_type -- some sensible grouping for interactive use
;
/* *6.67 *TRANSLATIONSview
*/
-- feature not supported
/* *6.68 *TRIGGERED_UPDATE_COLUMNSview
*/
CREATE VIEW triggered_update_columns AS SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
CAST(n.nspname AS sql_identifier) AS trigger_schema,
CAST(t.tgname AS sql_identifier) AS trigger_name,
CAST(current_database() AS sql_identifier) AS event_object_catalog,
CAST(n.nspname AS sql_identifier) AS event_object_schema,
CAST(c.relname AS sql_identifier) AS event_object_table,
CAST(a.attname AS sql_identifier) AS event_object_column
FROM pg_namespace n, pg_class c, pg_trigger t,
(SELECT tgoid, (ta0.tgat).x AS tgattnum, (ta0.tgat).n AS tgattpos FROM (SELECT oid AS tgoid, information_schema._pg_expandarray(tgattr) AS tgat FROM pg_trigger) AS ta0) AS ta,
pg_attribute a
WHERE n.oid = c.relnamespace AND c.oid = t.tgrelid AND t.oid = ta.tgoid AND (a.attrelid, a.attnum) = (t.tgrelid, ta.tgattnum) ANDNOT t.tgisinternal AND (NOT 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') );
GRANTSELECTON triggered_update_columns TO PUBLIC;
/* *6.69 *TRIGGER_COLUMN_USAGEview
*/
-- not tracked by PostgreSQL
/* *6.70 *TRIGGER_PERIOD_USAGEview
*/
-- feature not supported
/* *6.71 *TRIGGER_ROUTINE_USAGEview
*/
-- not tracked by PostgreSQL
/* *6.72 *TRIGGER_SEQUENCE_USAGEview
*/
-- not tracked by PostgreSQL
/* *6.73 *TRIGGER_TABLE_USAGEview
*/
-- not tracked by PostgreSQL
/* *6.74 *TRIGGERSview
*/
CREATE VIEW triggers AS SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
CAST(n.nspname AS sql_identifier) AS trigger_schema,
CAST(t.tgname AS sql_identifier) AS trigger_name,
CAST(em.text AS character_data) AS event_manipulation,
CAST(current_database() AS sql_identifier) AS event_object_catalog,
CAST(n.nspname AS sql_identifier) AS event_object_schema,
CAST(c.relname AS sql_identifier) AS event_object_table,
CAST( -- To determine action order, partition by schema, table, -- event_manipulation (INSERT/DELETE/UPDATE), ROW/STATEMENT (1), -- BEFORE/AFTER (66), then order by trigger name. It's preferable -- to partition by view output columns, so that query constraints -- can be pushed down below the window function.
rank() OVER (PARTITION BY CAST(n.nspname AS sql_identifier),
CAST(c.relname AS sql_identifier),
em.num,
t.tgtype & 1,
t.tgtype & 66 ORDERBY t.tgname) AS cardinal_number) AS action_order,
CAST( CASEWHEN pg_has_role(c.relowner, 'USAGE') THEN (regexp_match(pg_get_triggerdef(t.oid), E'.{35,} WHEN \\((.+)\\) EXECUTE FUNCTION'))[1] ELSEnull END AS character_data) AS action_condition,
CAST(
substring(pg_get_triggerdef(t.oid) from
position('EXECUTE FUNCTION'in substring(pg_get_triggerdef(t.oid) from48)) + 47) AS character_data) AS action_statement,
CAST( -- hard-wired reference to TRIGGER_TYPE_ROW CASE t.tgtype & 1WHEN1THEN'ROW'ELSE'STATEMENT' END AS character_data) AS action_orientation,
CAST( -- hard-wired refs to TRIGGER_TYPE_BEFORE, TRIGGER_TYPE_INSTEAD CASE t.tgtype & 66WHEN2THEN'BEFORE'WHEN64THEN'INSTEAD OF'ELSE'AFTER' END AS character_data) AS action_timing,
CAST(tgoldtable AS sql_identifier) AS action_reference_old_table,
CAST(tgnewtable AS sql_identifier) AS action_reference_new_table,
CAST(nullAS sql_identifier) AS action_reference_old_row,
CAST(nullAS sql_identifier) AS action_reference_new_row,
CAST(nullAS time_stamp) AS created
FROM pg_namespace n, pg_class c, pg_trigger t, -- hard-wired refs to TRIGGER_TYPE_INSERT, TRIGGER_TYPE_DELETE, -- TRIGGER_TYPE_UPDATE; we intentionally omit TRIGGER_TYPE_TRUNCATE
(VALUES (4, 'INSERT'),
(8, 'DELETE'),
(16, 'UPDATE')) AS em (num, text)
WHERE n.oid = c.relnamespace AND c.oid = t.tgrelid AND t.tgtype & em.num <> 0 ANDNOT t.tgisinternal AND (NOT 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') OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') );
GRANTSELECTON triggers TO PUBLIC;
/* *6.75 *UDT_PRIVILEGESview
*/
CREATE VIEW udt_privileges AS SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(n.nspname AS sql_identifier) AS udt_schema,
CAST(t.typname AS sql_identifier) AS udt_name,
CAST('TYPE USAGE'AS character_data) AS privilege_type, -- sic
CAST( CASEWHEN -- object owner always has grant options
pg_has_role(grantee.oid, t.typowner, 'USAGE') OR t.grantable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable
FROM ( SELECT oid, typname, typnamespace, typtype, typowner, (aclexplode(coalesce(typacl, acldefault('T', typowner)))).* FROM pg_type
) AS t (oid, typname, typnamespace, typtype, typowner, grantor, grantee, prtype, grantable),
pg_namespace n,
pg_authid u_grantor,
( SELECT oid, rolname FROM pg_authid UNIONALL SELECT0::oid, 'PUBLIC'
) AS grantee (oid, rolname)
WHERE t.typnamespace = n.oid AND t.typtype = 'c' AND t.grantee = grantee.oid 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 grantee.rolname = 'PUBLIC');
GRANTSELECTON udt_privileges TO PUBLIC;
/* *6.48 *ROLE_UDT_GRANTSview
*/
CREATE VIEW role_udt_grants AS SELECT grantor,
grantee,
udt_catalog,
udt_schema,
udt_name,
privilege_type,
is_grantable FROM udt_privileges WHERE grantor IN (SELECT role_name FROM enabled_roles) OR grantee IN (SELECT role_name FROM enabled_roles);
GRANTSELECTON role_udt_grants TO PUBLIC;
/* *6.76 *USAGE_PRIVILEGESview
*/
CREATE VIEW usage_privileges AS
/* collations */ -- Collations have no real privileges, so we represent all collations with implicit usage privilege here. SELECT CAST(u.rolname AS sql_identifier) AS grantor,
CAST('PUBLIC'AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS object_catalog,
CAST(n.nspname AS sql_identifier) AS object_schema,
CAST(c.collname AS sql_identifier) AS object_name,
CAST('COLLATION'AS character_data) AS object_type,
CAST('USAGE'AS character_data) AS privilege_type,
CAST('NO'AS yes_or_no) AS is_grantable
FROM pg_authid u,
pg_namespace n,
pg_collation c
WHERE u.oid = c.collowner AND c.collnamespace = n.oid AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()))
UNIONALL
/* domains */ SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS object_catalog,
CAST(n.nspname AS sql_identifier) AS object_schema,
CAST(t.typname AS sql_identifier) AS object_name,
CAST('DOMAIN'AS character_data) AS object_type,
CAST('USAGE'AS character_data) AS privilege_type,
CAST( CASEWHEN -- object owner always has grant options
pg_has_role(grantee.oid, t.typowner, 'USAGE') OR t.grantable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable
FROM ( SELECT oid, typname, typnamespace, typtype, typowner, (aclexplode(coalesce(typacl, acldefault('T', typowner)))).* FROM pg_type
) AS t (oid, typname, typnamespace, typtype, typowner, grantor, grantee, prtype, grantable),
pg_namespace n,
pg_authid u_grantor,
( SELECT oid, rolname FROM pg_authid UNIONALL SELECT0::oid, 'PUBLIC'
) AS grantee (oid, rolname)
WHERE t.typnamespace = n.oid AND t.typtype = 'd' AND t.grantee = grantee.oid 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 grantee.rolname = 'PUBLIC')
UNIONALL
/* foreign-data wrappers */ SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS object_catalog,
CAST(''AS sql_identifier) AS object_schema,
CAST(fdw.fdwname AS sql_identifier) AS object_name,
CAST('FOREIGN DATA WRAPPER'AS character_data) AS object_type,
CAST('USAGE'AS character_data) AS privilege_type,
CAST( CASEWHEN -- object owner always has grant options
pg_has_role(grantee.oid, fdw.fdwowner, 'USAGE') OR fdw.grantable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable
FROM ( SELECT fdwname, fdwowner, (aclexplode(coalesce(fdwacl, acldefault('F', fdwowner)))).* FROM pg_foreign_data_wrapper
) AS fdw (fdwname, fdwowner, grantor, grantee, prtype, grantable),
pg_authid u_grantor,
( SELECT oid, rolname FROM pg_authid UNIONALL SELECT0::oid, 'PUBLIC'
) AS grantee (oid, rolname)
WHERE u_grantor.oid = fdw.grantor 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 grantee.rolname = 'PUBLIC')
UNIONALL
/* foreign servers */ SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS object_catalog,
CAST(''AS sql_identifier) AS object_schema,
CAST(srv.srvname AS sql_identifier) AS object_name,
CAST('FOREIGN SERVER'AS character_data) AS object_type,
CAST('USAGE'AS character_data) AS privilege_type,
CAST( CASEWHEN -- object owner always has grant options
pg_has_role(grantee.oid, srv.srvowner, 'USAGE') OR srv.grantable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable
FROM ( SELECT srvname, srvowner, (aclexplode(coalesce(srvacl, acldefault('S', srvowner)))).* FROM pg_foreign_server
) AS srv (srvname, srvowner, grantor, grantee, prtype, grantable),
pg_authid u_grantor,
( SELECT oid, rolname FROM pg_authid UNIONALL SELECT0::oid, 'PUBLIC'
) AS grantee (oid, rolname)
WHERE u_grantor.oid = srv.grantor 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 grantee.rolname = 'PUBLIC')
UNIONALL
/* sequences */ SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
CAST(grantee.rolname AS sql_identifier) AS grantee,
CAST(current_database() AS sql_identifier) AS object_catalog,
CAST(n.nspname AS sql_identifier) AS object_schema,
CAST(c.relname AS sql_identifier) AS object_name,
CAST('SEQUENCE'AS character_data) AS object_type,
CAST('USAGE'AS character_data) AS privilege_type,
CAST( CASEWHEN -- object owner always has grant options
pg_has_role(grantee.oid, c.relowner, 'USAGE') OR c.grantable THEN'YES'ELSE'NO' END AS yes_or_no) AS is_grantable
FROM ( SELECT oid, relname, relnamespace, relkind, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class
) AS c (oid, relname, relnamespace, relkind, relowner, grantor, grantee, prtype, grantable),
pg_namespace n,
pg_authid u_grantor,
( SELECT oid, rolname FROM pg_authid UNIONALL SELECT0::oid, 'PUBLIC'
) AS grantee (oid, rolname)
WHERE c.relnamespace = n.oid AND c.relkind = 'S' AND c.grantee = grantee.oid 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 grantee.rolname = 'PUBLIC');
GRANTSELECTON usage_privileges TO PUBLIC;
/* *6.47 *ROLE_USAGE_GRANTSview
*/
CREATE VIEW role_usage_grants AS SELECT grantor,
grantee,
object_catalog,
object_schema,
object_name,
object_type,
privilege_type,
is_grantable FROM usage_privileges WHERE grantor IN (SELECT role_name FROM enabled_roles) OR grantee IN (SELECT role_name FROM enabled_roles);
GRANTSELECTON role_usage_grants TO PUBLIC;
/* *6.77 *USER_DEFINED_TYPESview
*/
CREATE VIEW user_defined_types AS SELECT CAST(current_database() AS sql_identifier) AS user_defined_type_catalog,
CAST(n.nspname AS sql_identifier) AS user_defined_type_schema,
CAST(c.relname AS sql_identifier) AS user_defined_type_name,
CAST('STRUCTURED'AS character_data) AS user_defined_type_category,
CAST('YES'AS yes_or_no) AS is_instantiable,
CAST(nullAS yes_or_no) AS is_final,
CAST(nullAS character_data) AS ordering_form,
CAST(nullAS character_data) AS ordering_category,
CAST(nullAS sql_identifier) AS ordering_routine_catalog,
CAST(nullAS sql_identifier) AS ordering_routine_schema,
CAST(nullAS sql_identifier) AS ordering_routine_name,
CAST(nullAS character_data) AS reference_type,
CAST(nullAS character_data) AS data_type,
CAST(nullAS cardinal_number) AS character_maximum_length,
CAST(nullAS cardinal_number) AS character_octet_length,
CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(nullAS sql_identifier) AS character_set_name,
CAST(nullAS sql_identifier) AS collation_catalog,
CAST(nullAS sql_identifier) AS collation_schema,
CAST(nullAS sql_identifier) AS collation_name,
CAST(nullAS cardinal_number) AS numeric_precision,
CAST(nullAS cardinal_number) AS numeric_precision_radix,
CAST(nullAS cardinal_number) AS numeric_scale,
CAST(nullAS cardinal_number) AS datetime_precision,
CAST(nullAS character_data) AS interval_type,
CAST(nullAS cardinal_number) AS interval_precision,
CAST(nullAS sql_identifier) AS source_dtd_identifier,
CAST(nullAS sql_identifier) AS ref_dtd_identifier
FROM pg_namespace n, pg_class c, pg_type t
WHERE n.oid = c.relnamespace AND t.typrelid = c.oid AND c.relkind = 'c' AND (pg_has_role(t.typowner, 'USAGE') OR has_type_privilege(t.oid, 'USAGE'));
GRANTSELECTON user_defined_types TO PUBLIC;
/* *6.78 *VIEW_COLUMN_USAGE
*/
CREATE VIEW view_column_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS view_catalog,
CAST(nv.nspname AS sql_identifier) AS view_schema,
CAST(v.relname AS sql_identifier) AS view_name,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nt.nspname AS sql_identifier) AS table_schema,
CAST(t.relname AS sql_identifier) AS table_name,
CAST(a.attname AS sql_identifier) AS column_name
FROM pg_namespace nv, pg_class v, pg_depend dv,
pg_depend dt, pg_class t, pg_namespace nt,
pg_attribute a
WHERE nv.oid = v.relnamespace AND v.relkind = 'v' AND v.oid = dv.refobjid AND dv.refclassid = 'pg_catalog.pg_class'::regclass AND dv.classid = 'pg_catalog.pg_rewrite'::regclass AND dv.deptype = 'i' AND dv.objid = dt.objid AND dv.refobjid <> dt.refobjid AND dt.classid = 'pg_catalog.pg_rewrite'::regclass AND dt.refclassid = 'pg_catalog.pg_class'::regclass AND dt.refobjid = t.oid AND t.relnamespace = nt.oid 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');
GRANTSELECTON view_column_usage TO PUBLIC;
/* *6.79 *VIEW_PERIOD_USAGE
*/
-- feature not supported
/* *6.80 *VIEW_ROUTINE_USAGE
*/
CREATE VIEW view_routine_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nv.nspname AS sql_identifier) AS table_schema,
CAST(v.relname AS sql_identifier) AS table_name,
CAST(current_database() AS sql_identifier) AS specific_catalog,
CAST(np.nspname AS sql_identifier) AS specific_schema,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name
WHERE nv.oid = v.relnamespace AND v.relkind = 'v' AND v.oid = dv.refobjid AND dv.refclassid = 'pg_catalog.pg_class'::regclass AND dv.classid = 'pg_catalog.pg_rewrite'::regclass AND dv.deptype = 'i' AND dv.objid = dp.objid AND dp.classid = 'pg_catalog.pg_rewrite'::regclass 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');
GRANTSELECTON view_routine_usage TO PUBLIC;
/* *6.81 *VIEW_TABLE_USAGE
*/
CREATE VIEW view_table_usage AS SELECTDISTINCT
CAST(current_database() AS sql_identifier) AS view_catalog,
CAST(nv.nspname AS sql_identifier) AS view_schema,
CAST(v.relname AS sql_identifier) AS view_name,
CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nt.nspname AS sql_identifier) AS table_schema,
CAST(t.relname AS sql_identifier) AS table_name
FROM pg_namespace nv, pg_class v, pg_depend dv,
pg_depend dt, pg_class t, pg_namespace nt
WHERE nv.oid = v.relnamespace AND v.relkind = 'v' AND v.oid = dv.refobjid AND dv.refclassid = 'pg_catalog.pg_class'::regclass AND dv.classid = 'pg_catalog.pg_rewrite'::regclass AND dv.deptype = 'i' AND dv.objid = dt.objid AND dv.refobjid <> dt.refobjid AND dt.classid = 'pg_catalog.pg_rewrite'::regclass AND dt.refclassid = 'pg_catalog.pg_class'::regclass 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');
GRANTSELECTON view_table_usage TO PUBLIC;
/* *6.82 *VIEWSview
*/
CREATE VIEW views AS SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(nc.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST( CASEWHEN pg_has_role(c.relowner, 'USAGE') THEN pg_get_viewdef(c.oid) ELSEnull END AS character_data) AS view_definition,
CAST( CASEWHEN'check_option=cascaded' = ANY (c.reloptions) THEN'CASCADED' WHEN'check_option=local' = ANY (c.reloptions) THEN'LOCAL' ELSE'NONE' END AS character_data) AS check_option,
CAST( -- (1 << CMD_UPDATE) + (1 << CMD_DELETE) CASEWHEN 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 CASEWHEN pg_relation_is_updatable(c.oid, false) & 8 = 8 THEN'YES'ELSE'NO' END AS yes_or_no) AS is_insertable_into,
CAST( -- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_UPDATE CASEWHENEXISTS (SELECT1FROM pg_trigger WHERE tgrelid = c.oid AND tgtype & 81 = 81) THEN'YES'ELSE'NO' END AS yes_or_no) AS is_trigger_updatable,
CAST( -- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_DELETE CASEWHENEXISTS (SELECT1FROM pg_trigger WHERE tgrelid = c.oid AND tgtype & 73 = 73) THEN'YES'ELSE'NO' END AS yes_or_no) AS is_trigger_deletable,
CAST( -- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_INSERT CASEWHENEXISTS (SELECT1FROM pg_trigger WHERE tgrelid = c.oid AND tgtype & 69 = 69) THEN'YES'ELSE'NO' END AS yes_or_no) AS is_trigger_insertable_into
FROM pg_namespace nc, pg_class c
WHERE c.relnamespace = nc.oid AND c.relkind = 'v' AND (NOT 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') );
GRANTSELECTON views TO PUBLIC;
-- The following views have dependencies that force them to appear out of order.
/* *6.26 *DATA_TYPE_PRIVILEGESview
*/
CREATE VIEW data_type_privileges AS SELECT CAST(current_database() AS sql_identifier) AS object_catalog,
CAST(x.objschema AS sql_identifier) AS object_schema,
CAST(x.objname AS sql_identifier) AS object_name,
CAST(x.objtype AS character_data) AS object_type,
CAST(x.objdtdid AS sql_identifier) AS dtd_identifier
FROM
( SELECT udt_schema, udt_name, 'USER-DEFINED TYPE'::text, dtd_identifier FROM attributes UNIONALL SELECT table_schema, table_name, 'TABLE'::text, dtd_identifier FROM columns UNIONALL SELECT domain_schema, domain_name, 'DOMAIN'::text, dtd_identifier FROM domains UNIONALL SELECT specific_schema, specific_name, 'ROUTINE'::text, dtd_identifier FROM parameters UNIONALL SELECT specific_schema, specific_name, 'ROUTINE'::text, dtd_identifier FROM routines
) AS x (objschema, objname, objtype, objdtdid);
GRANTSELECTON data_type_privileges TO PUBLIC;
/* *6.31 *ELEMENT_TYPESview
*/
CREATE VIEW element_types AS SELECT CAST(current_database() AS sql_identifier) AS object_catalog,
CAST(n.nspname AS sql_identifier) AS object_schema,
CAST(x.objname AS sql_identifier) AS object_name,
CAST(x.objtype AS character_data) AS object_type,
CAST(x.objdtdid AS sql_identifier) AS collection_type_identifier,
CAST( CASEWHEN nbt.nspname = 'pg_catalog'THEN format_type(bt.oid, null) ELSE'USER-DEFINED' END AS character_data) AS data_type,
CAST(nullAS cardinal_number) AS character_maximum_length,
CAST(nullAS cardinal_number) AS character_octet_length,
CAST(nullAS sql_identifier) AS character_set_catalog,
CAST(nullAS sql_identifier) AS character_set_schema,
CAST(nullAS sql_identifier) AS character_set_name,
CAST(CASEWHEN nco.nspname ISNOTNULLTHEN current_database() END AS sql_identifier) AS collation_catalog,
CAST(nco.nspname AS sql_identifier) AS collation_schema,
CAST(co.collname AS sql_identifier) AS collation_name,
CAST(nullAS cardinal_number) AS numeric_precision,
CAST(nullAS cardinal_number) AS numeric_precision_radix,
CAST(nullAS cardinal_number) AS numeric_scale,
CAST(nullAS cardinal_number) AS datetime_precision,
CAST(nullAS character_data) AS interval_type,
CAST(nullAS cardinal_number) AS interval_precision,
CAST(current_database() AS sql_identifier) AS udt_catalog,
CAST(nbt.nspname AS sql_identifier) AS udt_schema,
CAST(bt.typname AS sql_identifier) AS udt_name,
CAST(nullAS sql_identifier) AS scope_catalog,
CAST(nullAS sql_identifier) AS scope_schema,
CAST(nullAS sql_identifier) AS scope_name,
CAST(nullAS cardinal_number) AS maximum_cardinality,
CAST('a' || CAST(x.objdtdid AS text) AS sql_identifier) AS dtd_identifier
FROM pg_namespace n, pg_type at, pg_namespace nbt, pg_type bt,
( /* columns, attributes */ SELECT c.relnamespace, CAST(c.relname AS sql_identifier), CASEWHEN c.relkind = 'c'THEN'USER-DEFINED TYPE'::text ELSE'TABLE'::text END,
a.attnum, a.atttypid, a.attcollation FROM pg_class c, pg_attribute a WHERE c.oid = a.attrelid AND c.relkind IN ('r', 'v', 'f', 'c', 'p') AND attnum > 0ANDNOT attisdropped
UNIONALL
/* domains */ SELECT t.typnamespace, CAST(t.typname AS sql_identifier), 'DOMAIN'::text, 1, t.typbasetype, t.typcollation FROM pg_type t WHERE t.typtype = 'd'
UNIONALL
/* parameters */ SELECT pronamespace,
CAST(nameconcatoid(proname, oid) 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 FROM pg_proc p) AS ss
UNIONALL
/* result types */ SELECT p.pronamespace,
CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier), 'ROUTINE'::text, 0, p.prorettype, 0 FROM pg_proc p
) AS x (objschema, objname, objtype, objdtdid, objtypeid, objcollation) LEFTJOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid)) ON x.objcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
WHERE n.oid = x.objschema AND at.oid = x.objtypeid AND (at.typelem <> 0AND at.typlen = -1) AND at.typelem = bt.oid AND nbt.oid = bt.typnamespace
AND (n.nspname, x.objname, x.objtype, CAST(x.objdtdid AS sql_identifier)) IN
( SELECT object_schema, object_name, object_type, dtd_identifier FROM data_type_privileges );
GRANTSELECTON element_types TO PUBLIC;
-- SQL/MED views; these use section numbers from part 9 of the standard.
/* Base view for foreign table columns */ CREATE VIEW _pg_foreign_table_columns AS SELECT n.nspname,
c.relname,
a.attname,
a.attfdwoptions FROM pg_foreign_table t, pg_authid u, pg_namespace n, pg_class c,
pg_attribute a WHERE u.oid = c.relowner AND (pg_has_role(c.relowner, 'USAGE') OR has_column_privilege(c.oid, a.attnum, 'SELECT, INSERT, UPDATE, REFERENCES')) AND n.oid = c.relnamespace AND c.oid = t.ftrelid AND c.relkind = 'f' AND a.attrelid = c.oid AND a.attnum > 0;
/* *24.3 *COLUMN_OPTIONSview
*/ CREATE VIEW column_options AS SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
CAST(c.nspname AS sql_identifier) AS table_schema,
CAST(c.relname AS sql_identifier) AS table_name,
CAST(c.attname AS sql_identifier) AS column_name,
CAST((pg_options_to_table(c.attfdwoptions)).option_name AS sql_identifier) AS option_name,
CAST((pg_options_to_table(c.attfdwoptions)).option_value AS character_data) AS option_value FROM _pg_foreign_table_columns c;
GRANTSELECTON column_options TO PUBLIC;
/* Base view for foreign-data wrappers */ CREATE VIEW _pg_foreign_data_wrappers AS SELECT w.oid,
w.fdwowner,
w.fdwoptions,
CAST(current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
CAST(fdwname AS sql_identifier) AS foreign_data_wrapper_name,
CAST(u.rolname AS sql_identifier) AS authorization_identifier,
CAST('c'AS character_data) AS foreign_data_wrapper_language FROM pg_foreign_data_wrapper w, pg_authid u WHERE u.oid = w.fdwowner AND (pg_has_role(fdwowner, 'USAGE') OR has_foreign_data_wrapper_privilege(w.oid, 'USAGE'));
/* *24.5 *FOREIGN_DATA_WRAPPER_OPTIONSview
*/ CREATE VIEW foreign_data_wrapper_options AS SELECT foreign_data_wrapper_catalog,
foreign_data_wrapper_name,
CAST((pg_options_to_table(w.fdwoptions)).option_name AS sql_identifier) AS option_name,
CAST((pg_options_to_table(w.fdwoptions)).option_value AS character_data) AS option_value FROM _pg_foreign_data_wrappers w;
GRANTSELECTON foreign_data_wrapper_options TO PUBLIC;
/* *24.6 *FOREIGN_DATA_WRAPPERSview
*/ CREATE VIEW foreign_data_wrappers AS SELECT foreign_data_wrapper_catalog,
foreign_data_wrapper_name,
authorization_identifier,
CAST(NULLAS character_data) AS library_name,
foreign_data_wrapper_language FROM _pg_foreign_data_wrappers w;
GRANTSELECTON foreign_data_wrappers TO PUBLIC;
/* Base view for foreign servers */ CREATE VIEW _pg_foreign_servers AS SELECT s.oid,
s.srvoptions,
CAST(current_database() AS sql_identifier) AS foreign_server_catalog,
CAST(srvname AS sql_identifier) AS foreign_server_name,
CAST(current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
CAST(w.fdwname AS sql_identifier) AS foreign_data_wrapper_name,
CAST(srvtype AS character_data) AS foreign_server_type,
CAST(srvversion AS character_data) AS foreign_server_version,
CAST(u.rolname AS sql_identifier) AS authorization_identifier FROM pg_foreign_server s, pg_foreign_data_wrapper w, pg_authid u WHERE w.oid = s.srvfdw AND u.oid = s.srvowner AND (pg_has_role(s.srvowner, 'USAGE') OR has_server_privilege(s.oid, 'USAGE'));
/* *24.7 *FOREIGN_SERVER_OPTIONSview
*/ CREATE VIEW foreign_server_options AS SELECT foreign_server_catalog,
foreign_server_name,
CAST((pg_options_to_table(s.srvoptions)).option_name AS sql_identifier) AS option_name,
CAST((pg_options_to_table(s.srvoptions)).option_value AS character_data) AS option_value FROM _pg_foreign_servers s;
GRANTSELECTONTABLE foreign_server_options TO PUBLIC;
/* *24.8 *FOREIGN_SERVERSview
*/ CREATE VIEW foreign_servers AS SELECT foreign_server_catalog,
foreign_server_name,
foreign_data_wrapper_catalog,
foreign_data_wrapper_name,
foreign_server_type,
foreign_server_version,
authorization_identifier FROM _pg_foreign_servers;
GRANTSELECTON foreign_servers TO PUBLIC;
/* Base view for foreign tables */ CREATE VIEW _pg_foreign_tables AS SELECT
CAST(current_database() AS sql_identifier) AS foreign_table_catalog,
CAST(n.nspname AS sql_identifier) AS foreign_table_schema,
CAST(c.relname AS sql_identifier) AS foreign_table_name,
t.ftoptions AS ftoptions,
CAST(current_database() AS sql_identifier) AS foreign_server_catalog,
CAST(srvname AS sql_identifier) AS foreign_server_name,
CAST(u.rolname AS sql_identifier) AS authorization_identifier FROM pg_foreign_table t, pg_foreign_server s, pg_foreign_data_wrapper w,
pg_authid u, pg_namespace n, pg_class c WHERE w.oid = s.srvfdw AND u.oid = c.relowner 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')) AND n.oid = c.relnamespace AND c.oid = t.ftrelid AND c.relkind = 'f' AND s.oid = t.ftserver;
/* *24.9 *FOREIGN_TABLE_OPTIONSview
*/ CREATE VIEW foreign_table_options AS SELECT foreign_table_catalog,
foreign_table_schema,
foreign_table_name,
CAST((pg_options_to_table(t.ftoptions)).option_name AS sql_identifier) AS option_name,
CAST((pg_options_to_table(t.ftoptions)).option_value AS character_data) AS option_value FROM _pg_foreign_tables t;
GRANTSELECTONTABLE foreign_table_options TO PUBLIC;
/* *24.10 *FOREIGN_TABLESview
*/ CREATE VIEW foreign_tables AS SELECT foreign_table_catalog,
foreign_table_schema,
foreign_table_name,
foreign_server_catalog,
foreign_server_name FROM _pg_foreign_tables;
GRANTSELECTON foreign_tables TO PUBLIC;
/* Base view for user mappings */ CREATE VIEW _pg_user_mappings AS SELECT um.oid,
um.umoptions,
um.umuser,
CAST(COALESCE(u.rolname,'PUBLIC') AS sql_identifier ) AS authorization_identifier,
s.foreign_server_catalog,
s.foreign_server_name,
s.authorization_identifier AS srvowner FROM pg_user_mapping um LEFTJOIN pg_authid u ON (u.oid = um.umuser),
_pg_foreign_servers s WHERE s.oid = um.umserver;
/* *24.13 *USER_MAPPING_OPTIONSview
*/ CREATE VIEW user_mapping_options AS SELECT authorization_identifier,
foreign_server_catalog,
foreign_server_name,
CAST(opts.option_name AS sql_identifier) AS option_name,
CAST(CASEWHEN (umuser <> 0AND authorization_identifier = current_user) OR (umuser = 0AND pg_has_role(srvowner, 'USAGE')) OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user) THEN opts.option_value ELSENULL END AS character_data) AS option_value FROM _pg_user_mappings um,
pg_options_to_table(um.umoptions) opts;
GRANTSELECTON user_mapping_options TO PUBLIC;
/* *24.14 *USER_MAPPINGSview
*/ CREATE VIEW user_mappings AS SELECT authorization_identifier,
foreign_server_catalog,
foreign_server_name FROM _pg_user_mappings;
GRANTSELECTON user_mappings TO PUBLIC;
Messung V0.5 in Prozent
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.98Bemerkung:
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.