2 * SQL Information Schema
3 * as defined in ISO 9075-2:1999 chapter 20
5 * Copyright 2002, PostgreSQL Global Development Group
7 * $Id: information_schema.sql,v 1.2 2003/01/14 23:19:34 petere Exp $
13 * INFORMATION_SCHEMA schema
16 CREATE SCHEMA information_schema;
17 GRANT USAGE ON SCHEMA information_schema TO PUBLIC;
18 SET search_path TO information_schema, public;
21 -- Note: 20.3 follows later. Some genius screwed up the order in the standard.
26 * CARDINAL_NUMBER domain
29 CREATE DOMAIN cardinal_number AS integer
30 CONSTRAINT cardinal_number_domain_check CHECK (value >= 0);
35 * CHARACTER_DATA domain
38 CREATE DOMAIN character_data AS character varying;
43 * SQL_IDENTIFIER domain
46 CREATE DOMAIN sql_identifier AS character varying;
51 * INFORMATION_SCHEMA_CATALOG_NAME view
54 CREATE VIEW information_schema_catalog_name AS
55 SELECT CAST(current_database() AS sql_identifier) AS catalog_name;
57 GRANT SELECT ON information_schema_catalog_name TO PUBLIC;
65 CREATE DOMAIN time_stamp AS timestamp(2)
66 DEFAULT current_timestamp(2);
71 * CHECK_CONSTRAINTS view
74 CREATE VIEW check_constraints AS
75 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
76 CAST(rs.nspname AS sql_identifier) AS constraint_schema,
77 CAST(con.conname AS sql_identifier) AS constraint_name,
78 CAST(con.consrc AS character_data) AS check_clause
79 FROM pg_namespace rs, pg_class c, pg_constraint con, pg_user u
80 WHERE rs.oid = c.relnamespace AND c.oid = con.conrelid
81 AND c.relowner = u.usesysid AND u.usename = current_user
82 AND con.contype = 'c';
84 GRANT SELECT ON check_constraints TO PUBLIC;
89 * COLUMN_DOMAIN_USAGE view
92 CREATE VIEW column_domain_usage AS
93 SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
94 CAST(nt.nspname AS sql_identifier) AS domain_schema,
95 CAST(t.typname AS sql_identifier) AS domain_name,
96 CAST(current_database() AS sql_identifier) AS table_catalog,
97 CAST(nc.nspname AS sql_identifier) AS table_schema,
98 CAST(c.relname AS sql_identifier) AS table_name,
99 CAST(a.attname AS sql_identifier) AS column_name
101 FROM pg_type t, pg_namespace nt, pg_class c, pg_namespace nc,
102 pg_attribute a, pg_user u
104 WHERE t.typnamespace = nt.oid AND t.typtype = 'd'
105 AND c.relnamespace = nc.oid AND a.attrelid = c.oid
106 AND a.atttypid = t.oid AND t.typowner = u.usesysid
107 AND u.usename = current_user;
109 GRANT SELECT ON column_domain_usage TO PUBLIC;
117 -- PostgreSQL does not have column privileges, so this view is empty.
118 -- (Table privileges do not also count as column privileges.)
120 CREATE VIEW column_privileges AS
121 SELECT CAST(null AS sql_identifier) AS grantor,
122 CAST(null AS sql_identifier) AS grantee,
123 CAST(null AS sql_identifier) AS table_catalog,
124 CAST(null AS sql_identifier) AS table_schema,
125 CAST(null AS sql_identifier) AS table_name,
126 CAST(null AS sql_identifier) AS column_name,
127 CAST(null AS character_data) AS privilege_type,
128 CAST(null AS character_data) AS is_grantable
131 GRANT SELECT ON column_privileges TO PUBLIC;
139 CREATE VIEW columns AS
140 SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
141 CAST(nc.nspname AS sql_identifier) AS table_schema,
142 CAST(c.relname AS sql_identifier) AS table_name,
143 CAST(a.attname AS sql_identifier) AS column_name,
144 CAST(a.attnum AS cardinal_number) AS ordinal_position,
146 CASE WHEN u.usename = current_user THEN a.adsrc ELSE null END
149 CAST(CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END
152 CAST(format_type(a.atttypid, null) AS character_data)
156 CASE WHEN a.atttypid IN (25, 1042, 1043, 1560, 1562) AND a.atttypmod <> -1
160 AS character_maximum_length,
163 CASE WHEN a.atttypid IN (25, 1042, 1043) THEN 2^30 ELSE null END
165 AS character_octet_length,
168 CASE WHEN a.atttypid IN (1700) THEN ((a.atttypmod - 4) >> 16) & 65535 ELSE null END
170 AS numeric_precision,
173 CASE WHEN a.atttypid IN (1700) THEN 10 ELSE null END
175 AS numeric_precision_radix,
178 CASE WHEN a.atttypid IN (1700) THEN (a.atttypmod - 4) & 65535 ELSE null END
183 CASE WHEN a.atttypid IN (1083, 1114, 1184, 1266)
184 THEN (CASE WHEN a.atttypmod <> -1 THEN a.atttypmod ELSE null END)
185 WHEN a.atttypid IN (1186)
186 THEN (CASE WHEN a.atttypmod <> -1 THEN a.atttypmod & 65535 ELSE null END)
189 AS datetime_precision,
191 CAST(null AS character_data) AS interval_type, -- XXX
192 CAST(null AS character_data) AS interval_precision, -- XXX
194 CAST(null AS sql_identifier) AS character_set_catalog,
195 CAST(null AS sql_identifier) AS character_set_schema,
196 CAST(null AS sql_identifier) AS character_set_name,
198 CAST(null AS sql_identifier) AS collation_catalog,
199 CAST(null AS sql_identifier) AS collation_schema,
200 CAST(null AS sql_identifier) AS collation_name,
202 CAST(CASE WHEN t.typbasetype <> 0 THEN current_database() ELSE null END
203 AS sql_identifier) AS domain_catalog,
204 CAST(CASE WHEN t.typbasetype <> 0 THEN nt.nspname ELSE null END
205 AS sql_identifier) AS domain_schema,
206 CAST(CASE WHEN t.typbasetype <> 0 THEN t.typname ELSE null END
207 AS sql_identifier) AS domain_name,
209 CAST(CASE WHEN t.typbasetype = 0 THEN current_database() ELSE null END
210 AS sql_identifier) AS udt_catalog,
211 CAST(CASE WHEN t.typbasetype = 0 THEN nt.nspname ELSE null END
212 AS sql_identifier) AS udt_schema,
213 CAST(CASE WHEN t.typbasetype = 0 THEN t.typname ELSE null END
214 AS sql_identifier) AS udt_name,
216 CAST(null AS sql_identifier) AS scope_catalog,
217 CAST(null AS sql_identifier) AS scope_schema,
218 CAST(null AS sql_identifier) AS scope_name,
220 CAST(null AS cardinal_number) AS maximum_cardinality,
221 CAST(null AS sql_identifier) AS dtd_identifier,
222 CAST('NO' AS character_data) AS is_self_referencing
224 FROM (pg_attribute LEFT JOIN pg_attrdef ON attrelid = adrelid AND attnum = adnum) AS a,
225 pg_class c, pg_namespace nc, pg_type t, pg_namespace nt, pg_user u
227 WHERE a.attrelid = c.oid
228 AND a.atttypid = t.oid
229 AND u.usesysid = c.relowner
230 AND nc.oid = c.relnamespace
231 AND nt.oid = t.typnamespace
232 AND u.usename = current_user
234 AND a.attnum > 0 AND NOT a.attisdropped AND c.relkind in ('r', 'v');
236 GRANT SELECT ON columns TO PUBLIC;
241 * REFERENTIAL_CONSTRAINTS view
244 CREATE VIEW referential_constraints AS
245 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
246 CAST(ncon.nspname AS sql_identifier) AS constraint_schema,
247 CAST(con.conname AS sql_identifier) AS constraint_name,
248 CAST(current_database() AS sql_identifier) AS unique_constraint_catalog,
249 CAST(null AS sql_identifier) AS unique_constraint_schema, -- XXX
250 CAST(null AS sql_identifier) AS unique_constraint_name, -- XXX
253 CASE con.confmatchtype WHEN 'f' THEN 'FULL'
254 WHEN 'p' THEN 'PARTIAL'
255 WHEN 'u' THEN 'NONE' END
256 AS character_data) AS match_option,
259 CASE con.confupdtype WHEN 'c' THEN 'CASCADE'
260 WHEN 'n' THEN 'SET NULL'
261 WHEN 'd' THEN 'SET DEFAULT'
262 WHEN 'r' THEN 'RESTRICT'
263 WHEN 'a' THEN 'NOACTION' END
264 AS character_data) AS update_rule,
267 CASE con.confdeltype WHEN 'c' THEN 'CASCADE'
268 WHEN 'n' THEN 'SET NULL'
269 WHEN 'd' THEN 'SET DEFAULT'
270 WHEN 'r' THEN 'RESTRICT'
271 WHEN 'a' THEN 'NOACTION' END
272 AS character_data) AS delete_rule
274 FROM pg_namespace ncon,
279 WHERE ncon.oid = con.connamespace
280 AND con.conrelid = r.oid AND r.relowner = u.usesysid
281 AND u.usename = current_user;
283 GRANT SELECT ON referential_constraints TO PUBLIC;
291 CREATE VIEW schemata AS
292 SELECT CAST(current_database() AS sql_identifier) AS catalog_name,
293 CAST(n.nspname AS sql_identifier) AS schema_name,
294 CAST(u.usename AS sql_identifier) AS schema_owner,
295 CAST(null AS sql_identifier) AS default_character_set_catalog,
296 CAST(null AS sql_identifier) AS default_character_set_schema,
297 CAST(null AS sql_identifier) AS default_character_set_name,
298 CAST(null AS character_data) AS sql_path
299 FROM pg_namespace n, pg_user u
300 WHERE n.nspowner = u.usesysid AND u.usename = current_user;
302 GRANT SELECT ON schemata TO PUBLIC;
310 CREATE TABLE sql_features (
311 feature_id character_data,
312 feature_name character_data,
313 sub_feature_id character_data,
314 sub_feature_name character_data,
315 is_supported character_data,
316 is_verified_by character_data,
317 comments character_data
320 -- Will be filled with external data by initdb.
322 GRANT SELECT ON sql_features TO PUBLIC;
327 * SQL_LANGUAGES table
330 CREATE TABLE sql_languages (
331 sql_language_source character_data,
332 sql_language_year character_data,
333 sql_language_conformance character_data,
334 sql_language_integrity character_data,
335 sql_language_implementation character_data,
336 sql_language_binding_style character_data,
337 sql_language_programming_language character_data
340 INSERT INTO sql_languages VALUES ('ISO 9075', '1999', 'CORE', NULL, NULL, 'DIRECT', NULL);
341 INSERT INTO sql_languages VALUES ('ISO 9075', '1999', 'CORE', NULL, NULL, 'EMBEDDED', 'C');
343 GRANT SELECT ON sql_languages TO PUBLIC;
351 CREATE TABLE sql_packages (
352 feature_id character_data,
353 feature_name character_data,
354 is_supported character_data,
355 is_verified_by character_data,
356 comments character_data
359 INSERT INTO sql_packages VALUES ('PKG000', 'Core', 'NO', NULL, '');
360 INSERT INTO sql_packages VALUES ('PKG001', 'Enhanced datetime facilities', 'YES', NULL, '');
361 INSERT INTO sql_packages VALUES ('PKG002', 'Enhanced integrity management', 'NO', NULL, '');
362 INSERT INTO sql_packages VALUES ('PKG003', 'OLAP facilities', 'NO', NULL, '');
363 INSERT INTO sql_packages VALUES ('PKG004', 'PSM', 'NO', NULL, 'PL/pgSQL is similar.');
364 INSERT INTO sql_packages VALUES ('PKG005', 'CLI', 'NO', NULL, 'ODBC is similar.');
365 INSERT INTO sql_packages VALUES ('PKG006', 'Basic object support', 'NO', NULL, '');
366 INSERT INTO sql_packages VALUES ('PKG007', 'Enhanced object support', 'NO', NULL, '');
367 INSERT INTO sql_packages VALUES ('PKG008', 'Active database', 'NO', NULL, '');
368 INSERT INTO sql_packages VALUES ('PKG009', 'SQL/MM support', 'NO', NULL, '');
370 GRANT SELECT ON sql_packages TO PUBLIC;
375 * TABLE_CONSTRAINTS view
378 CREATE VIEW table_constraints AS
379 SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
380 CAST(nc.nspname AS sql_identifier) AS constraint_schema,
381 CAST(c.conname AS sql_identifier) AS constraint_name,
382 CAST(current_database() AS sql_identifier) AS table_catalog,
383 CAST(nr.nspname AS sql_identifier) AS table_schema,
384 CAST(r.relname AS sql_identifier) AS table_name,
386 CASE c.contype WHEN 'c' THEN 'CHECK'
387 WHEN 'f' THEN 'FOREIGN KEY'
388 WHEN 'p' THEN 'PRIMARY KEY'
389 WHEN 'u' THEN 'UNIQUE' END
390 AS character_data) AS constraint_type,
391 CAST(CASE WHEN c.condeferrable THEN 'YES' ELSE 'NO' END AS character_data)
393 CAST(CASE WHEN c.condeferred THEN 'YES' ELSE 'NO' END AS character_data)
394 AS initially_deferred
396 FROM pg_namespace nc,
402 WHERE nc.oid = c.connamespace AND nr.oid = r.relnamespace
403 AND c.conrelid = r.oid AND r.relowner = u.usesysid
404 AND u.usename = current_user;
406 -- FIMXE: Not-null constraints are missing here.
408 GRANT SELECT ON table_constraints TO PUBLIC;
413 * TABLE_PRIVILEGES view
416 CREATE VIEW table_privileges AS
417 SELECT CAST(u_owner.usename AS sql_identifier) AS grantor,
418 CAST(u_grantee.usename AS sql_identifier) AS grantee,
419 CAST(current_database() AS sql_identifier) AS table_catalog,
420 CAST(nc.nspname AS sql_identifier) AS table_schema,
421 CAST(c.relname AS sql_identifier) AS table_name,
422 CAST(pr.type AS character_data) AS privilege_type,
423 CAST('NO' AS character_data) AS is_grantable,
424 CAST('NO' AS character_data) AS with_hierarchy
426 FROM pg_user u_owner,
430 (SELECT 'SELECT' UNION SELECT 'DELETE' UNION SELECT 'INSERT' UNION SELECT 'UPDATE'
431 UNION SELECT 'REFERENCES' UNION SELECT 'TRIGGER') AS pr (type)
433 WHERE u_owner.usesysid = c.relowner
434 AND c.relnamespace = nc.oid
435 AND has_table_privilege(u_grantee.usename, c.oid, pr.type)
437 AND (u_owner.usename = current_user OR u_grantee.usename = current_user);
439 GRANT SELECT ON table_privileges TO PUBLIC;
447 CREATE VIEW tables AS
448 SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
449 CAST(nc.nspname AS sql_identifier) AS table_schema,
450 CAST(c.relname AS sql_identifier) AS table_name,
453 CASE WHEN nc.nspname LIKE 'pg!_temp!_%' ESCAPE '!' THEN 'LOCAL TEMPORARY'
454 WHEN c.relkind = 'r' THEN 'BASE TABLE'
455 WHEN c.relkind = 'v' THEN 'VIEW'
457 AS character_data) AS table_type,
459 CAST(null AS sql_identifier) AS self_referencing_column_name,
460 CAST(null AS character_data) AS reference_generation,
462 CAST(null AS sql_identifier) AS user_defined_type_catalog,
463 CAST(null AS sql_identifier) AS user_defined_type_schema,
464 CAST(null AS sql_identifier) AS user_defined_name
466 FROM pg_namespace nc, pg_class c, pg_user u
468 WHERE c.relnamespace = nc.oid AND u.usesysid = c.relowner
469 AND (u.usename = current_user
470 OR EXISTS(SELECT 1 FROM information_schema.table_privileges tp
471 WHERE tp.table_schema = nc.nspname
472 AND tp.table_name = c.relname
473 AND tp.grantee = current_user))
475 AND c.relkind IN ('r', 'v');
477 GRANT SELECT ON tables TO PUBLIC;
482 * USAGE_PRIVILEGES view
485 -- Of the things currently implemented in PostgreSQL, usage privileges
486 -- apply only to domains. Since domains have no real privileges, we
487 -- represent all domains with implicit usage privilege here.
489 CREATE VIEW usage_privileges AS
490 SELECT CAST(u.usename AS sql_identifier) AS grantor,
491 CAST('PUBLIC' AS sql_identifier) AS grantee,
492 CAST(current_database() AS sql_identifier) AS object_catalog,
493 CAST(n.nspname AS sql_identifier) AS object_schema,
494 CAST(t.typname AS sql_identifier) AS object_name,
495 CAST('DOMAIN' AS character_data) AS object_type,
496 CAST('USAGE' AS character_data) AS privilege_type,
497 CAST('NO' AS character_data) AS is_grantable
503 WHERE u.usesysid = t.typowner
504 AND t.typnamespace = n.oid
507 GRANT SELECT ON usage_privileges TO PUBLIC;
516 SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
517 CAST(nc.nspname AS sql_identifier) AS table_schema,
518 CAST(c.relname AS sql_identifier) AS table_name,
521 CASE WHEN u.usename = current_user THEN pg_get_viewdef(c.oid)
523 AS character_data) AS view_definition,
525 CAST('NONE' AS character_data) AS check_option,
526 CAST(null AS character_data) AS is_updatable, -- FIXME
527 CAST(null AS character_data) AS is_insertable_into -- FIXME
529 FROM pg_namespace nc, pg_class c, pg_user u
531 WHERE c.relnamespace = nc.oid AND u.usesysid = c.relowner
532 AND (u.usename = current_user
533 OR EXISTS(SELECT 1 FROM information_schema.table_privileges tp
534 WHERE tp.table_schema = nc.nspname
535 AND tp.table_name = c.relname
536 AND tp.grantee = current_user))
540 GRANT SELECT ON views TO PUBLIC;