]> granicus.if.org Git - postgresql/blob - src/backend/catalog/information_schema.sql
"Information_schema" changes
[postgresql] / src / backend / catalog / information_schema.sql
1 /*
2  * SQL Information Schema
3  * as defined in ISO 9075-2:1999 chapter 20
4  *
5  * Copyright 2002, PostgreSQL Global Development Group
6  *
7  * $Id: information_schema.sql,v 1.4 2003/03/20 05:06:55 momjian Exp $
8  */
9
10
11 /*
12  * 20.2
13  * INFORMATION_SCHEMA schema
14  */
15
16 CREATE SCHEMA information_schema;
17 GRANT USAGE ON SCHEMA information_schema TO PUBLIC;
18 SET search_path TO information_schema, public;
19
20
21 -- Note: 20.3 follows later.  Some genius screwed up the order in the standard.
22
23
24 /*
25  * 20.4
26  * CARDINAL_NUMBER domain
27  */
28
29 CREATE DOMAIN cardinal_number AS integer
30     CONSTRAINT cardinal_number_domain_check CHECK (value >= 0);
31
32
33 /*
34  * 20.5
35  * CHARACTER_DATA domain
36  */
37
38 CREATE DOMAIN character_data AS character varying;
39
40
41 /*
42  * 20.6
43  * SQL_IDENTIFIER domain
44  */
45
46 CREATE DOMAIN sql_identifier AS character varying;
47
48
49 /*
50  * 20.3
51  * INFORMATION_SCHEMA_CATALOG_NAME view
52  */
53
54 CREATE VIEW information_schema_catalog_name AS
55     SELECT CAST(current_database() AS sql_identifier) AS catalog_name;
56
57 GRANT SELECT ON information_schema_catalog_name TO PUBLIC;
58
59
60 /*
61  * 20.7
62  * TIME_STAMP domain
63  */
64
65 CREATE DOMAIN time_stamp AS timestamp(2)
66     DEFAULT current_timestamp(2);
67
68
69 /*
70  * 20.13
71  * CHECK_CONSTRAINTS view
72  */
73
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_constraint con
80          left outer join pg_class c on (c.oid = con.conrelid)
81          left outer join pg_type t on (t.oid = con.contypid),
82          pg_user u
83     WHERE rs.oid = con.connamespace
84           AND u.usesysid IN (c.relowner, t.typowner)
85           AND u.usename = current_user
86           AND con.contype = 'c';
87
88 GRANT SELECT ON check_constraints TO PUBLIC;
89
90
91 /*
92  * 20.15
93  * COLUMN_DOMAIN_USAGE view
94  */
95
96 CREATE VIEW column_domain_usage AS
97     SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
98            CAST(nt.nspname AS sql_identifier) AS domain_schema,
99            CAST(t.typname AS sql_identifier) AS domain_name,
100            CAST(current_database() AS sql_identifier) AS table_catalog,
101            CAST(nc.nspname AS sql_identifier) AS table_schema,
102            CAST(c.relname AS sql_identifier) AS table_name,
103            CAST(a.attname AS sql_identifier) AS column_name
104
105     FROM pg_type t, pg_namespace nt, pg_class c, pg_namespace nc,
106          pg_attribute a, pg_user u
107
108     WHERE t.typnamespace = nt.oid AND t.typtype = 'd'
109           AND c.relnamespace = nc.oid AND a.attrelid = c.oid
110           AND a.atttypid = t.oid AND t.typowner = u.usesysid
111           AND u.usename = current_user;
112
113 GRANT SELECT ON column_domain_usage TO PUBLIC;
114
115
116 /*
117  * 20.16
118  * COLUMN_PRIVILEGES
119  */
120
121 -- PostgreSQL does not have column privileges, so this view is empty.
122 -- (Table privileges do not also count as column privileges.)
123
124 CREATE VIEW column_privileges AS
125     SELECT CAST(null AS sql_identifier) AS grantor,
126            CAST(null AS sql_identifier) AS grantee,
127            CAST(null AS sql_identifier) AS table_catalog,
128            CAST(null AS sql_identifier) AS table_schema,
129            CAST(null AS sql_identifier) AS table_name,
130            CAST(null AS sql_identifier) AS column_name,
131            CAST(null AS character_data) AS privilege_type,
132            CAST(null AS character_data) AS is_grantable
133     WHERE false;
134
135 GRANT SELECT ON column_privileges TO PUBLIC;
136
137
138 /*
139  * 20.18
140  * COLUMNS view
141  */
142
143 CREATE VIEW columns AS
144     SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
145            CAST(nc.nspname AS sql_identifier) AS table_schema,
146            CAST(c.relname AS sql_identifier) AS table_name,
147            CAST(a.attname AS sql_identifier) AS column_name,
148            CAST(a.attnum AS cardinal_number) AS ordinal_position,
149            CAST(
150              CASE WHEN u.usename = current_user THEN a.adsrc ELSE null END
151              AS character_data)
152              AS column_default,
153            CAST(CASE WHEN a.attnotnull THEN 'NO' ELSE 'YES' END
154              AS character_data)
155              AS is_nullable,
156            CAST(format_type(a.atttypid, null) AS character_data)
157              AS data_type,
158
159            CAST(
160              CASE WHEN a.atttypid IN (25, 1042, 1043, 1560, 1562) AND a.atttypmod <> -1
161                   THEN a.atttypmod - 4
162                   ELSE null END
163              AS cardinal_number)
164              AS character_maximum_length,
165
166            CAST(
167              CASE WHEN a.atttypid IN (25, 1042, 1043) THEN 2^30 ELSE null END
168              AS cardinal_number)
169              AS character_octet_length,
170
171            CAST(
172              CASE WHEN a.atttypid IN (1700) THEN ((a.atttypmod - 4) >> 16) & 65535 ELSE null END
173              AS cardinal_number)
174              AS numeric_precision,
175
176            CAST(
177              CASE WHEN a.atttypid IN (1700) THEN 10 ELSE null END
178              AS cardinal_number)
179              AS numeric_precision_radix,
180
181            CAST(
182              CASE WHEN a.atttypid IN (1700) THEN (a.atttypmod - 4) & 65535 ELSE null END
183              AS cardinal_number)
184              AS numeric_scale,
185
186            CAST(
187              CASE WHEN a.atttypid IN (1083, 1114, 1184, 1266)
188                   THEN (CASE WHEN a.atttypmod <> -1 THEN a.atttypmod ELSE null END)
189                   WHEN a.atttypid IN (1186)
190                   THEN (CASE WHEN a.atttypmod <> -1 THEN a.atttypmod & 65535 ELSE null END)
191                   ELSE null END
192              AS cardinal_number)
193              AS datetime_precision,
194
195            CAST(null AS character_data) AS interval_type, -- XXX
196            CAST(null AS character_data) AS interval_precision, -- XXX
197
198            CAST(null AS sql_identifier) AS character_set_catalog,
199            CAST(null AS sql_identifier) AS character_set_schema,
200            CAST(null AS sql_identifier) AS character_set_name,
201
202            CAST(null AS sql_identifier) AS collation_catalog,
203            CAST(null AS sql_identifier) AS collation_schema,
204            CAST(null AS sql_identifier) AS collation_name,
205
206            CAST(CASE WHEN t.typbasetype <> 0 THEN current_database() ELSE null END
207              AS sql_identifier) AS domain_catalog,
208            CAST(CASE WHEN t.typbasetype <> 0 THEN nt.nspname ELSE null END
209              AS sql_identifier) AS domain_schema,
210            CAST(CASE WHEN t.typbasetype <> 0 THEN t.typname ELSE null END
211              AS sql_identifier) AS domain_name,
212
213            CAST(CASE WHEN t.typbasetype = 0 THEN current_database() ELSE null END
214              AS sql_identifier) AS udt_catalog,
215            CAST(CASE WHEN t.typbasetype = 0 THEN nt.nspname ELSE null END
216              AS sql_identifier) AS udt_schema,
217            CAST(CASE WHEN t.typbasetype = 0 THEN t.typname ELSE null END
218              AS sql_identifier) AS udt_name,
219
220            CAST(null AS sql_identifier) AS scope_catalog,
221            CAST(null AS sql_identifier) AS scope_schema,
222            CAST(null AS sql_identifier) AS scope_name,
223
224            CAST(null AS cardinal_number) AS maximum_cardinality,
225            CAST(null AS sql_identifier) AS dtd_identifier,
226            CAST('NO' AS character_data) AS is_self_referencing
227
228            FROM (pg_attribute LEFT JOIN pg_attrdef ON attrelid = adrelid AND attnum = adnum) AS a,
229                 pg_class c, pg_namespace nc, pg_type t, pg_namespace nt, pg_user u
230
231            WHERE a.attrelid = c.oid
232                  AND a.atttypid = t.oid
233                  AND u.usesysid = c.relowner
234                  AND nc.oid = c.relnamespace
235                  AND nt.oid = t.typnamespace
236                  AND u.usename = current_user
237
238                  AND a.attnum > 0 AND NOT a.attisdropped AND c.relkind in ('r', 'v');
239
240 GRANT SELECT ON columns TO PUBLIC;
241
242
243 /*
244  * 20.24
245  * DOMAIN_CONSTRAINTS view
246  */
247
248 CREATE VIEW domain_constraints AS
249     SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
250            CAST(rs.nspname AS sql_identifier) AS constraint_schema,
251            CAST(con.conname AS sql_identifier) AS constraint_name,
252            CAST(current_database() AS sql_identifier) AS domain_catalog,
253            CAST(n.nspname AS sql_identifier) AS domain_schema,
254            CAST(t.typname AS sql_identifier) AS domain_name,
255            CAST(CASE WHEN condeferrable THEN 'YES' ELSE 'NO' END
256              AS character_data) AS is_deferrable,
257            CAST(CASE WHEN condeferred THEN 'YES' ELSE 'NO' END
258              AS character_data) AS initially_deferred
259     FROM pg_namespace rs, pg_namespace n, pg_constraint con, pg_type t, pg_user u
260     WHERE rs.oid = con.connamespace
261           AND n.oid = t.typnamespace
262           AND u.usesysid = t.typowner
263           AND u.usename = current_user
264           AND t.oid = con.contypid;
265
266 GRANT SELECT ON domain_constraints TO PUBLIC;
267
268
269 /*
270  * 20.26
271  * DOMAINS view
272  */
273
274 CREATE VIEW domains AS
275     SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
276            CAST(rs.nspname AS sql_identifier) AS domain_schema,
277            CAST(t.typname AS sql_identifier) AS domain_name,
278            CAST(format_type(t.typbasetype, null) AS character_data)
279              AS data_type,
280
281            CAST(
282              CASE WHEN t.typbasetype IN (25, 1042, 1043, 1560, 1562) AND t.typtypmod <> -1
283                   THEN t.typtypmod - 4
284                   ELSE null END
285              AS cardinal_number)
286              AS character_maximum_length,
287
288            CAST(
289              CASE WHEN t.typbasetype IN (25, 1042, 1043) THEN 2^30 ELSE null END
290              AS cardinal_number)
291              AS character_octet_length,
292            CAST(null AS sql_identifier) AS character_set_catalog,
293            CAST(null AS sql_identifier) AS character_set_schema,
294            CAST(null AS sql_identifier) AS character_set_name,
295
296            CAST(null AS sql_identifier) AS collation_catalog,
297            CAST(null AS sql_identifier) AS collation_schema,
298            CAST(null AS sql_identifier) AS collation_name,
299
300            CAST(
301              CASE WHEN t.typbasetype IN (1700) THEN ((t.typtypmod - 4) >> 16) & 65535 ELSE null END
302              AS cardinal_number)
303              AS numeric_precision,
304
305            CAST(
306              CASE WHEN t.typbasetype IN (1700) THEN 10 ELSE null END
307              AS cardinal_number)
308              AS numeric_precision_radix,
309
310            CAST(
311              CASE WHEN t.typbasetype IN (1700) THEN (t.typtypmod - 4) & 65535 ELSE null END
312              AS cardinal_number)
313              AS numeric_scale,
314
315            CAST(
316              CASE WHEN t.typbasetype IN (1083, 1114, 1184, 1266)
317                   THEN (CASE WHEN t.typtypmod <> -1 THEN t.typtypmod ELSE null END)
318                   WHEN t.typbasetype IN (1186)
319                   THEN (CASE WHEN t.typtypmod <> -1 THEN t.typtypmod & 65535 ELSE null END)
320                   ELSE null END
321              AS cardinal_number)
322              AS datetime_precision,
323
324            CAST(null AS character_data) AS interval_type, -- XXX
325            CAST(null AS character_data) AS interval_precision, -- XXX
326
327            CAST(typdefault AS character_data) AS domain_default,
328
329            CAST(CASE WHEN t.typbasetype = 0 THEN current_database() ELSE null END
330              AS sql_identifier) AS udt_catalog,
331            CAST(CASE WHEN t.typbasetype = 0 THEN rs.nspname ELSE null END
332              AS sql_identifier) AS udt_schema,
333            CAST(CASE WHEN t.typbasetype = 0 THEN t.typname ELSE null END
334              AS sql_identifier) AS udt_name,
335
336            CAST(null AS sql_identifier) AS scope_catalog,
337            CAST(null AS sql_identifier) AS scope_schema,
338            CAST(null AS sql_identifier) AS scope_name,
339
340            CAST(null AS cardinal_number) AS maximum_cardinality,
341            CAST(null AS sql_identifier) AS dtd_identifier
342
343     FROM pg_namespace rs,
344          pg_type t,
345          pg_user u
346
347     WHERE rs.oid = t.typnamespace
348           AND t.typtype = 'd'
349           AND t.typowner = u.usesysid
350           AND (u.usename = CURRENT_USER
351               OR EXISTS (SELECT 1
352                          FROM pg_user AS u2
353                          WHERE rs.nspowner = u2.usesysid
354                            AND u2.usename = CURRENT_USER)
355               OR EXISTS (SELECT 1
356                          FROM pg_user AS u3,
357                               pg_attribute AS a3,
358                               pg_class AS c3
359                          WHERE u3.usesysid = c3.relowner
360                            AND a3.attrelid = c3.oid
361                            AND a3.atttypid = t.oid));
362
363
364 GRANT SELECT ON domains TO PUBLIC;
365
366
367 /*
368  * 20.35
369  * REFERENTIAL_CONSTRAINTS view
370  */
371
372 CREATE VIEW referential_constraints AS
373     SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
374            CAST(ncon.nspname AS sql_identifier) AS constraint_schema,
375            CAST(con.conname AS sql_identifier) AS constraint_name,
376            CAST(current_database() AS sql_identifier) AS unique_constraint_catalog,
377            CAST(null AS sql_identifier) AS unique_constraint_schema, -- XXX
378            CAST(null AS sql_identifier) AS unique_constraint_name, -- XXX
379
380            CAST(
381              CASE con.confmatchtype WHEN 'f' THEN 'FULL'
382                                     WHEN 'p' THEN 'PARTIAL'
383                                     WHEN 'u' THEN 'NONE' END
384              AS character_data) AS match_option,
385
386            CAST(
387              CASE con.confupdtype WHEN 'c' THEN 'CASCADE'
388                                   WHEN 'n' THEN 'SET NULL'
389                                   WHEN 'd' THEN 'SET DEFAULT'
390                                   WHEN 'r' THEN 'RESTRICT'
391                                   WHEN 'a' THEN 'NOACTION' END
392              AS character_data) AS update_rule,
393
394            CAST(
395              CASE con.confdeltype WHEN 'c' THEN 'CASCADE'
396                                   WHEN 'n' THEN 'SET NULL'
397                                   WHEN 'd' THEN 'SET DEFAULT'
398                                   WHEN 'r' THEN 'RESTRICT'
399                                   WHEN 'a' THEN 'NOACTION' END
400              AS character_data) AS delete_rule
401
402     FROM pg_namespace ncon,
403          pg_constraint con,
404          pg_class r,
405          pg_user u
406
407     WHERE ncon.oid = con.connamespace
408           AND con.conrelid = r.oid AND r.relowner = u.usesysid
409           AND u.usename = current_user;
410
411 GRANT SELECT ON referential_constraints TO PUBLIC;
412
413
414 /*
415  * 20.46
416  * SCHEMATA view
417  */
418
419 CREATE VIEW schemata AS
420     SELECT CAST(current_database() AS sql_identifier) AS catalog_name,
421            CAST(n.nspname AS sql_identifier) AS schema_name,
422            CAST(u.usename AS sql_identifier) AS schema_owner,
423            CAST(null AS sql_identifier) AS default_character_set_catalog,
424            CAST(null AS sql_identifier) AS default_character_set_schema,
425            CAST(null AS sql_identifier) AS default_character_set_name,
426            CAST(null AS character_data) AS sql_path
427     FROM pg_namespace n, pg_user u
428     WHERE n.nspowner = u.usesysid AND u.usename = current_user;
429
430 GRANT SELECT ON schemata TO PUBLIC;
431
432
433 /*
434  * 20.47
435  * SQL_FEATURES table
436  */
437
438 CREATE TABLE sql_features (
439     feature_id          character_data,
440     feature_name        character_data,
441     sub_feature_id      character_data,
442     sub_feature_name    character_data,
443     is_supported        character_data,
444     is_verified_by      character_data,
445     comments            character_data
446 ) WITHOUT OIDS;
447
448 -- Will be filled with external data by initdb.
449
450 GRANT SELECT ON sql_features TO PUBLIC;
451
452
453 /*
454  * 20.48
455  * SQL_IMPLEMENTATION_INFO table
456  */
457
458 -- Note: Implementation information items are defined in ISO 9075-3:1999,
459 -- clause 7.1.
460
461 CREATE TABLE sql_implementation_info (
462     implementation_info_id      character_data,
463     implementation_info_name    character_data,
464     integer_value               cardinal_number,
465     character_value             character_data,
466     comments                    character_data
467 ) WITHOUT OIDS;
468
469 INSERT INTO sql_implementation_info VALUES ('10003', 'CATALOG NAME', NULL, 'Y', NULL);
470 INSERT INTO sql_implementation_info VALUES ('10004', 'COLLATING SEQUENCE', NULL, '', 'not supported');
471 INSERT INTO sql_implementation_info VALUES ('23',    'CURSOR COMMIT BEHAVIOR', 1, NULL, 'close cursors and retain prepared statements');
472 INSERT INTO sql_implementation_info VALUES ('2',     'DATA SOURCE NAME', NULL, '', NULL);
473 INSERT INTO sql_implementation_info VALUES ('17',    'DBMS NAME', NULL, (select trim(trailing ' ' from substring(version() from '^[^0-9]*'))), NULL);
474 INSERT INTO sql_implementation_info VALUES ('18',    'DBMS VERSION', NULL, '???', NULL); -- filled by initdb
475 INSERT INTO sql_implementation_info VALUES ('26',    'DEFAULT TRANSACTION ISOLATION', 2, NULL, 'READ COMMITED; user-settable');
476 INSERT INTO sql_implementation_info VALUES ('28',    'IDENTIFIER CASE', 3, NULL, 'stored in mixed case - case sensitive');
477 INSERT INTO sql_implementation_info VALUES ('85',    'NULL COLLATION', 0, NULL, 'nulls higher than non-nulls');
478 INSERT INTO sql_implementation_info VALUES ('13',    'SERVER NAME', NULL, '', NULL);
479 INSERT INTO sql_implementation_info VALUES ('94',    'SPECIAL CHARACTERS', NULL, '', 'all non-ASCII characters allowed');
480 INSERT INTO sql_implementation_info VALUES ('46',    'TRANSACTION CAPABLE', 2, NULL, 'both DML and DDL');
481
482 GRANT SELECT ON sql_implementation_info TO PUBLIC;
483
484
485 /*
486  * 20.49
487  * SQL_LANGUAGES table
488  */
489
490 CREATE TABLE sql_languages (
491     sql_language_source         character_data,
492     sql_language_year           character_data,
493     sql_language_conformance    character_data,
494     sql_language_integrity      character_data,
495     sql_language_implementation character_data,
496     sql_language_binding_style  character_data,
497     sql_language_programming_language character_data
498 ) WITHOUT OIDS;
499
500 INSERT INTO sql_languages VALUES ('ISO 9075', '1999', 'CORE', NULL, NULL, 'DIRECT', NULL);
501 INSERT INTO sql_languages VALUES ('ISO 9075', '1999', 'CORE', NULL, NULL, 'EMBEDDED', 'C');
502
503 GRANT SELECT ON sql_languages TO PUBLIC;
504
505
506 /*
507  * 20.50
508  * SQL_PACKAGES table
509  */
510
511 CREATE TABLE sql_packages (
512     feature_id      character_data,
513     feature_name    character_data,
514     is_supported    character_data,
515     is_verified_by  character_data,
516     comments        character_data
517 ) WITHOUT OIDS;
518
519 INSERT INTO sql_packages VALUES ('PKG000', 'Core', 'NO', NULL, '');
520 INSERT INTO sql_packages VALUES ('PKG001', 'Enhanced datetime facilities', 'YES', NULL, '');
521 INSERT INTO sql_packages VALUES ('PKG002', 'Enhanced integrity management', 'NO', NULL, '');
522 INSERT INTO sql_packages VALUES ('PKG003', 'OLAP facilities', 'NO', NULL, '');
523 INSERT INTO sql_packages VALUES ('PKG004', 'PSM', 'NO', NULL, 'PL/pgSQL is similar.');
524 INSERT INTO sql_packages VALUES ('PKG005', 'CLI', 'NO', NULL, 'ODBC is similar.');
525 INSERT INTO sql_packages VALUES ('PKG006', 'Basic object support', 'NO', NULL, '');
526 INSERT INTO sql_packages VALUES ('PKG007', 'Enhanced object support', 'NO', NULL, '');
527 INSERT INTO sql_packages VALUES ('PKG008', 'Active database', 'NO', NULL, '');
528 INSERT INTO sql_packages VALUES ('PKG009', 'SQL/MM support', 'NO', NULL, '');
529
530 GRANT SELECT ON sql_packages TO PUBLIC;
531
532
533 /*
534  * 20.51
535  * SQL_SIZING table
536  */
537
538 -- Note: Sizing items are defined in ISO 9075-3:1999, clause 7.2.
539
540 CREATE TABLE sql_sizing (
541     sizing_id       cardinal_number,
542     sizing_name     character_data,
543     supported_value cardinal_number,
544     comments        character_data
545 ) WITHOUT OIDS;
546
547 INSERT INTO sql_sizing VALUES (34,    'MAXIMUM CATALOG NAME LENGTH', 63, NULL);
548 INSERT INTO sql_sizing VALUES (30,    'MAXIMUM COLUMN NAME LENGTH', 63, NULL);
549 INSERT INTO sql_sizing VALUES (97,    'MAXIMUM COLUMNS IN GROUP BY', 0, NULL);
550 INSERT INTO sql_sizing VALUES (99,    'MAXIMUM COLUMNS IN ORDER BY', 0, NULL);
551 INSERT INTO sql_sizing VALUES (100,   'MAXIMUM COLUMNS IN SELECT', 0, NULL);
552 INSERT INTO sql_sizing VALUES (101,   'MAXIMUM COLUMNS IN TABLE', 1600, NULL); -- match MaxHeapAttributeNumber
553 INSERT INTO sql_sizing VALUES (1,     'MAXIMUM CONCURRENT ACTIVITIES', 0, NULL);
554 INSERT INTO sql_sizing VALUES (31,    'MAXIMUM CURSOR NAME LENGTH', 63, NULL);
555 INSERT INTO sql_sizing VALUES (0,     'MAXIMUM DRIVER CONNECTIONS', NULL, NULL);
556 INSERT INTO sql_sizing VALUES (10005, 'MAXIMUM IDENTIFIER LENGTH', 63, NULL);
557 INSERT INTO sql_sizing VALUES (32,    'MAXIMUM SCHEMA NAME LENGTH', 63, NULL);
558 INSERT INTO sql_sizing VALUES (20000, 'MAXIMUM STATEMENT OCTETS', 0, NULL);
559 INSERT INTO sql_sizing VALUES (20001, 'MAXIMUM STATEMENT OCTETS DATA', 0, NULL);
560 INSERT INTO sql_sizing VALUES (20002, 'MAXIMUM STATEMENT OCTETS SCHEMA', 0, NULL);
561 INSERT INTO sql_sizing VALUES (35,    'MAXIMUM TABLE NAME LENGTH', 63, NULL);
562 INSERT INTO sql_sizing VALUES (106,   'MAXIMUM TABLES IN SELECT', 0, NULL);
563 INSERT INTO sql_sizing VALUES (107,   'MAXIMUM USER NAME LENGTH', 63, NULL);
564 INSERT INTO sql_sizing VALUES (25000, 'MAXIMUM CURRENT DEFAULT TRANSFORM GROUP LENGTH', NULL, NULL);
565 INSERT INTO sql_sizing VALUES (25001, 'MAXIMUM CURRENT TRANSFORM GROUP LENGTH', NULL, NULL);
566 INSERT INTO sql_sizing VALUES (25002, 'MAXIMUM CURRENT PATH LENGTH', 0, NULL);
567 INSERT INTO sql_sizing VALUES (25003, 'MAXIMUM CURRENT ROLE LENGTH', NULL, NULL);
568 INSERT INTO sql_sizing VALUES (25004, 'MAXIMUM SESSION USER LENGTH', 63, NULL);
569 INSERT INTO sql_sizing VALUES (25005, 'MAXIMUM SYSTEM USER LENGTH', 63, NULL);
570
571 UPDATE sql_sizing
572     SET supported_value = (SELECT typlen-1 FROM pg_catalog.pg_type WHERE typname = 'name'),
573         comments = 'Might be less, depending on character set.'
574     WHERE supported_value = 63;
575
576 GRANT SELECT ON sql_sizing TO PUBLIC;
577
578
579 /*
580  * 20.52
581  * SQL_SIZING_PROFILES table
582  */
583
584 -- The data in this table are defined by various profiles of SQL.
585 -- Since we don't have any information about such profiles, we provide
586 -- an empty table.
587
588 CREATE TABLE sql_sizing_profiles (
589     sizing_id       cardinal_number,
590     sizing_name     character_data,
591     profile_id      character_data,
592     required_value  cardinal_number,
593     comments        character_data
594 ) WITHOUT OIDS;
595
596 GRANT SELECT ON sql_sizing_profiles TO PUBLIC;
597
598
599 /*
600  * 20.53
601  * TABLE_CONSTRAINTS view
602  */
603
604 CREATE VIEW table_constraints AS
605     SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
606            CAST(nc.nspname AS sql_identifier) AS constraint_schema,
607            CAST(c.conname AS sql_identifier) AS constraint_name,
608            CAST(current_database() AS sql_identifier) AS table_catalog,
609            CAST(nr.nspname AS sql_identifier) AS table_schema,
610            CAST(r.relname AS sql_identifier) AS table_name,
611            CAST(
612              CASE c.contype WHEN 'c' THEN 'CHECK'
613                             WHEN 'f' THEN 'FOREIGN KEY'
614                             WHEN 'p' THEN 'PRIMARY KEY'
615                             WHEN 'u' THEN 'UNIQUE' END
616              AS character_data) AS constraint_type,
617            CAST(CASE WHEN c.condeferrable THEN 'YES' ELSE 'NO' END AS character_data)
618              AS is_deferrable,
619            CAST(CASE WHEN c.condeferred THEN 'YES' ELSE 'NO' END AS character_data)
620              AS initially_deferred
621
622     FROM pg_namespace nc,
623          pg_namespace nr,
624          pg_constraint c,
625          pg_class r,
626          pg_user u
627
628     WHERE nc.oid = c.connamespace AND nr.oid = r.relnamespace
629           AND c.conrelid = r.oid AND r.relowner = u.usesysid
630           AND u.usename = current_user;
631
632 -- FIMXE: Not-null constraints are missing here.
633
634 GRANT SELECT ON table_constraints TO PUBLIC;
635
636
637 /*
638  * 20.55
639  * TABLE_PRIVILEGES view
640  */
641
642 CREATE VIEW table_privileges AS
643     SELECT CAST(u_owner.usename AS sql_identifier) AS grantor,
644            CAST(u_grantee.usename AS sql_identifier) AS grantee,
645            CAST(current_database() AS sql_identifier) AS table_catalog,
646            CAST(nc.nspname AS sql_identifier) AS table_schema,
647            CAST(c.relname AS sql_identifier) AS table_name,
648            CAST(pr.type AS character_data) AS privilege_type,
649            CAST('NO' AS character_data) AS is_grantable,
650            CAST('NO' AS character_data) AS with_hierarchy
651
652     FROM pg_user u_owner,
653          pg_user u_grantee,
654          pg_namespace nc,
655          pg_class c,
656          (SELECT 'SELECT' UNION SELECT 'DELETE' UNION SELECT 'INSERT' UNION SELECT 'UPDATE'
657           UNION SELECT 'REFERENCES' UNION SELECT 'TRIGGER') AS pr (type)
658
659     WHERE u_owner.usesysid = c.relowner
660           AND c.relnamespace = nc.oid
661           AND has_table_privilege(u_grantee.usename, c.oid, pr.type)
662
663           AND (u_owner.usename = current_user OR u_grantee.usename = current_user);
664
665 GRANT SELECT ON table_privileges TO PUBLIC;
666
667
668 /*
669  * 20.56
670  * TABLES view
671  */
672
673 CREATE VIEW tables AS
674     SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
675            CAST(nc.nspname AS sql_identifier) AS table_schema,
676            CAST(c.relname AS sql_identifier) AS table_name,
677
678            CAST(
679              CASE WHEN nc.nspname LIKE 'pg!_temp!_%' ESCAPE '!' THEN 'LOCAL TEMPORARY'
680                   WHEN c.relkind = 'r' THEN 'BASE TABLE'
681                   WHEN c.relkind = 'v' THEN 'VIEW'
682                   ELSE null END
683              AS character_data) AS table_type,
684
685            CAST(null AS sql_identifier) AS self_referencing_column_name,
686            CAST(null AS character_data) AS reference_generation,
687
688            CAST(null AS sql_identifier) AS user_defined_type_catalog,
689            CAST(null AS sql_identifier) AS user_defined_type_schema,
690            CAST(null AS sql_identifier) AS user_defined_name
691
692     FROM pg_namespace nc, pg_class c, pg_user u
693
694     WHERE c.relnamespace = nc.oid AND u.usesysid = c.relowner
695           AND (u.usename = current_user
696                OR EXISTS(SELECT 1 FROM information_schema.table_privileges tp
697                                   WHERE tp.table_schema = nc.nspname
698                                         AND tp.table_name = c.relname
699                                         AND tp.grantee = current_user))
700
701           AND c.relkind IN ('r', 'v');
702
703 GRANT SELECT ON tables TO PUBLIC;
704
705
706 /*
707  * 20.63
708  * USAGE_PRIVILEGES view
709  */
710
711 -- Of the things currently implemented in PostgreSQL, usage privileges
712 -- apply only to domains.  Since domains have no real privileges, we
713 -- represent all domains with implicit usage privilege here.
714
715 CREATE VIEW usage_privileges AS
716     SELECT CAST(u.usename AS sql_identifier) AS grantor,
717            CAST('PUBLIC' AS sql_identifier) AS grantee,
718            CAST(current_database() AS sql_identifier) AS object_catalog,
719            CAST(n.nspname AS sql_identifier) AS object_schema,
720            CAST(t.typname AS sql_identifier) AS object_name,
721            CAST('DOMAIN' AS character_data) AS object_type,
722            CAST('USAGE' AS character_data) AS privilege_type,
723            CAST('NO' AS character_data) AS is_grantable
724
725     FROM pg_user u,
726          pg_namespace n,
727          pg_type t
728
729     WHERE u.usesysid = t.typowner
730           AND t.typnamespace = n.oid
731           AND t.typtype = 'd';
732
733 GRANT SELECT ON usage_privileges TO PUBLIC;
734
735
736 /*
737  * 20.68
738  * VIEWS view
739  */
740
741 CREATE VIEW views AS
742     SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
743            CAST(nc.nspname AS sql_identifier) AS table_schema,
744            CAST(c.relname AS sql_identifier) AS table_name,
745
746            CAST(
747              CASE WHEN u.usename = current_user THEN pg_get_viewdef(c.oid)
748                   ELSE null END
749              AS character_data) AS view_definition,
750
751            CAST('NONE' AS character_data) AS check_option,
752            CAST(null AS character_data) AS is_updatable, -- FIXME
753            CAST(null AS character_data) AS is_insertable_into  -- FIXME
754
755     FROM pg_namespace nc, pg_class c, pg_user u
756
757     WHERE c.relnamespace = nc.oid AND u.usesysid = c.relowner
758           AND (u.usename = current_user
759                OR EXISTS(SELECT 1 FROM information_schema.table_privileges tp
760                                   WHERE tp.table_schema = nc.nspname
761                                         AND tp.table_name = c.relname
762                                         AND tp.grantee = current_user))
763
764           AND c.relkind = 'v';
765
766 GRANT SELECT ON views TO PUBLIC;