diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/information_schema.sql | 173 |
1 files changed, 155 insertions, 18 deletions
diff --git a/src/backend/catalog/information_schema.sql b/src/backend/catalog/information_schema.sql index f228e96e6b2..31f91aa3667 100644 --- a/src/backend/catalog/information_schema.sql +++ b/src/backend/catalog/information_schema.sql @@ -2,9 +2,18 @@ * SQL Information Schema * as defined in ISO 9075-2:1999 chapter 20 * - * Copyright 2002, PostgreSQL Global Development Group + * Copyright 2003, PostgreSQL Global Development Group * - * $Id: information_schema.sql,v 1.9 2003/06/17 18:00:48 petere Exp $ + * $Id: information_schema.sql,v 1.10 2003/06/28 20:50:08 petere Exp $ + */ + +/* + * Note: Generally, the definitions in this file should be ordered + * according to the clause numbers in the SQL standard, which is also the + * alphabetical order. In some cases it is convenient or necessary to + * define one information schema view by using another one; in that case, + * put the referencing view at the very end and leave a note where it + * should have been put. */ @@ -18,7 +27,7 @@ GRANT USAGE ON SCHEMA information_schema TO PUBLIC; SET search_path TO information_schema, public; --- Note: 20.3 follows later. Some genius screwed up the order in the standard. +-- 20.3 INFORMATION_SCHEMA_CATALOG_NAME view appears later. /* @@ -211,12 +220,12 @@ CREATE VIEW columns AS CAST( CASE WHEN t.typtype = 'd' THEN - CASE WHEN nbt.nspname = 'pg_catalog' - THEN format_type(t.typbasetype, null) + CASE WHEN bt.typelem <> 0 AND bt.typlen = -1 THEN 'ARRAY' + WHEN nbt.nspname = 'pg_catalog' THEN format_type(t.typbasetype, null) ELSE 'USER-DEFINED' END ELSE - CASE WHEN nt.nspname = 'pg_catalog' - THEN format_type(a.atttypid, null) + CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY' + WHEN nt.nspname = 'pg_catalog' THEN format_type(a.atttypid, null) ELSE 'USER-DEFINED' END END AS character_data) @@ -326,7 +335,7 @@ CREATE VIEW columns AS CAST(null AS sql_identifier) AS scope_name, CAST(null AS cardinal_number) AS maximum_cardinality, - CAST(t.oid AS sql_identifier) AS dtd_identifier, + CAST(a.attnum AS sql_identifier) AS dtd_identifier, CAST('NO' AS character_data) AS is_self_referencing FROM (pg_attribute LEFT JOIN pg_attrdef ON attrelid = adrelid AND attnum = adnum) AS a, @@ -442,6 +451,9 @@ CREATE VIEW constraint_table_usage AS GRANT SELECT ON constraint_table_usage TO PUBLIC; +-- 20.21 DATA_TYPE_PRIVILEGES view appears later. + + /* * 20.24 * DOMAIN_CONSTRAINTS view @@ -506,9 +518,9 @@ CREATE VIEW domains AS CAST(t.typname AS sql_identifier) AS domain_name, CAST( - CASE WHEN nbt.nspname = 'pg_catalog' - THEN format_type(t.typbasetype, null) - ELSE 'USER-DEFINED' END + CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY' + WHEN nbt.nspname = 'pg_catalog' THEN format_type(t.typbasetype, null) + ELSE 'USER-DEFINED' END AS character_data) AS data_type, @@ -581,7 +593,7 @@ CREATE VIEW domains AS CAST(null AS sql_identifier) AS scope_name, CAST(null AS cardinal_number) AS maximum_cardinality, - CAST(t.oid AS sql_identifier) AS dtd_identifier + CAST(1 AS sql_identifier) AS dtd_identifier FROM pg_type t, pg_namespace nt, pg_type bt, pg_namespace nbt @@ -594,6 +606,9 @@ CREATE VIEW domains AS GRANT SELECT ON domains TO PUBLIC; +-- 20.27 ELEMENT_TYPES view appears later. + + /* * 20.30 * KEY_COLUMN_USAGE view @@ -649,8 +664,8 @@ CREATE VIEW parameters AS CAST('NO' AS character_data) AS as_locator, CAST(null AS sql_identifier) AS parameter_name, CAST( - CASE WHEN nt.nspname = 'pg_catalog' - THEN format_type(t.oid, null) + CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY' + WHEN nt.nspname = 'pg_catalog' THEN format_type(t.oid, null) ELSE 'USER-DEFINED' END AS character_data) AS data_type, CAST(null AS cardinal_number) AS character_maximum_length, @@ -674,7 +689,7 @@ CREATE VIEW parameters AS CAST(null AS sql_identifier) AS scope_schema, CAST(null AS sql_identifier) AS scope_name, CAST(null AS cardinal_number) AS maximum_cardinality, - CAST(t.oid AS sql_identifier) AS dtd_identifier + CAST(n + 1 AS sql_identifier) AS dtd_identifier FROM pg_namespace n, pg_proc p, pg_type t, pg_namespace nt, pg_user u, (select 0 union select 1 union select 2 union select 3 union select 4 union @@ -802,8 +817,8 @@ CREATE VIEW routines AS CAST(null AS sql_identifier) AS udt_name, CAST( - CASE WHEN nt.nspname = 'pg_catalog' - THEN format_type(t.oid, null) + CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY' + WHEN nt.nspname = 'pg_catalog' THEN format_type(t.oid, null) ELSE 'USER-DEFINED' END AS character_data) AS data_type, CAST(null AS cardinal_number) AS character_maximum_length, @@ -827,7 +842,7 @@ CREATE VIEW routines AS CAST(null AS sql_identifier) AS scope_schema, CAST(null AS sql_identifier) AS scope_name, CAST(null AS cardinal_number) AS maximum_cardinality, - CAST(t.oid AS sql_identifier) AS dtd_identifier, + CAST(0 AS sql_identifier) AS dtd_identifier, CAST(CASE WHEN l.lanname = 'sql' THEN 'SQL' ELSE 'EXTERNAL' END AS character_data) AS routine_body, @@ -1364,3 +1379,125 @@ CREATE VIEW views AS OR has_table_privilege(c.oid, 'TRIGGER') ); GRANT SELECT ON views TO PUBLIC; + + +-- The following views have dependencies that force them to appear out of order. + +/* + * 20.21 + * DATA_TYPE_PRIVILEGES view + */ + +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 table_schema, table_name, 'TABLE'::text, dtd_identifier FROM columns + UNION + SELECT domain_schema, domain_name, 'DOMAIN'::text, dtd_identifier FROM domains + UNION + SELECT specific_schema, specific_name, 'ROUTINE'::text, dtd_identifier FROM parameters + UNION + SELECT specific_schema, specific_name, 'ROUTINE'::text, dtd_identifier FROM routines + ) AS x (objschema, objname, objtype, objdtdid); + +GRANT SELECT ON data_type_privileges TO PUBLIC; + + +/* + * 20.27 + * ELEMENT_TYPES view + */ + +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 array_type_identifier, + CAST( + CASE WHEN nbt.nspname = 'pg_catalog' THEN format_type(bt.oid, null) + ELSE 'USER-DEFINED' END AS character_data) AS data_type, + + CAST(null AS cardinal_number) AS character_maximum_length, + CAST(null AS cardinal_number) AS character_octet_length, + CAST(null AS sql_identifier) AS character_set_catalog, + CAST(null AS sql_identifier) AS character_set_schema, + CAST(null AS sql_identifier) AS character_set_name, + CAST(null AS sql_identifier) AS collation_catalog, + CAST(null AS sql_identifier) AS collation_schema, + CAST(null AS sql_identifier) AS collation_name, + CAST(null AS cardinal_number) AS numeric_precision, + CAST(null AS cardinal_number) AS numeric_precision_radix, + CAST(null AS cardinal_number) AS numeric_scale, + CAST(null AS cardinal_number) AS datetime_precision, + CAST(null AS character_data) AS interval_type, + CAST(null AS character_data) AS interval_precision, + + CAST(null AS character_data) AS domain_default, -- XXX maybe a bug in the standard + + 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(null AS sql_identifier) AS scope_catalog, + CAST(null AS sql_identifier) AS scope_schema, + CAST(null AS sql_identifier) AS scope_name, + + CAST(null AS cardinal_number) AS maximum_cardinality, + CAST('a' || x.objdtdid AS sql_identifier) AS dtd_identifier + + FROM pg_namespace n, pg_type at, pg_namespace nbt, pg_type bt, + ( + /* columns */ + SELECT c.relnamespace, c.relname, 'TABLE'::text, a.attnum, a.atttypid + FROM pg_class c, pg_attribute a + WHERE c.oid = a.attrelid + AND c.relkind IN ('r', 'v') + AND attnum > 0 AND NOT attisdropped + + UNION + + /* domains */ + SELECT t.typnamespace, t.typname, 'DOMAIN'::text, 1, t.typbasetype + FROM pg_type t + WHERE t.typtype = 'd' + + UNION + + /* parameters */ + SELECT p.pronamespace, p.proname, 'ROUTINE'::text, pos.n + 1, p.proargtypes[n] + FROM pg_proc p, + (select 0 union select 1 union select 2 union select 3 union select 4 union + select 5 union select 6 union select 7 union select 8 union select 9 union + select 10 union select 11 union select 12 union select 13 union select 14 union + select 15 union select 16 union select 17 union select 18 union select 19 union + select 20 union select 21 union select 22 union select 23 union select 24 union + select 25 union select 26 union select 27 union select 28 union select 29 union + select 30 union select 31) AS pos(n) + WHERE p.pronargs > pos.n + + UNION + + /* result types */ + SELECT p.pronamespace, p.proname, 'ROUTINE'::text, 0, p.prorettype + FROM pg_proc p + + ) AS x (objschema, objname, objtype, objdtdid, objtypeid) + + WHERE n.oid = x.objschema + AND at.oid = x.objtypeid + AND (at.typelem <> 0 AND at.typlen = -1) + AND at.typelem = bt.oid + AND nbt.oid = bt.typnamespace + + AND (x.objschema, x.objname, x.objtype, x.objtypeid) IN + ( SELECT object_schema, object_name, object_type, dtd_identifier + FROM data_type_privileges ); + +GRANT SELECT ON element_types TO PUBLIC; |