gooderp18绿色标准版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3011 lines
110KB

  1. /*
  2. * SQL Information Schema
  3. * as defined in ISO/IEC 9075-11:2016
  4. *
  5. * Copyright (c) 2003-2019, PostgreSQL Global Development Group
  6. *
  7. * src/backend/catalog/information_schema.sql
  8. *
  9. * Note: this file is read in single-user -j mode, which means that the
  10. * command terminator is semicolon-newline-newline; whenever the backend
  11. * sees that, it stops and executes what it's got. If you write a lot of
  12. * statements without empty lines between, they'll all get quoted to you
  13. * in any error message about one of them, so don't do that. Also, you
  14. * cannot write a semicolon immediately followed by an empty line in a
  15. * string literal (including a function body!) or a multiline comment.
  16. */
  17. /*
  18. * Note: Generally, the definitions in this file should be ordered
  19. * according to the clause numbers in the SQL standard, which is also the
  20. * alphabetical order. In some cases it is convenient or necessary to
  21. * define one information schema view by using another one; in that case,
  22. * put the referencing view at the very end and leave a note where it
  23. * should have been put.
  24. */
  25. /*
  26. * 5.1
  27. * INFORMATION_SCHEMA schema
  28. */
  29. CREATE SCHEMA information_schema;
  30. GRANT USAGE ON SCHEMA information_schema TO PUBLIC;
  31. SET search_path TO information_schema;
  32. /*
  33. * A few supporting functions first ...
  34. */
  35. /* Expand any 1-D array into a set with integers 1..N */
  36. CREATE FUNCTION _pg_expandarray(IN anyarray, OUT x anyelement, OUT n int)
  37. RETURNS SETOF RECORD
  38. LANGUAGE sql STRICT IMMUTABLE PARALLEL SAFE
  39. AS 'select $1[s], s - pg_catalog.array_lower($1,1) + 1
  40. from pg_catalog.generate_series(pg_catalog.array_lower($1,1),
  41. pg_catalog.array_upper($1,1),
  42. 1) as g(s)';
  43. CREATE FUNCTION _pg_keysequal(smallint[], smallint[]) RETURNS boolean
  44. LANGUAGE sql IMMUTABLE PARALLEL SAFE -- intentionally not STRICT, to allow inlining
  45. AS 'select $1 operator(pg_catalog.<@) $2 and $2 operator(pg_catalog.<@) $1';
  46. /* Given an index's OID and an underlying-table column number, return the
  47. * column's position in the index (NULL if not there) */
  48. CREATE FUNCTION _pg_index_position(oid, smallint) RETURNS int
  49. LANGUAGE sql STRICT STABLE
  50. AS $$
  51. SELECT (ss.a).n FROM
  52. (SELECT information_schema._pg_expandarray(indkey) AS a
  53. FROM pg_catalog.pg_index WHERE indexrelid = $1) ss
  54. WHERE (ss.a).x = $2;
  55. $$;
  56. CREATE FUNCTION _pg_truetypid(pg_attribute, pg_type) RETURNS oid
  57. LANGUAGE sql
  58. IMMUTABLE
  59. PARALLEL SAFE
  60. RETURNS NULL ON NULL INPUT
  61. AS
  62. $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typbasetype ELSE $1.atttypid END$$;
  63. CREATE FUNCTION _pg_truetypmod(pg_attribute, pg_type) RETURNS int4
  64. LANGUAGE sql
  65. IMMUTABLE
  66. PARALLEL SAFE
  67. RETURNS NULL ON NULL INPUT
  68. AS
  69. $$SELECT CASE WHEN $2.typtype = 'd' THEN $2.typtypmod ELSE $1.atttypmod END$$;
  70. -- these functions encapsulate knowledge about the encoding of typmod:
  71. CREATE FUNCTION _pg_char_max_length(typid oid, typmod int4) RETURNS integer
  72. LANGUAGE sql
  73. IMMUTABLE
  74. PARALLEL SAFE
  75. RETURNS NULL ON NULL INPUT
  76. AS
  77. $$SELECT
  78. CASE WHEN $2 = -1 /* default typmod */
  79. THEN null
  80. WHEN $1 IN (1042, 1043) /* char, varchar */
  81. THEN $2 - 4
  82. WHEN $1 IN (1560, 1562) /* bit, varbit */
  83. THEN $2
  84. ELSE null
  85. END$$;
  86. CREATE FUNCTION _pg_char_octet_length(typid oid, typmod int4) RETURNS integer
  87. LANGUAGE sql
  88. IMMUTABLE
  89. PARALLEL SAFE
  90. RETURNS NULL ON NULL INPUT
  91. AS
  92. $$SELECT
  93. CASE WHEN $1 IN (25, 1042, 1043) /* text, char, varchar */
  94. THEN CASE WHEN $2 = -1 /* default typmod */
  95. THEN CAST(2^30 AS integer)
  96. ELSE information_schema._pg_char_max_length($1, $2) *
  97. pg_catalog.pg_encoding_max_length((SELECT encoding FROM pg_catalog.pg_database WHERE datname = pg_catalog.current_database()))
  98. END
  99. ELSE null
  100. END$$;
  101. CREATE FUNCTION _pg_numeric_precision(typid oid, typmod int4) RETURNS integer
  102. LANGUAGE sql
  103. IMMUTABLE
  104. PARALLEL SAFE
  105. RETURNS NULL ON NULL INPUT
  106. AS
  107. $$SELECT
  108. CASE $1
  109. WHEN 21 /*int2*/ THEN 16
  110. WHEN 23 /*int4*/ THEN 32
  111. WHEN 20 /*int8*/ THEN 64
  112. WHEN 1700 /*numeric*/ THEN
  113. CASE WHEN $2 = -1
  114. THEN null
  115. ELSE (($2 - 4) >> 16) & 65535
  116. END
  117. WHEN 700 /*float4*/ THEN 24 /*FLT_MANT_DIG*/
  118. WHEN 701 /*float8*/ THEN 53 /*DBL_MANT_DIG*/
  119. ELSE null
  120. END$$;
  121. CREATE FUNCTION _pg_numeric_precision_radix(typid oid, typmod int4) RETURNS integer
  122. LANGUAGE sql
  123. IMMUTABLE
  124. PARALLEL SAFE
  125. RETURNS NULL ON NULL INPUT
  126. AS
  127. $$SELECT
  128. CASE WHEN $1 IN (21, 23, 20, 700, 701) THEN 2
  129. WHEN $1 IN (1700) THEN 10
  130. ELSE null
  131. END$$;
  132. CREATE FUNCTION _pg_numeric_scale(typid oid, typmod int4) RETURNS integer
  133. LANGUAGE sql
  134. IMMUTABLE
  135. PARALLEL SAFE
  136. RETURNS NULL ON NULL INPUT
  137. AS
  138. $$SELECT
  139. CASE WHEN $1 IN (21, 23, 20) THEN 0
  140. WHEN $1 IN (1700) THEN
  141. CASE WHEN $2 = -1
  142. THEN null
  143. ELSE ($2 - 4) & 65535
  144. END
  145. ELSE null
  146. END$$;
  147. CREATE FUNCTION _pg_datetime_precision(typid oid, typmod int4) RETURNS integer
  148. LANGUAGE sql
  149. IMMUTABLE
  150. PARALLEL SAFE
  151. RETURNS NULL ON NULL INPUT
  152. AS
  153. $$SELECT
  154. CASE WHEN $1 IN (1082) /* date */
  155. THEN 0
  156. WHEN $1 IN (1083, 1114, 1184, 1266) /* time, timestamp, same + tz */
  157. THEN CASE WHEN $2 < 0 THEN 6 ELSE $2 END
  158. WHEN $1 IN (1186) /* interval */
  159. THEN CASE WHEN $2 < 0 OR $2 & 65535 = 65535 THEN 6 ELSE $2 & 65535 END
  160. ELSE null
  161. END$$;
  162. CREATE FUNCTION _pg_interval_type(typid oid, mod int4) RETURNS text
  163. LANGUAGE sql
  164. IMMUTABLE
  165. PARALLEL SAFE
  166. RETURNS NULL ON NULL INPUT
  167. AS
  168. $$SELECT
  169. CASE WHEN $1 IN (1186) /* interval */
  170. THEN pg_catalog.upper(substring(pg_catalog.format_type($1, $2) from 'interval[()0-9]* #"%#"' for '#'))
  171. ELSE null
  172. END$$;
  173. -- 5.2 INFORMATION_SCHEMA_CATALOG_NAME view appears later.
  174. /*
  175. * 5.3
  176. * CARDINAL_NUMBER domain
  177. */
  178. CREATE DOMAIN cardinal_number AS integer
  179. CONSTRAINT cardinal_number_domain_check CHECK (value >= 0);
  180. /*
  181. * 5.4
  182. * CHARACTER_DATA domain
  183. */
  184. CREATE DOMAIN character_data AS character varying COLLATE "C";
  185. /*
  186. * 5.5
  187. * SQL_IDENTIFIER domain
  188. */
  189. CREATE DOMAIN sql_identifier AS name;
  190. /*
  191. * 5.2
  192. * INFORMATION_SCHEMA_CATALOG_NAME view
  193. */
  194. CREATE VIEW information_schema_catalog_name AS
  195. SELECT CAST(current_database() AS sql_identifier) AS catalog_name;
  196. GRANT SELECT ON information_schema_catalog_name TO PUBLIC;
  197. /*
  198. * 5.6
  199. * TIME_STAMP domain
  200. */
  201. CREATE DOMAIN time_stamp AS timestamp(2) with time zone
  202. DEFAULT current_timestamp(2);
  203. /*
  204. * 5.7
  205. * YES_OR_NO domain
  206. */
  207. CREATE DOMAIN yes_or_no AS character varying(3) COLLATE "C"
  208. CONSTRAINT yes_or_no_check CHECK (value IN ('YES', 'NO'));
  209. -- 5.8 ADMINISTRABLE_ROLE_AUTHORIZATIONS view appears later.
  210. /*
  211. * 5.9
  212. * APPLICABLE_ROLES view
  213. */
  214. CREATE VIEW applicable_roles AS
  215. SELECT CAST(a.rolname AS sql_identifier) AS grantee,
  216. CAST(b.rolname AS sql_identifier) AS role_name,
  217. CAST(CASE WHEN m.admin_option THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
  218. FROM pg_auth_members m
  219. JOIN pg_authid a ON (m.member = a.oid)
  220. JOIN pg_authid b ON (m.roleid = b.oid)
  221. WHERE pg_has_role(a.oid, 'USAGE');
  222. GRANT SELECT ON applicable_roles TO PUBLIC;
  223. /*
  224. * 5.8
  225. * ADMINISTRABLE_ROLE_AUTHORIZATIONS view
  226. */
  227. CREATE VIEW administrable_role_authorizations AS
  228. SELECT *
  229. FROM applicable_roles
  230. WHERE is_grantable = 'YES';
  231. GRANT SELECT ON administrable_role_authorizations TO PUBLIC;
  232. /*
  233. * 5.10
  234. * ASSERTIONS view
  235. */
  236. -- feature not supported
  237. /*
  238. * 5.11
  239. * ATTRIBUTES view
  240. */
  241. CREATE VIEW attributes AS
  242. SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
  243. CAST(nc.nspname AS sql_identifier) AS udt_schema,
  244. CAST(c.relname AS sql_identifier) AS udt_name,
  245. CAST(a.attname AS sql_identifier) AS attribute_name,
  246. CAST(a.attnum AS cardinal_number) AS ordinal_position,
  247. CAST(pg_get_expr(ad.adbin, ad.adrelid) AS character_data) AS attribute_default,
  248. CAST(CASE WHEN a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) THEN 'NO' ELSE 'YES' END
  249. AS yes_or_no)
  250. AS is_nullable, -- This column was apparently removed between SQL:2003 and SQL:2008.
  251. CAST(
  252. CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
  253. WHEN nt.nspname = 'pg_catalog' THEN format_type(a.atttypid, null)
  254. ELSE 'USER-DEFINED' END
  255. AS character_data)
  256. AS data_type,
  257. CAST(
  258. _pg_char_max_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  259. AS cardinal_number)
  260. AS character_maximum_length,
  261. CAST(
  262. _pg_char_octet_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  263. AS cardinal_number)
  264. AS character_octet_length,
  265. CAST(null AS sql_identifier) AS character_set_catalog,
  266. CAST(null AS sql_identifier) AS character_set_schema,
  267. CAST(null AS sql_identifier) AS character_set_name,
  268. CAST(CASE WHEN nco.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS collation_catalog,
  269. CAST(nco.nspname AS sql_identifier) AS collation_schema,
  270. CAST(co.collname AS sql_identifier) AS collation_name,
  271. CAST(
  272. _pg_numeric_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  273. AS cardinal_number)
  274. AS numeric_precision,
  275. CAST(
  276. _pg_numeric_precision_radix(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  277. AS cardinal_number)
  278. AS numeric_precision_radix,
  279. CAST(
  280. _pg_numeric_scale(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  281. AS cardinal_number)
  282. AS numeric_scale,
  283. CAST(
  284. _pg_datetime_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  285. AS cardinal_number)
  286. AS datetime_precision,
  287. CAST(
  288. _pg_interval_type(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  289. AS character_data)
  290. AS interval_type,
  291. CAST(null AS cardinal_number) AS interval_precision,
  292. CAST(current_database() AS sql_identifier) AS attribute_udt_catalog,
  293. CAST(nt.nspname AS sql_identifier) AS attribute_udt_schema,
  294. CAST(t.typname AS sql_identifier) AS attribute_udt_name,
  295. CAST(null AS sql_identifier) AS scope_catalog,
  296. CAST(null AS sql_identifier) AS scope_schema,
  297. CAST(null AS sql_identifier) AS scope_name,
  298. CAST(null AS cardinal_number) AS maximum_cardinality,
  299. CAST(a.attnum AS sql_identifier) AS dtd_identifier,
  300. CAST('NO' AS yes_or_no) AS is_derived_reference_attribute
  301. FROM (pg_attribute a LEFT JOIN pg_attrdef ad ON attrelid = adrelid AND attnum = adnum)
  302. JOIN (pg_class c JOIN pg_namespace nc ON (c.relnamespace = nc.oid)) ON a.attrelid = c.oid
  303. JOIN (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid)) ON a.atttypid = t.oid
  304. LEFT JOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid))
  305. ON a.attcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
  306. WHERE a.attnum > 0 AND NOT a.attisdropped
  307. AND c.relkind IN ('c')
  308. AND (pg_has_role(c.relowner, 'USAGE')
  309. OR has_type_privilege(c.reltype, 'USAGE'));
  310. GRANT SELECT ON attributes TO PUBLIC;
  311. /*
  312. * 5.12
  313. * CHARACTER_SETS view
  314. */
  315. CREATE VIEW character_sets AS
  316. SELECT CAST(null AS sql_identifier) AS character_set_catalog,
  317. CAST(null AS sql_identifier) AS character_set_schema,
  318. CAST(getdatabaseencoding() AS sql_identifier) AS character_set_name,
  319. CAST(CASE WHEN getdatabaseencoding() = 'UTF8' THEN 'UCS' ELSE getdatabaseencoding() END AS sql_identifier) AS character_repertoire,
  320. CAST(getdatabaseencoding() AS sql_identifier) AS form_of_use,
  321. CAST(current_database() AS sql_identifier) AS default_collate_catalog,
  322. CAST(nc.nspname AS sql_identifier) AS default_collate_schema,
  323. CAST(c.collname AS sql_identifier) AS default_collate_name
  324. FROM pg_database d
  325. LEFT JOIN (pg_collation c JOIN pg_namespace nc ON (c.collnamespace = nc.oid))
  326. ON (datcollate = collcollate AND datctype = collctype)
  327. WHERE d.datname = current_database()
  328. ORDER BY char_length(c.collname) DESC, c.collname ASC -- prefer full/canonical name
  329. LIMIT 1;
  330. GRANT SELECT ON character_sets TO PUBLIC;
  331. /*
  332. * 5.13
  333. * CHECK_CONSTRAINT_ROUTINE_USAGE view
  334. */
  335. CREATE VIEW check_constraint_routine_usage AS
  336. SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
  337. CAST(nc.nspname AS sql_identifier) AS constraint_schema,
  338. CAST(c.conname AS sql_identifier) AS constraint_name,
  339. CAST(current_database() AS sql_identifier) AS specific_catalog,
  340. CAST(np.nspname AS sql_identifier) AS specific_schema,
  341. CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name
  342. FROM pg_namespace nc, pg_constraint c, pg_depend d, pg_proc p, pg_namespace np
  343. WHERE nc.oid = c.connamespace
  344. AND c.contype = 'c'
  345. AND c.oid = d.objid
  346. AND d.classid = 'pg_catalog.pg_constraint'::regclass
  347. AND d.refobjid = p.oid
  348. AND d.refclassid = 'pg_catalog.pg_proc'::regclass
  349. AND p.pronamespace = np.oid
  350. AND pg_has_role(p.proowner, 'USAGE');
  351. GRANT SELECT ON check_constraint_routine_usage TO PUBLIC;
  352. /*
  353. * 5.14
  354. * CHECK_CONSTRAINTS view
  355. */
  356. CREATE VIEW check_constraints AS
  357. SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
  358. CAST(rs.nspname AS sql_identifier) AS constraint_schema,
  359. CAST(con.conname AS sql_identifier) AS constraint_name,
  360. CAST(substring(pg_get_constraintdef(con.oid) from 7) AS character_data)
  361. AS check_clause
  362. FROM pg_constraint con
  363. LEFT OUTER JOIN pg_namespace rs ON (rs.oid = con.connamespace)
  364. LEFT OUTER JOIN pg_class c ON (c.oid = con.conrelid)
  365. LEFT OUTER JOIN pg_type t ON (t.oid = con.contypid)
  366. WHERE pg_has_role(coalesce(c.relowner, t.typowner), 'USAGE')
  367. AND con.contype = 'c'
  368. UNION
  369. -- not-null constraints
  370. SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
  371. CAST(n.nspname AS sql_identifier) AS constraint_schema,
  372. CAST(CAST(n.oid AS text) || '_' || CAST(r.oid AS text) || '_' || CAST(a.attnum AS text) || '_not_null' AS sql_identifier) AS constraint_name, -- XXX
  373. CAST(a.attname || ' IS NOT NULL' AS character_data)
  374. AS check_clause
  375. FROM pg_namespace n, pg_class r, pg_attribute a
  376. WHERE n.oid = r.relnamespace
  377. AND r.oid = a.attrelid
  378. AND a.attnum > 0
  379. AND NOT a.attisdropped
  380. AND a.attnotnull
  381. AND r.relkind IN ('r', 'p')
  382. AND pg_has_role(r.relowner, 'USAGE');
  383. GRANT SELECT ON check_constraints TO PUBLIC;
  384. /*
  385. * 5.15
  386. * COLLATIONS view
  387. */
  388. CREATE VIEW collations AS
  389. SELECT CAST(current_database() AS sql_identifier) AS collation_catalog,
  390. CAST(nc.nspname AS sql_identifier) AS collation_schema,
  391. CAST(c.collname AS sql_identifier) AS collation_name,
  392. CAST('NO PAD' AS character_data) AS pad_attribute
  393. FROM pg_collation c, pg_namespace nc
  394. WHERE c.collnamespace = nc.oid
  395. AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()));
  396. GRANT SELECT ON collations TO PUBLIC;
  397. /*
  398. * 5.16
  399. * COLLATION_CHARACTER_SET_APPLICABILITY view
  400. */
  401. CREATE VIEW collation_character_set_applicability AS
  402. SELECT CAST(current_database() AS sql_identifier) AS collation_catalog,
  403. CAST(nc.nspname AS sql_identifier) AS collation_schema,
  404. CAST(c.collname AS sql_identifier) AS collation_name,
  405. CAST(null AS sql_identifier) AS character_set_catalog,
  406. CAST(null AS sql_identifier) AS character_set_schema,
  407. CAST(getdatabaseencoding() AS sql_identifier) AS character_set_name
  408. FROM pg_collation c, pg_namespace nc
  409. WHERE c.collnamespace = nc.oid
  410. AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()));
  411. GRANT SELECT ON collation_character_set_applicability TO PUBLIC;
  412. /*
  413. * 5.17
  414. * COLUMN_COLUMN_USAGE view
  415. */
  416. CREATE VIEW column_column_usage AS
  417. SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
  418. CAST(n.nspname AS sql_identifier) AS table_schema,
  419. CAST(c.relname AS sql_identifier) AS table_name,
  420. CAST(ac.attname AS sql_identifier) AS column_name,
  421. CAST(ad.attname AS sql_identifier) AS dependent_column
  422. FROM pg_namespace n, pg_class c, pg_depend d,
  423. pg_attribute ac, pg_attribute ad
  424. WHERE n.oid = c.relnamespace
  425. AND c.oid = ac.attrelid
  426. AND c.oid = ad.attrelid
  427. AND d.classid = 'pg_catalog.pg_class'::regclass
  428. AND d.refclassid = 'pg_catalog.pg_class'::regclass
  429. AND d.objid = d.refobjid
  430. AND c.oid = d.objid
  431. AND d.objsubid = ad.attnum
  432. AND d.refobjsubid = ac.attnum
  433. AND ad.attgenerated <> ''
  434. AND pg_has_role(c.relowner, 'USAGE');
  435. GRANT SELECT ON column_column_usage TO PUBLIC;
  436. /*
  437. * 5.18
  438. * COLUMN_DOMAIN_USAGE view
  439. */
  440. CREATE VIEW column_domain_usage AS
  441. SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
  442. CAST(nt.nspname AS sql_identifier) AS domain_schema,
  443. CAST(t.typname AS sql_identifier) AS domain_name,
  444. CAST(current_database() AS sql_identifier) AS table_catalog,
  445. CAST(nc.nspname AS sql_identifier) AS table_schema,
  446. CAST(c.relname AS sql_identifier) AS table_name,
  447. CAST(a.attname AS sql_identifier) AS column_name
  448. FROM pg_type t, pg_namespace nt, pg_class c, pg_namespace nc,
  449. pg_attribute a
  450. WHERE t.typnamespace = nt.oid
  451. AND c.relnamespace = nc.oid
  452. AND a.attrelid = c.oid
  453. AND a.atttypid = t.oid
  454. AND t.typtype = 'd'
  455. AND c.relkind IN ('r', 'v', 'f', 'p')
  456. AND a.attnum > 0
  457. AND NOT a.attisdropped
  458. AND pg_has_role(t.typowner, 'USAGE');
  459. GRANT SELECT ON column_domain_usage TO PUBLIC;
  460. /*
  461. * 5.19
  462. * COLUMN_PRIVILEGES
  463. */
  464. CREATE VIEW column_privileges AS
  465. SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
  466. CAST(grantee.rolname AS sql_identifier) AS grantee,
  467. CAST(current_database() AS sql_identifier) AS table_catalog,
  468. CAST(nc.nspname AS sql_identifier) AS table_schema,
  469. CAST(x.relname AS sql_identifier) AS table_name,
  470. CAST(x.attname AS sql_identifier) AS column_name,
  471. CAST(x.prtype AS character_data) AS privilege_type,
  472. CAST(
  473. CASE WHEN
  474. -- object owner always has grant options
  475. pg_has_role(x.grantee, x.relowner, 'USAGE')
  476. OR x.grantable
  477. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
  478. FROM (
  479. SELECT pr_c.grantor,
  480. pr_c.grantee,
  481. attname,
  482. relname,
  483. relnamespace,
  484. pr_c.prtype,
  485. pr_c.grantable,
  486. pr_c.relowner
  487. FROM (SELECT oid, relname, relnamespace, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).*
  488. FROM pg_class
  489. WHERE relkind IN ('r', 'v', 'f', 'p')
  490. ) pr_c (oid, relname, relnamespace, relowner, grantor, grantee, prtype, grantable),
  491. pg_attribute a
  492. WHERE a.attrelid = pr_c.oid
  493. AND a.attnum > 0
  494. AND NOT a.attisdropped
  495. UNION
  496. SELECT pr_a.grantor,
  497. pr_a.grantee,
  498. attname,
  499. relname,
  500. relnamespace,
  501. pr_a.prtype,
  502. pr_a.grantable,
  503. c.relowner
  504. FROM (SELECT attrelid, attname, (aclexplode(coalesce(attacl, acldefault('c', relowner)))).*
  505. FROM pg_attribute a JOIN pg_class cc ON (a.attrelid = cc.oid)
  506. WHERE attnum > 0
  507. AND NOT attisdropped
  508. ) pr_a (attrelid, attname, grantor, grantee, prtype, grantable),
  509. pg_class c
  510. WHERE pr_a.attrelid = c.oid
  511. AND relkind IN ('r', 'v', 'f', 'p')
  512. ) x,
  513. pg_namespace nc,
  514. pg_authid u_grantor,
  515. (
  516. SELECT oid, rolname FROM pg_authid
  517. UNION ALL
  518. SELECT 0::oid, 'PUBLIC'
  519. ) AS grantee (oid, rolname)
  520. WHERE x.relnamespace = nc.oid
  521. AND x.grantee = grantee.oid
  522. AND x.grantor = u_grantor.oid
  523. AND x.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'REFERENCES')
  524. AND (pg_has_role(u_grantor.oid, 'USAGE')
  525. OR pg_has_role(grantee.oid, 'USAGE')
  526. OR grantee.rolname = 'PUBLIC');
  527. GRANT SELECT ON column_privileges TO PUBLIC;
  528. /*
  529. * 5.20
  530. * COLUMN_UDT_USAGE view
  531. */
  532. CREATE VIEW column_udt_usage AS
  533. SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
  534. CAST(coalesce(nbt.nspname, nt.nspname) AS sql_identifier) AS udt_schema,
  535. CAST(coalesce(bt.typname, t.typname) AS sql_identifier) AS udt_name,
  536. CAST(current_database() AS sql_identifier) AS table_catalog,
  537. CAST(nc.nspname AS sql_identifier) AS table_schema,
  538. CAST(c.relname AS sql_identifier) AS table_name,
  539. CAST(a.attname AS sql_identifier) AS column_name
  540. FROM pg_attribute a, pg_class c, pg_namespace nc,
  541. (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid))
  542. LEFT JOIN (pg_type bt JOIN pg_namespace nbt ON (bt.typnamespace = nbt.oid))
  543. ON (t.typtype = 'd' AND t.typbasetype = bt.oid)
  544. WHERE a.attrelid = c.oid
  545. AND a.atttypid = t.oid
  546. AND nc.oid = c.relnamespace
  547. AND a.attnum > 0 AND NOT a.attisdropped
  548. AND c.relkind in ('r', 'v', 'f', 'p')
  549. AND pg_has_role(coalesce(bt.typowner, t.typowner), 'USAGE');
  550. GRANT SELECT ON column_udt_usage TO PUBLIC;
  551. /*
  552. * 5.21
  553. * COLUMNS view
  554. */
  555. CREATE VIEW columns AS
  556. SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
  557. CAST(nc.nspname AS sql_identifier) AS table_schema,
  558. CAST(c.relname AS sql_identifier) AS table_name,
  559. CAST(a.attname AS sql_identifier) AS column_name,
  560. CAST(a.attnum AS cardinal_number) AS ordinal_position,
  561. CAST(CASE WHEN a.attgenerated = '' THEN pg_get_expr(ad.adbin, ad.adrelid) END AS character_data) AS column_default,
  562. CAST(CASE WHEN a.attnotnull OR (t.typtype = 'd' AND t.typnotnull) THEN 'NO' ELSE 'YES' END
  563. AS yes_or_no)
  564. AS is_nullable,
  565. CAST(
  566. CASE WHEN t.typtype = 'd' THEN
  567. CASE WHEN bt.typelem <> 0 AND bt.typlen = -1 THEN 'ARRAY'
  568. WHEN nbt.nspname = 'pg_catalog' THEN format_type(t.typbasetype, null)
  569. ELSE 'USER-DEFINED' END
  570. ELSE
  571. CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
  572. WHEN nt.nspname = 'pg_catalog' THEN format_type(a.atttypid, null)
  573. ELSE 'USER-DEFINED' END
  574. END
  575. AS character_data)
  576. AS data_type,
  577. CAST(
  578. _pg_char_max_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  579. AS cardinal_number)
  580. AS character_maximum_length,
  581. CAST(
  582. _pg_char_octet_length(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  583. AS cardinal_number)
  584. AS character_octet_length,
  585. CAST(
  586. _pg_numeric_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  587. AS cardinal_number)
  588. AS numeric_precision,
  589. CAST(
  590. _pg_numeric_precision_radix(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  591. AS cardinal_number)
  592. AS numeric_precision_radix,
  593. CAST(
  594. _pg_numeric_scale(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  595. AS cardinal_number)
  596. AS numeric_scale,
  597. CAST(
  598. _pg_datetime_precision(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  599. AS cardinal_number)
  600. AS datetime_precision,
  601. CAST(
  602. _pg_interval_type(_pg_truetypid(a, t), _pg_truetypmod(a, t))
  603. AS character_data)
  604. AS interval_type,
  605. CAST(null AS cardinal_number) AS interval_precision,
  606. CAST(null AS sql_identifier) AS character_set_catalog,
  607. CAST(null AS sql_identifier) AS character_set_schema,
  608. CAST(null AS sql_identifier) AS character_set_name,
  609. CAST(CASE WHEN nco.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS collation_catalog,
  610. CAST(nco.nspname AS sql_identifier) AS collation_schema,
  611. CAST(co.collname AS sql_identifier) AS collation_name,
  612. CAST(CASE WHEN t.typtype = 'd' THEN current_database() ELSE null END
  613. AS sql_identifier) AS domain_catalog,
  614. CAST(CASE WHEN t.typtype = 'd' THEN nt.nspname ELSE null END
  615. AS sql_identifier) AS domain_schema,
  616. CAST(CASE WHEN t.typtype = 'd' THEN t.typname ELSE null END
  617. AS sql_identifier) AS domain_name,
  618. CAST(current_database() AS sql_identifier) AS udt_catalog,
  619. CAST(coalesce(nbt.nspname, nt.nspname) AS sql_identifier) AS udt_schema,
  620. CAST(coalesce(bt.typname, t.typname) AS sql_identifier) AS udt_name,
  621. CAST(null AS sql_identifier) AS scope_catalog,
  622. CAST(null AS sql_identifier) AS scope_schema,
  623. CAST(null AS sql_identifier) AS scope_name,
  624. CAST(null AS cardinal_number) AS maximum_cardinality,
  625. CAST(a.attnum AS sql_identifier) AS dtd_identifier,
  626. CAST('NO' AS yes_or_no) AS is_self_referencing,
  627. CAST(CASE WHEN a.attidentity IN ('a', 'd') THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_identity,
  628. CAST(CASE a.attidentity WHEN 'a' THEN 'ALWAYS' WHEN 'd' THEN 'BY DEFAULT' END AS character_data) AS identity_generation,
  629. CAST(seq.seqstart AS character_data) AS identity_start,
  630. CAST(seq.seqincrement AS character_data) AS identity_increment,
  631. CAST(seq.seqmax AS character_data) AS identity_maximum,
  632. CAST(seq.seqmin AS character_data) AS identity_minimum,
  633. CAST(CASE WHEN seq.seqcycle THEN 'YES' ELSE 'NO' END AS yes_or_no) AS identity_cycle,
  634. CAST(CASE WHEN a.attgenerated <> '' THEN 'ALWAYS' ELSE 'NEVER' END AS character_data) AS is_generated,
  635. CAST(CASE WHEN a.attgenerated <> '' THEN pg_get_expr(ad.adbin, ad.adrelid) END AS character_data) AS generation_expression,
  636. CAST(CASE WHEN c.relkind IN ('r', 'p') OR
  637. (c.relkind IN ('v', 'f') AND
  638. pg_column_is_updatable(c.oid, a.attnum, false))
  639. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_updatable
  640. FROM (pg_attribute a LEFT JOIN pg_attrdef ad ON attrelid = adrelid AND attnum = adnum)
  641. JOIN (pg_class c JOIN pg_namespace nc ON (c.relnamespace = nc.oid)) ON a.attrelid = c.oid
  642. JOIN (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid)) ON a.atttypid = t.oid
  643. LEFT JOIN (pg_type bt JOIN pg_namespace nbt ON (bt.typnamespace = nbt.oid))
  644. ON (t.typtype = 'd' AND t.typbasetype = bt.oid)
  645. LEFT JOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid))
  646. ON a.attcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
  647. LEFT JOIN (pg_depend dep JOIN pg_sequence seq ON (dep.classid = 'pg_class'::regclass AND dep.objid = seq.seqrelid AND dep.deptype = 'i'))
  648. ON (dep.refclassid = 'pg_class'::regclass AND dep.refobjid = c.oid AND dep.refobjsubid = a.attnum)
  649. WHERE (NOT pg_is_other_temp_schema(nc.oid))
  650. AND a.attnum > 0 AND NOT a.attisdropped
  651. AND c.relkind IN ('r', 'v', 'f', 'p')
  652. AND (pg_has_role(c.relowner, 'USAGE')
  653. OR has_column_privilege(c.oid, a.attnum,
  654. 'SELECT, INSERT, UPDATE, REFERENCES'));
  655. GRANT SELECT ON columns TO PUBLIC;
  656. /*
  657. * 5.22
  658. * CONSTRAINT_COLUMN_USAGE view
  659. */
  660. CREATE VIEW constraint_column_usage AS
  661. SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
  662. CAST(tblschema AS sql_identifier) AS table_schema,
  663. CAST(tblname AS sql_identifier) AS table_name,
  664. CAST(colname AS sql_identifier) AS column_name,
  665. CAST(current_database() AS sql_identifier) AS constraint_catalog,
  666. CAST(cstrschema AS sql_identifier) AS constraint_schema,
  667. CAST(cstrname AS sql_identifier) AS constraint_name
  668. FROM (
  669. /* check constraints */
  670. SELECT DISTINCT nr.nspname, r.relname, r.relowner, a.attname, nc.nspname, c.conname
  671. FROM pg_namespace nr, pg_class r, pg_attribute a, pg_depend d, pg_namespace nc, pg_constraint c
  672. WHERE nr.oid = r.relnamespace
  673. AND r.oid = a.attrelid
  674. AND d.refclassid = 'pg_catalog.pg_class'::regclass
  675. AND d.refobjid = r.oid
  676. AND d.refobjsubid = a.attnum
  677. AND d.classid = 'pg_catalog.pg_constraint'::regclass
  678. AND d.objid = c.oid
  679. AND c.connamespace = nc.oid
  680. AND c.contype = 'c'
  681. AND r.relkind IN ('r', 'p')
  682. AND NOT a.attisdropped
  683. UNION ALL
  684. /* unique/primary key/foreign key constraints */
  685. SELECT nr.nspname, r.relname, r.relowner, a.attname, nc.nspname, c.conname
  686. FROM pg_namespace nr, pg_class r, pg_attribute a, pg_namespace nc,
  687. pg_constraint c
  688. WHERE nr.oid = r.relnamespace
  689. AND r.oid = a.attrelid
  690. AND nc.oid = c.connamespace
  691. AND r.oid = CASE c.contype WHEN 'f' THEN c.confrelid ELSE c.conrelid END
  692. AND a.attnum = ANY (CASE c.contype WHEN 'f' THEN c.confkey ELSE c.conkey END)
  693. AND NOT a.attisdropped
  694. AND c.contype IN ('p', 'u', 'f')
  695. AND r.relkind IN ('r', 'p')
  696. ) AS x (tblschema, tblname, tblowner, colname, cstrschema, cstrname)
  697. WHERE pg_has_role(x.tblowner, 'USAGE');
  698. GRANT SELECT ON constraint_column_usage TO PUBLIC;
  699. /*
  700. * 5.23
  701. * CONSTRAINT_PERIOD_USAGE view
  702. */
  703. -- feature not supported
  704. /*
  705. * 5.24
  706. * CONSTRAINT_TABLE_USAGE view
  707. */
  708. CREATE VIEW constraint_table_usage AS
  709. SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
  710. CAST(nr.nspname AS sql_identifier) AS table_schema,
  711. CAST(r.relname AS sql_identifier) AS table_name,
  712. CAST(current_database() AS sql_identifier) AS constraint_catalog,
  713. CAST(nc.nspname AS sql_identifier) AS constraint_schema,
  714. CAST(c.conname AS sql_identifier) AS constraint_name
  715. FROM pg_constraint c, pg_namespace nc,
  716. pg_class r, pg_namespace nr
  717. WHERE c.connamespace = nc.oid AND r.relnamespace = nr.oid
  718. AND ( (c.contype = 'f' AND c.confrelid = r.oid)
  719. OR (c.contype IN ('p', 'u') AND c.conrelid = r.oid) )
  720. AND r.relkind IN ('r', 'p')
  721. AND pg_has_role(r.relowner, 'USAGE');
  722. GRANT SELECT ON constraint_table_usage TO PUBLIC;
  723. -- 5.25 DATA_TYPE_PRIVILEGES view appears later.
  724. /*
  725. * 5.26
  726. * DIRECT_SUPERTABLES view
  727. */
  728. -- feature not supported
  729. /*
  730. * 5.27
  731. * DIRECT_SUPERTYPES view
  732. */
  733. -- feature not supported
  734. /*
  735. * 5.28
  736. * DOMAIN_CONSTRAINTS view
  737. */
  738. CREATE VIEW domain_constraints AS
  739. SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
  740. CAST(rs.nspname AS sql_identifier) AS constraint_schema,
  741. CAST(con.conname AS sql_identifier) AS constraint_name,
  742. CAST(current_database() AS sql_identifier) AS domain_catalog,
  743. CAST(n.nspname AS sql_identifier) AS domain_schema,
  744. CAST(t.typname AS sql_identifier) AS domain_name,
  745. CAST(CASE WHEN condeferrable THEN 'YES' ELSE 'NO' END
  746. AS yes_or_no) AS is_deferrable,
  747. CAST(CASE WHEN condeferred THEN 'YES' ELSE 'NO' END
  748. AS yes_or_no) AS initially_deferred
  749. FROM pg_namespace rs, pg_namespace n, pg_constraint con, pg_type t
  750. WHERE rs.oid = con.connamespace
  751. AND n.oid = t.typnamespace
  752. AND t.oid = con.contypid
  753. AND (pg_has_role(t.typowner, 'USAGE')
  754. OR has_type_privilege(t.oid, 'USAGE'));
  755. GRANT SELECT ON domain_constraints TO PUBLIC;
  756. /*
  757. * DOMAIN_UDT_USAGE view
  758. * apparently removed in SQL:2003
  759. */
  760. CREATE VIEW domain_udt_usage AS
  761. SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
  762. CAST(nbt.nspname AS sql_identifier) AS udt_schema,
  763. CAST(bt.typname AS sql_identifier) AS udt_name,
  764. CAST(current_database() AS sql_identifier) AS domain_catalog,
  765. CAST(nt.nspname AS sql_identifier) AS domain_schema,
  766. CAST(t.typname AS sql_identifier) AS domain_name
  767. FROM pg_type t, pg_namespace nt,
  768. pg_type bt, pg_namespace nbt
  769. WHERE t.typnamespace = nt.oid
  770. AND t.typbasetype = bt.oid
  771. AND bt.typnamespace = nbt.oid
  772. AND t.typtype = 'd'
  773. AND pg_has_role(bt.typowner, 'USAGE');
  774. GRANT SELECT ON domain_udt_usage TO PUBLIC;
  775. /*
  776. * 5.29
  777. * DOMAINS view
  778. */
  779. CREATE VIEW domains AS
  780. SELECT CAST(current_database() AS sql_identifier) AS domain_catalog,
  781. CAST(nt.nspname AS sql_identifier) AS domain_schema,
  782. CAST(t.typname AS sql_identifier) AS domain_name,
  783. CAST(
  784. CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
  785. WHEN nbt.nspname = 'pg_catalog' THEN format_type(t.typbasetype, null)
  786. ELSE 'USER-DEFINED' END
  787. AS character_data)
  788. AS data_type,
  789. CAST(
  790. _pg_char_max_length(t.typbasetype, t.typtypmod)
  791. AS cardinal_number)
  792. AS character_maximum_length,
  793. CAST(
  794. _pg_char_octet_length(t.typbasetype, t.typtypmod)
  795. AS cardinal_number)
  796. AS character_octet_length,
  797. CAST(null AS sql_identifier) AS character_set_catalog,
  798. CAST(null AS sql_identifier) AS character_set_schema,
  799. CAST(null AS sql_identifier) AS character_set_name,
  800. CAST(CASE WHEN nco.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS collation_catalog,
  801. CAST(nco.nspname AS sql_identifier) AS collation_schema,
  802. CAST(co.collname AS sql_identifier) AS collation_name,
  803. CAST(
  804. _pg_numeric_precision(t.typbasetype, t.typtypmod)
  805. AS cardinal_number)
  806. AS numeric_precision,
  807. CAST(
  808. _pg_numeric_precision_radix(t.typbasetype, t.typtypmod)
  809. AS cardinal_number)
  810. AS numeric_precision_radix,
  811. CAST(
  812. _pg_numeric_scale(t.typbasetype, t.typtypmod)
  813. AS cardinal_number)
  814. AS numeric_scale,
  815. CAST(
  816. _pg_datetime_precision(t.typbasetype, t.typtypmod)
  817. AS cardinal_number)
  818. AS datetime_precision,
  819. CAST(
  820. _pg_interval_type(t.typbasetype, t.typtypmod)
  821. AS character_data)
  822. AS interval_type,
  823. CAST(null AS cardinal_number) AS interval_precision,
  824. CAST(t.typdefault AS character_data) AS domain_default,
  825. CAST(current_database() AS sql_identifier) AS udt_catalog,
  826. CAST(nbt.nspname AS sql_identifier) AS udt_schema,
  827. CAST(bt.typname AS sql_identifier) AS udt_name,
  828. CAST(null AS sql_identifier) AS scope_catalog,
  829. CAST(null AS sql_identifier) AS scope_schema,
  830. CAST(null AS sql_identifier) AS scope_name,
  831. CAST(null AS cardinal_number) AS maximum_cardinality,
  832. CAST(1 AS sql_identifier) AS dtd_identifier
  833. FROM (pg_type t JOIN pg_namespace nt ON t.typnamespace = nt.oid)
  834. JOIN (pg_type bt JOIN pg_namespace nbt ON bt.typnamespace = nbt.oid)
  835. ON (t.typbasetype = bt.oid AND t.typtype = 'd')
  836. LEFT JOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid))
  837. ON t.typcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
  838. WHERE (pg_has_role(t.typowner, 'USAGE')
  839. OR has_type_privilege(t.oid, 'USAGE'));
  840. GRANT SELECT ON domains TO PUBLIC;
  841. -- 5.30 ELEMENT_TYPES view appears later.
  842. /*
  843. * 5.31
  844. * ENABLED_ROLES view
  845. */
  846. CREATE VIEW enabled_roles AS
  847. SELECT CAST(a.rolname AS sql_identifier) AS role_name
  848. FROM pg_authid a
  849. WHERE pg_has_role(a.oid, 'USAGE');
  850. GRANT SELECT ON enabled_roles TO PUBLIC;
  851. /*
  852. * 5.32
  853. * FIELDS view
  854. */
  855. -- feature not supported
  856. /*
  857. * 5.33
  858. * KEY_COLUMN_USAGE view
  859. */
  860. CREATE VIEW key_column_usage AS
  861. SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
  862. CAST(nc_nspname AS sql_identifier) AS constraint_schema,
  863. CAST(conname AS sql_identifier) AS constraint_name,
  864. CAST(current_database() AS sql_identifier) AS table_catalog,
  865. CAST(nr_nspname AS sql_identifier) AS table_schema,
  866. CAST(relname AS sql_identifier) AS table_name,
  867. CAST(a.attname AS sql_identifier) AS column_name,
  868. CAST((ss.x).n AS cardinal_number) AS ordinal_position,
  869. CAST(CASE WHEN contype = 'f' THEN
  870. _pg_index_position(ss.conindid, ss.confkey[(ss.x).n])
  871. ELSE NULL
  872. END AS cardinal_number)
  873. AS position_in_unique_constraint
  874. FROM pg_attribute a,
  875. (SELECT r.oid AS roid, r.relname, r.relowner,
  876. nc.nspname AS nc_nspname, nr.nspname AS nr_nspname,
  877. c.oid AS coid, c.conname, c.contype, c.conindid,
  878. c.confkey, c.confrelid,
  879. _pg_expandarray(c.conkey) AS x
  880. FROM pg_namespace nr, pg_class r, pg_namespace nc,
  881. pg_constraint c
  882. WHERE nr.oid = r.relnamespace
  883. AND r.oid = c.conrelid
  884. AND nc.oid = c.connamespace
  885. AND c.contype IN ('p', 'u', 'f')
  886. AND r.relkind IN ('r', 'p')
  887. AND (NOT pg_is_other_temp_schema(nr.oid)) ) AS ss
  888. WHERE ss.roid = a.attrelid
  889. AND a.attnum = (ss.x).x
  890. AND NOT a.attisdropped
  891. AND (pg_has_role(relowner, 'USAGE')
  892. OR has_column_privilege(roid, a.attnum,
  893. 'SELECT, INSERT, UPDATE, REFERENCES'));
  894. GRANT SELECT ON key_column_usage TO PUBLIC;
  895. /*
  896. * 5.34
  897. * KEY_PERIOD_USAGE view
  898. */
  899. -- feature not supported
  900. /*
  901. * 5.35
  902. * METHOD_SPECIFICATION_PARAMETERS view
  903. */
  904. -- feature not supported
  905. /*
  906. * 5.36
  907. * METHOD_SPECIFICATIONS view
  908. */
  909. -- feature not supported
  910. /*
  911. * 5.37
  912. * PARAMETERS view
  913. */
  914. CREATE VIEW parameters AS
  915. SELECT CAST(current_database() AS sql_identifier) AS specific_catalog,
  916. CAST(n_nspname AS sql_identifier) AS specific_schema,
  917. CAST(nameconcatoid(proname, p_oid) AS sql_identifier) AS specific_name,
  918. CAST((ss.x).n AS cardinal_number) AS ordinal_position,
  919. CAST(
  920. CASE WHEN proargmodes IS NULL THEN 'IN'
  921. WHEN proargmodes[(ss.x).n] = 'i' THEN 'IN'
  922. WHEN proargmodes[(ss.x).n] = 'o' THEN 'OUT'
  923. WHEN proargmodes[(ss.x).n] = 'b' THEN 'INOUT'
  924. WHEN proargmodes[(ss.x).n] = 'v' THEN 'IN'
  925. WHEN proargmodes[(ss.x).n] = 't' THEN 'OUT'
  926. END AS character_data) AS parameter_mode,
  927. CAST('NO' AS yes_or_no) AS is_result,
  928. CAST('NO' AS yes_or_no) AS as_locator,
  929. CAST(NULLIF(proargnames[(ss.x).n], '') AS sql_identifier) AS parameter_name,
  930. CAST(
  931. CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
  932. WHEN nt.nspname = 'pg_catalog' THEN format_type(t.oid, null)
  933. ELSE 'USER-DEFINED' END AS character_data)
  934. AS data_type,
  935. CAST(null AS cardinal_number) AS character_maximum_length,
  936. CAST(null AS cardinal_number) AS character_octet_length,
  937. CAST(null AS sql_identifier) AS character_set_catalog,
  938. CAST(null AS sql_identifier) AS character_set_schema,
  939. CAST(null AS sql_identifier) AS character_set_name,
  940. CAST(null AS sql_identifier) AS collation_catalog,
  941. CAST(null AS sql_identifier) AS collation_schema,
  942. CAST(null AS sql_identifier) AS collation_name,
  943. CAST(null AS cardinal_number) AS numeric_precision,
  944. CAST(null AS cardinal_number) AS numeric_precision_radix,
  945. CAST(null AS cardinal_number) AS numeric_scale,
  946. CAST(null AS cardinal_number) AS datetime_precision,
  947. CAST(null AS character_data) AS interval_type,
  948. CAST(null AS cardinal_number) AS interval_precision,
  949. CAST(current_database() AS sql_identifier) AS udt_catalog,
  950. CAST(nt.nspname AS sql_identifier) AS udt_schema,
  951. CAST(t.typname AS sql_identifier) AS udt_name,
  952. CAST(null AS sql_identifier) AS scope_catalog,
  953. CAST(null AS sql_identifier) AS scope_schema,
  954. CAST(null AS sql_identifier) AS scope_name,
  955. CAST(null AS cardinal_number) AS maximum_cardinality,
  956. CAST((ss.x).n AS sql_identifier) AS dtd_identifier,
  957. CAST(
  958. CASE WHEN pg_has_role(proowner, 'USAGE')
  959. THEN pg_get_function_arg_default(p_oid, (ss.x).n)
  960. ELSE NULL END
  961. AS character_data) AS parameter_default
  962. FROM pg_type t, pg_namespace nt,
  963. (SELECT n.nspname AS n_nspname, p.proname, p.oid AS p_oid, p.proowner,
  964. p.proargnames, p.proargmodes,
  965. _pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
  966. FROM pg_namespace n, pg_proc p
  967. WHERE n.oid = p.pronamespace
  968. AND (pg_has_role(p.proowner, 'USAGE') OR
  969. has_function_privilege(p.oid, 'EXECUTE'))) AS ss
  970. WHERE t.oid = (ss.x).x AND t.typnamespace = nt.oid;
  971. GRANT SELECT ON parameters TO PUBLIC;
  972. /*
  973. * 5.38
  974. * PERIODS view
  975. */
  976. -- feature not supported
  977. /*
  978. * 5.39
  979. * PRIVATE_PARAMETERS view
  980. */
  981. -- feature not supported
  982. /*
  983. * 5.40
  984. * REFERENCED_TYPES view
  985. */
  986. -- feature not supported
  987. /*
  988. * 5.41
  989. * REFERENTIAL_CONSTRAINTS view
  990. */
  991. CREATE VIEW referential_constraints AS
  992. SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
  993. CAST(ncon.nspname AS sql_identifier) AS constraint_schema,
  994. CAST(con.conname AS sql_identifier) AS constraint_name,
  995. CAST(
  996. CASE WHEN npkc.nspname IS NULL THEN NULL
  997. ELSE current_database() END
  998. AS sql_identifier) AS unique_constraint_catalog,
  999. CAST(npkc.nspname AS sql_identifier) AS unique_constraint_schema,
  1000. CAST(pkc.conname AS sql_identifier) AS unique_constraint_name,
  1001. CAST(
  1002. CASE con.confmatchtype WHEN 'f' THEN 'FULL'
  1003. WHEN 'p' THEN 'PARTIAL'
  1004. WHEN 's' THEN 'NONE' END
  1005. AS character_data) AS match_option,
  1006. CAST(
  1007. CASE con.confupdtype WHEN 'c' THEN 'CASCADE'
  1008. WHEN 'n' THEN 'SET NULL'
  1009. WHEN 'd' THEN 'SET DEFAULT'
  1010. WHEN 'r' THEN 'RESTRICT'
  1011. WHEN 'a' THEN 'NO ACTION' END
  1012. AS character_data) AS update_rule,
  1013. CAST(
  1014. CASE con.confdeltype WHEN 'c' THEN 'CASCADE'
  1015. WHEN 'n' THEN 'SET NULL'
  1016. WHEN 'd' THEN 'SET DEFAULT'
  1017. WHEN 'r' THEN 'RESTRICT'
  1018. WHEN 'a' THEN 'NO ACTION' END
  1019. AS character_data) AS delete_rule
  1020. FROM (pg_namespace ncon
  1021. INNER JOIN pg_constraint con ON ncon.oid = con.connamespace
  1022. INNER JOIN pg_class c ON con.conrelid = c.oid AND con.contype = 'f')
  1023. LEFT JOIN pg_depend d1 -- find constraint's dependency on an index
  1024. ON d1.objid = con.oid AND d1.classid = 'pg_constraint'::regclass
  1025. AND d1.refclassid = 'pg_class'::regclass AND d1.refobjsubid = 0
  1026. LEFT JOIN pg_depend d2 -- find pkey/unique constraint for that index
  1027. ON d2.refclassid = 'pg_constraint'::regclass
  1028. AND d2.classid = 'pg_class'::regclass
  1029. AND d2.objid = d1.refobjid AND d2.objsubid = 0
  1030. AND d2.deptype = 'i'
  1031. LEFT JOIN pg_constraint pkc ON pkc.oid = d2.refobjid
  1032. AND pkc.contype IN ('p', 'u')
  1033. AND pkc.conrelid = con.confrelid
  1034. LEFT JOIN pg_namespace npkc ON pkc.connamespace = npkc.oid
  1035. WHERE pg_has_role(c.relowner, 'USAGE')
  1036. -- SELECT privilege omitted, per SQL standard
  1037. OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
  1038. OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') ;
  1039. GRANT SELECT ON referential_constraints TO PUBLIC;
  1040. /*
  1041. * 5.42
  1042. * ROLE_COLUMN_GRANTS view
  1043. */
  1044. CREATE VIEW role_column_grants AS
  1045. SELECT grantor,
  1046. grantee,
  1047. table_catalog,
  1048. table_schema,
  1049. table_name,
  1050. column_name,
  1051. privilege_type,
  1052. is_grantable
  1053. FROM column_privileges
  1054. WHERE grantor IN (SELECT role_name FROM enabled_roles)
  1055. OR grantee IN (SELECT role_name FROM enabled_roles);
  1056. GRANT SELECT ON role_column_grants TO PUBLIC;
  1057. -- 5.43 ROLE_ROUTINE_GRANTS view is based on 5.50 ROUTINE_PRIVILEGES and is defined there instead.
  1058. -- 5.44 ROLE_TABLE_GRANTS view is based on 5.63 TABLE_PRIVILEGES and is defined there instead.
  1059. /*
  1060. * 5.45
  1061. * ROLE_TABLE_METHOD_GRANTS view
  1062. */
  1063. -- feature not supported
  1064. -- 5.46 ROLE_USAGE_GRANTS view is based on 5.75 USAGE_PRIVILEGES and is defined there instead.
  1065. -- 5.47 ROLE_UDT_GRANTS view is based on 5.74 UDT_PRIVILEGES and is defined there instead.
  1066. /*
  1067. * 5.48
  1068. * ROUTINE_COLUMN_USAGE view
  1069. */
  1070. -- not tracked by PostgreSQL
  1071. /*
  1072. * 5.49
  1073. * ROUTINE_PERIOD_USAGE view
  1074. */
  1075. -- feature not supported
  1076. /*
  1077. * 5.50
  1078. * ROUTINE_PRIVILEGES view
  1079. */
  1080. CREATE VIEW routine_privileges AS
  1081. SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
  1082. CAST(grantee.rolname AS sql_identifier) AS grantee,
  1083. CAST(current_database() AS sql_identifier) AS specific_catalog,
  1084. CAST(n.nspname AS sql_identifier) AS specific_schema,
  1085. CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
  1086. CAST(current_database() AS sql_identifier) AS routine_catalog,
  1087. CAST(n.nspname AS sql_identifier) AS routine_schema,
  1088. CAST(p.proname AS sql_identifier) AS routine_name,
  1089. CAST('EXECUTE' AS character_data) AS privilege_type,
  1090. CAST(
  1091. CASE WHEN
  1092. -- object owner always has grant options
  1093. pg_has_role(grantee.oid, p.proowner, 'USAGE')
  1094. OR p.grantable
  1095. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
  1096. FROM (
  1097. SELECT oid, proname, proowner, pronamespace, (aclexplode(coalesce(proacl, acldefault('f', proowner)))).* FROM pg_proc
  1098. ) p (oid, proname, proowner, pronamespace, grantor, grantee, prtype, grantable),
  1099. pg_namespace n,
  1100. pg_authid u_grantor,
  1101. (
  1102. SELECT oid, rolname FROM pg_authid
  1103. UNION ALL
  1104. SELECT 0::oid, 'PUBLIC'
  1105. ) AS grantee (oid, rolname)
  1106. WHERE p.pronamespace = n.oid
  1107. AND grantee.oid = p.grantee
  1108. AND u_grantor.oid = p.grantor
  1109. AND p.prtype IN ('EXECUTE')
  1110. AND (pg_has_role(u_grantor.oid, 'USAGE')
  1111. OR pg_has_role(grantee.oid, 'USAGE')
  1112. OR grantee.rolname = 'PUBLIC');
  1113. GRANT SELECT ON routine_privileges TO PUBLIC;
  1114. /*
  1115. * 5.42
  1116. * ROLE_ROUTINE_GRANTS view
  1117. */
  1118. CREATE VIEW role_routine_grants AS
  1119. SELECT grantor,
  1120. grantee,
  1121. specific_catalog,
  1122. specific_schema,
  1123. specific_name,
  1124. routine_catalog,
  1125. routine_schema,
  1126. routine_name,
  1127. privilege_type,
  1128. is_grantable
  1129. FROM routine_privileges
  1130. WHERE grantor IN (SELECT role_name FROM enabled_roles)
  1131. OR grantee IN (SELECT role_name FROM enabled_roles);
  1132. GRANT SELECT ON role_routine_grants TO PUBLIC;
  1133. /*
  1134. * 5.51
  1135. * ROUTINE_ROUTINE_USAGE view
  1136. */
  1137. -- not tracked by PostgreSQL
  1138. /*
  1139. * 5.52
  1140. * ROUTINE_SEQUENCE_USAGE view
  1141. */
  1142. -- not tracked by PostgreSQL
  1143. /*
  1144. * 5.53
  1145. * ROUTINE_TABLE_USAGE view
  1146. */
  1147. -- not tracked by PostgreSQL
  1148. /*
  1149. * 5.54
  1150. * ROUTINES view
  1151. */
  1152. CREATE VIEW routines AS
  1153. SELECT CAST(current_database() AS sql_identifier) AS specific_catalog,
  1154. CAST(n.nspname AS sql_identifier) AS specific_schema,
  1155. CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
  1156. CAST(current_database() AS sql_identifier) AS routine_catalog,
  1157. CAST(n.nspname AS sql_identifier) AS routine_schema,
  1158. CAST(p.proname AS sql_identifier) AS routine_name,
  1159. CAST(CASE p.prokind WHEN 'f' THEN 'FUNCTION' WHEN 'p' THEN 'PROCEDURE' END
  1160. AS character_data) AS routine_type,
  1161. CAST(null AS sql_identifier) AS module_catalog,
  1162. CAST(null AS sql_identifier) AS module_schema,
  1163. CAST(null AS sql_identifier) AS module_name,
  1164. CAST(null AS sql_identifier) AS udt_catalog,
  1165. CAST(null AS sql_identifier) AS udt_schema,
  1166. CAST(null AS sql_identifier) AS udt_name,
  1167. CAST(
  1168. CASE WHEN p.prokind = 'p' THEN NULL
  1169. WHEN t.typelem <> 0 AND t.typlen = -1 THEN 'ARRAY'
  1170. WHEN nt.nspname = 'pg_catalog' THEN format_type(t.oid, null)
  1171. ELSE 'USER-DEFINED' END AS character_data)
  1172. AS data_type,
  1173. CAST(null AS cardinal_number) AS character_maximum_length,
  1174. CAST(null AS cardinal_number) AS character_octet_length,
  1175. CAST(null AS sql_identifier) AS character_set_catalog,
  1176. CAST(null AS sql_identifier) AS character_set_schema,
  1177. CAST(null AS sql_identifier) AS character_set_name,
  1178. CAST(null AS sql_identifier) AS collation_catalog,
  1179. CAST(null AS sql_identifier) AS collation_schema,
  1180. CAST(null AS sql_identifier) AS collation_name,
  1181. CAST(null AS cardinal_number) AS numeric_precision,
  1182. CAST(null AS cardinal_number) AS numeric_precision_radix,
  1183. CAST(null AS cardinal_number) AS numeric_scale,
  1184. CAST(null AS cardinal_number) AS datetime_precision,
  1185. CAST(null AS character_data) AS interval_type,
  1186. CAST(null AS cardinal_number) AS interval_precision,
  1187. CAST(CASE WHEN nt.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS type_udt_catalog,
  1188. CAST(nt.nspname AS sql_identifier) AS type_udt_schema,
  1189. CAST(t.typname AS sql_identifier) AS type_udt_name,
  1190. CAST(null AS sql_identifier) AS scope_catalog,
  1191. CAST(null AS sql_identifier) AS scope_schema,
  1192. CAST(null AS sql_identifier) AS scope_name,
  1193. CAST(null AS cardinal_number) AS maximum_cardinality,
  1194. CAST(CASE WHEN p.prokind <> 'p' THEN 0 END AS sql_identifier) AS dtd_identifier,
  1195. CAST(CASE WHEN l.lanname = 'sql' THEN 'SQL' ELSE 'EXTERNAL' END AS character_data)
  1196. AS routine_body,
  1197. CAST(
  1198. CASE WHEN pg_has_role(p.proowner, 'USAGE') THEN p.prosrc ELSE null END
  1199. AS character_data) AS routine_definition,
  1200. CAST(
  1201. CASE WHEN l.lanname = 'c' THEN p.prosrc ELSE null END
  1202. AS character_data) AS external_name,
  1203. CAST(upper(l.lanname) AS character_data) AS external_language,
  1204. CAST('GENERAL' AS character_data) AS parameter_style,
  1205. CAST(CASE WHEN p.provolatile = 'i' THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_deterministic,
  1206. CAST('MODIFIES' AS character_data) AS sql_data_access,
  1207. CAST(CASE WHEN p.prokind <> 'p' THEN
  1208. CASE WHEN p.proisstrict THEN 'YES' ELSE 'NO' END END AS yes_or_no) AS is_null_call,
  1209. CAST(null AS character_data) AS sql_path,
  1210. CAST('YES' AS yes_or_no) AS schema_level_routine,
  1211. CAST(0 AS cardinal_number) AS max_dynamic_result_sets,
  1212. CAST(null AS yes_or_no) AS is_user_defined_cast,
  1213. CAST(null AS yes_or_no) AS is_implicitly_invocable,
  1214. CAST(CASE WHEN p.prosecdef THEN 'DEFINER' ELSE 'INVOKER' END AS character_data) AS security_type,
  1215. CAST(null AS sql_identifier) AS to_sql_specific_catalog,
  1216. CAST(null AS sql_identifier) AS to_sql_specific_schema,
  1217. CAST(null AS sql_identifier) AS to_sql_specific_name,
  1218. CAST('NO' AS yes_or_no) AS as_locator,
  1219. CAST(null AS time_stamp) AS created,
  1220. CAST(null AS time_stamp) AS last_altered,
  1221. CAST(null AS yes_or_no) AS new_savepoint_level,
  1222. CAST('NO' AS yes_or_no) AS is_udt_dependent,
  1223. CAST(null AS character_data) AS result_cast_from_data_type,
  1224. CAST(null AS yes_or_no) AS result_cast_as_locator,
  1225. CAST(null AS cardinal_number) AS result_cast_char_max_length,
  1226. CAST(null AS cardinal_number) AS result_cast_char_octet_length,
  1227. CAST(null AS sql_identifier) AS result_cast_char_set_catalog,
  1228. CAST(null AS sql_identifier) AS result_cast_char_set_schema,
  1229. CAST(null AS sql_identifier) AS result_cast_char_set_name,
  1230. CAST(null AS sql_identifier) AS result_cast_collation_catalog,
  1231. CAST(null AS sql_identifier) AS result_cast_collation_schema,
  1232. CAST(null AS sql_identifier) AS result_cast_collation_name,
  1233. CAST(null AS cardinal_number) AS result_cast_numeric_precision,
  1234. CAST(null AS cardinal_number) AS result_cast_numeric_precision_radix,
  1235. CAST(null AS cardinal_number) AS result_cast_numeric_scale,
  1236. CAST(null AS cardinal_number) AS result_cast_datetime_precision,
  1237. CAST(null AS character_data) AS result_cast_interval_type,
  1238. CAST(null AS cardinal_number) AS result_cast_interval_precision,
  1239. CAST(null AS sql_identifier) AS result_cast_type_udt_catalog,
  1240. CAST(null AS sql_identifier) AS result_cast_type_udt_schema,
  1241. CAST(null AS sql_identifier) AS result_cast_type_udt_name,
  1242. CAST(null AS sql_identifier) AS result_cast_scope_catalog,
  1243. CAST(null AS sql_identifier) AS result_cast_scope_schema,
  1244. CAST(null AS sql_identifier) AS result_cast_scope_name,
  1245. CAST(null AS cardinal_number) AS result_cast_maximum_cardinality,
  1246. CAST(null AS sql_identifier) AS result_cast_dtd_identifier
  1247. FROM (pg_namespace n
  1248. JOIN pg_proc p ON n.oid = p.pronamespace
  1249. JOIN pg_language l ON p.prolang = l.oid)
  1250. LEFT JOIN
  1251. (pg_type t JOIN pg_namespace nt ON t.typnamespace = nt.oid)
  1252. ON p.prorettype = t.oid AND p.prokind <> 'p'
  1253. WHERE (pg_has_role(p.proowner, 'USAGE')
  1254. OR has_function_privilege(p.oid, 'EXECUTE'));
  1255. GRANT SELECT ON routines TO PUBLIC;
  1256. /*
  1257. * 5.55
  1258. * SCHEMATA view
  1259. */
  1260. CREATE VIEW schemata AS
  1261. SELECT CAST(current_database() AS sql_identifier) AS catalog_name,
  1262. CAST(n.nspname AS sql_identifier) AS schema_name,
  1263. CAST(u.rolname AS sql_identifier) AS schema_owner,
  1264. CAST(null AS sql_identifier) AS default_character_set_catalog,
  1265. CAST(null AS sql_identifier) AS default_character_set_schema,
  1266. CAST(null AS sql_identifier) AS default_character_set_name,
  1267. CAST(null AS character_data) AS sql_path
  1268. FROM pg_namespace n, pg_authid u
  1269. WHERE n.nspowner = u.oid
  1270. AND (pg_has_role(n.nspowner, 'USAGE')
  1271. OR has_schema_privilege(n.oid, 'CREATE, USAGE'));
  1272. GRANT SELECT ON schemata TO PUBLIC;
  1273. /*
  1274. * 5.56
  1275. * SEQUENCES view
  1276. */
  1277. CREATE VIEW sequences AS
  1278. SELECT CAST(current_database() AS sql_identifier) AS sequence_catalog,
  1279. CAST(nc.nspname AS sql_identifier) AS sequence_schema,
  1280. CAST(c.relname AS sql_identifier) AS sequence_name,
  1281. CAST(format_type(s.seqtypid, null) AS character_data) AS data_type,
  1282. CAST(_pg_numeric_precision(s.seqtypid, -1) AS cardinal_number) AS numeric_precision,
  1283. CAST(2 AS cardinal_number) AS numeric_precision_radix,
  1284. CAST(0 AS cardinal_number) AS numeric_scale,
  1285. CAST(s.seqstart AS character_data) AS start_value,
  1286. CAST(s.seqmin AS character_data) AS minimum_value,
  1287. CAST(s.seqmax AS character_data) AS maximum_value,
  1288. CAST(s.seqincrement AS character_data) AS increment,
  1289. CAST(CASE WHEN s.seqcycle THEN 'YES' ELSE 'NO' END AS yes_or_no) AS cycle_option
  1290. FROM pg_namespace nc, pg_class c, pg_sequence s
  1291. WHERE c.relnamespace = nc.oid
  1292. AND c.relkind = 'S'
  1293. AND NOT EXISTS (SELECT 1 FROM pg_depend WHERE classid = 'pg_class'::regclass AND objid = c.oid AND deptype = 'i')
  1294. AND (NOT pg_is_other_temp_schema(nc.oid))
  1295. AND c.oid = s.seqrelid
  1296. AND (pg_has_role(c.relowner, 'USAGE')
  1297. OR has_sequence_privilege(c.oid, 'SELECT, UPDATE, USAGE') );
  1298. GRANT SELECT ON sequences TO PUBLIC;
  1299. /*
  1300. * 5.57
  1301. * SQL_FEATURES table
  1302. */
  1303. CREATE TABLE sql_features (
  1304. feature_id character_data,
  1305. feature_name character_data,
  1306. sub_feature_id character_data,
  1307. sub_feature_name character_data,
  1308. is_supported yes_or_no,
  1309. is_verified_by character_data,
  1310. comments character_data
  1311. );
  1312. -- Will be filled with external data by initdb.
  1313. GRANT SELECT ON sql_features TO PUBLIC;
  1314. /*
  1315. * 5.58
  1316. * SQL_IMPLEMENTATION_INFO table
  1317. */
  1318. -- Note: Implementation information items are defined in ISO/IEC 9075-3:2008,
  1319. -- clause 9.1.
  1320. CREATE TABLE sql_implementation_info (
  1321. implementation_info_id character_data,
  1322. implementation_info_name character_data,
  1323. integer_value cardinal_number,
  1324. character_value character_data,
  1325. comments character_data
  1326. );
  1327. INSERT INTO sql_implementation_info VALUES ('10003', 'CATALOG NAME', NULL, 'Y', NULL);
  1328. INSERT INTO sql_implementation_info VALUES ('10004', 'COLLATING SEQUENCE', NULL, (SELECT default_collate_name FROM character_sets), NULL);
  1329. INSERT INTO sql_implementation_info VALUES ('23', 'CURSOR COMMIT BEHAVIOR', 1, NULL, 'close cursors and retain prepared statements');
  1330. INSERT INTO sql_implementation_info VALUES ('2', 'DATA SOURCE NAME', NULL, '', NULL);
  1331. INSERT INTO sql_implementation_info VALUES ('17', 'DBMS NAME', NULL, (select trim(trailing ' ' from substring(version() from '^[^0-9]*'))), NULL);
  1332. INSERT INTO sql_implementation_info VALUES ('18', 'DBMS VERSION', NULL, '???', NULL); -- filled by initdb
  1333. INSERT INTO sql_implementation_info VALUES ('26', 'DEFAULT TRANSACTION ISOLATION', 2, NULL, 'READ COMMITTED; user-settable');
  1334. INSERT INTO sql_implementation_info VALUES ('28', 'IDENTIFIER CASE', 3, NULL, 'stored in mixed case - case sensitive');
  1335. INSERT INTO sql_implementation_info VALUES ('85', 'NULL COLLATION', 0, NULL, 'nulls higher than non-nulls');
  1336. INSERT INTO sql_implementation_info VALUES ('13', 'SERVER NAME', NULL, '', NULL);
  1337. INSERT INTO sql_implementation_info VALUES ('94', 'SPECIAL CHARACTERS', NULL, '', 'all non-ASCII characters allowed');
  1338. INSERT INTO sql_implementation_info VALUES ('46', 'TRANSACTION CAPABLE', 2, NULL, 'both DML and DDL');
  1339. GRANT SELECT ON sql_implementation_info TO PUBLIC;
  1340. /*
  1341. * SQL_LANGUAGES table
  1342. * apparently removed in SQL:2008
  1343. */
  1344. CREATE TABLE sql_languages (
  1345. sql_language_source character_data,
  1346. sql_language_year character_data,
  1347. sql_language_conformance character_data,
  1348. sql_language_integrity character_data,
  1349. sql_language_implementation character_data,
  1350. sql_language_binding_style character_data,
  1351. sql_language_programming_language character_data
  1352. );
  1353. INSERT INTO sql_languages VALUES ('ISO 9075', '1999', 'CORE', NULL, NULL, 'DIRECT', NULL);
  1354. INSERT INTO sql_languages VALUES ('ISO 9075', '1999', 'CORE', NULL, NULL, 'EMBEDDED', 'C');
  1355. INSERT INTO sql_languages VALUES ('ISO 9075', '2003', 'CORE', NULL, NULL, 'DIRECT', NULL);
  1356. INSERT INTO sql_languages VALUES ('ISO 9075', '2003', 'CORE', NULL, NULL, 'EMBEDDED', 'C');
  1357. GRANT SELECT ON sql_languages TO PUBLIC;
  1358. /*
  1359. * SQL_PACKAGES table
  1360. * removed in SQL:2011
  1361. */
  1362. CREATE TABLE sql_packages (
  1363. feature_id character_data,
  1364. feature_name character_data,
  1365. is_supported yes_or_no,
  1366. is_verified_by character_data,
  1367. comments character_data
  1368. );
  1369. INSERT INTO sql_packages VALUES ('PKG000', 'Core', 'NO', NULL, '');
  1370. INSERT INTO sql_packages VALUES ('PKG001', 'Enhanced datetime facilities', 'YES', NULL, '');
  1371. INSERT INTO sql_packages VALUES ('PKG002', 'Enhanced integrity management', 'NO', NULL, '');
  1372. INSERT INTO sql_packages VALUES ('PKG003', 'OLAP facilities', 'NO', NULL, '');
  1373. INSERT INTO sql_packages VALUES ('PKG004', 'PSM', 'NO', NULL, 'PL/pgSQL is similar.');
  1374. INSERT INTO sql_packages VALUES ('PKG005', 'CLI', 'NO', NULL, 'ODBC is similar.');
  1375. INSERT INTO sql_packages VALUES ('PKG006', 'Basic object support', 'NO', NULL, '');
  1376. INSERT INTO sql_packages VALUES ('PKG007', 'Enhanced object support', 'NO', NULL, '');
  1377. INSERT INTO sql_packages VALUES ('PKG008', 'Active database', 'NO', NULL, '');
  1378. INSERT INTO sql_packages VALUES ('PKG010', 'OLAP', 'NO', NULL, 'NO');
  1379. GRANT SELECT ON sql_packages TO PUBLIC;
  1380. /*
  1381. * 5.59
  1382. * SQL_PARTS table
  1383. */
  1384. CREATE TABLE sql_parts (
  1385. feature_id character_data,
  1386. feature_name character_data,
  1387. is_supported yes_or_no,
  1388. is_verified_by character_data,
  1389. comments character_data
  1390. );
  1391. INSERT INTO sql_parts VALUES ('1', 'Framework (SQL/Framework)', 'NO', NULL, '');
  1392. INSERT INTO sql_parts VALUES ('2', 'Foundation (SQL/Foundation)', 'NO', NULL, '');
  1393. INSERT INTO sql_parts VALUES ('3', 'Call-Level Interface (SQL/CLI)', 'NO', NULL, '');
  1394. INSERT INTO sql_parts VALUES ('4', 'Persistent Stored Modules (SQL/PSM)', 'NO', NULL, '');
  1395. INSERT INTO sql_parts VALUES ('9', 'Management of External Data (SQL/MED)', 'NO', NULL, '');
  1396. INSERT INTO sql_parts VALUES ('10', 'Object Language Bindings (SQL/OLB)', 'NO', NULL, '');
  1397. INSERT INTO sql_parts VALUES ('11', 'Information and Definition Schema (SQL/Schemata)', 'NO', NULL, '');
  1398. INSERT INTO sql_parts VALUES ('13', 'Routines and Types Using the Java Programming Language (SQL/JRT)', 'NO', NULL, '');
  1399. INSERT INTO sql_parts VALUES ('14', 'XML-Related Specifications (SQL/XML)', 'NO', NULL, '');
  1400. /*
  1401. * 5.60
  1402. * SQL_SIZING table
  1403. */
  1404. -- Note: Sizing items are defined in ISO/IEC 9075-3:2008, clause 9.2.
  1405. CREATE TABLE sql_sizing (
  1406. sizing_id cardinal_number,
  1407. sizing_name character_data,
  1408. supported_value cardinal_number,
  1409. comments character_data
  1410. );
  1411. INSERT INTO sql_sizing VALUES (34, 'MAXIMUM CATALOG NAME LENGTH', 63, NULL);
  1412. INSERT INTO sql_sizing VALUES (30, 'MAXIMUM COLUMN NAME LENGTH', 63, NULL);
  1413. INSERT INTO sql_sizing VALUES (97, 'MAXIMUM COLUMNS IN GROUP BY', 0, NULL);
  1414. INSERT INTO sql_sizing VALUES (99, 'MAXIMUM COLUMNS IN ORDER BY', 0, NULL);
  1415. INSERT INTO sql_sizing VALUES (100, 'MAXIMUM COLUMNS IN SELECT', 1664, NULL); -- match MaxTupleAttributeNumber
  1416. INSERT INTO sql_sizing VALUES (101, 'MAXIMUM COLUMNS IN TABLE', 1600, NULL); -- match MaxHeapAttributeNumber
  1417. INSERT INTO sql_sizing VALUES (1, 'MAXIMUM CONCURRENT ACTIVITIES', 0, NULL);
  1418. INSERT INTO sql_sizing VALUES (31, 'MAXIMUM CURSOR NAME LENGTH', 63, NULL);
  1419. INSERT INTO sql_sizing VALUES (0, 'MAXIMUM DRIVER CONNECTIONS', NULL, NULL);
  1420. INSERT INTO sql_sizing VALUES (10005, 'MAXIMUM IDENTIFIER LENGTH', 63, NULL);
  1421. INSERT INTO sql_sizing VALUES (32, 'MAXIMUM SCHEMA NAME LENGTH', 63, NULL);
  1422. INSERT INTO sql_sizing VALUES (20000, 'MAXIMUM STATEMENT OCTETS', 0, NULL);
  1423. INSERT INTO sql_sizing VALUES (20001, 'MAXIMUM STATEMENT OCTETS DATA', 0, NULL);
  1424. INSERT INTO sql_sizing VALUES (20002, 'MAXIMUM STATEMENT OCTETS SCHEMA', 0, NULL);
  1425. INSERT INTO sql_sizing VALUES (35, 'MAXIMUM TABLE NAME LENGTH', 63, NULL);
  1426. INSERT INTO sql_sizing VALUES (106, 'MAXIMUM TABLES IN SELECT', 0, NULL);
  1427. INSERT INTO sql_sizing VALUES (107, 'MAXIMUM USER NAME LENGTH', 63, NULL);
  1428. INSERT INTO sql_sizing VALUES (25000, 'MAXIMUM CURRENT DEFAULT TRANSFORM GROUP LENGTH', NULL, NULL);
  1429. INSERT INTO sql_sizing VALUES (25001, 'MAXIMUM CURRENT TRANSFORM GROUP LENGTH', NULL, NULL);
  1430. INSERT INTO sql_sizing VALUES (25002, 'MAXIMUM CURRENT PATH LENGTH', 0, NULL);
  1431. INSERT INTO sql_sizing VALUES (25003, 'MAXIMUM CURRENT ROLE LENGTH', NULL, NULL);
  1432. INSERT INTO sql_sizing VALUES (25004, 'MAXIMUM SESSION USER LENGTH', 63, NULL);
  1433. INSERT INTO sql_sizing VALUES (25005, 'MAXIMUM SYSTEM USER LENGTH', 63, NULL);
  1434. UPDATE sql_sizing
  1435. SET supported_value = (SELECT typlen-1 FROM pg_catalog.pg_type WHERE typname = 'name'),
  1436. comments = 'Might be less, depending on character set.'
  1437. WHERE supported_value = 63;
  1438. GRANT SELECT ON sql_sizing TO PUBLIC;
  1439. /*
  1440. * SQL_SIZING_PROFILES table
  1441. * removed in SQL:2011
  1442. */
  1443. -- The data in this table are defined by various profiles of SQL.
  1444. -- Since we don't have any information about such profiles, we provide
  1445. -- an empty table.
  1446. CREATE TABLE sql_sizing_profiles (
  1447. sizing_id cardinal_number,
  1448. sizing_name character_data,
  1449. profile_id character_data,
  1450. required_value cardinal_number,
  1451. comments character_data
  1452. );
  1453. GRANT SELECT ON sql_sizing_profiles TO PUBLIC;
  1454. /*
  1455. * 5.61
  1456. * TABLE_CONSTRAINTS view
  1457. */
  1458. CREATE VIEW table_constraints AS
  1459. SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
  1460. CAST(nc.nspname AS sql_identifier) AS constraint_schema,
  1461. CAST(c.conname AS sql_identifier) AS constraint_name,
  1462. CAST(current_database() AS sql_identifier) AS table_catalog,
  1463. CAST(nr.nspname AS sql_identifier) AS table_schema,
  1464. CAST(r.relname AS sql_identifier) AS table_name,
  1465. CAST(
  1466. CASE c.contype WHEN 'c' THEN 'CHECK'
  1467. WHEN 'f' THEN 'FOREIGN KEY'
  1468. WHEN 'p' THEN 'PRIMARY KEY'
  1469. WHEN 'u' THEN 'UNIQUE' END
  1470. AS character_data) AS constraint_type,
  1471. CAST(CASE WHEN c.condeferrable THEN 'YES' ELSE 'NO' END AS yes_or_no)
  1472. AS is_deferrable,
  1473. CAST(CASE WHEN c.condeferred THEN 'YES' ELSE 'NO' END AS yes_or_no)
  1474. AS initially_deferred,
  1475. CAST('YES' AS yes_or_no) AS enforced
  1476. FROM pg_namespace nc,
  1477. pg_namespace nr,
  1478. pg_constraint c,
  1479. pg_class r
  1480. WHERE nc.oid = c.connamespace AND nr.oid = r.relnamespace
  1481. AND c.conrelid = r.oid
  1482. AND c.contype NOT IN ('t', 'x') -- ignore nonstandard constraints
  1483. AND r.relkind IN ('r', 'p')
  1484. AND (NOT pg_is_other_temp_schema(nr.oid))
  1485. AND (pg_has_role(r.relowner, 'USAGE')
  1486. -- SELECT privilege omitted, per SQL standard
  1487. OR has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
  1488. OR has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') )
  1489. UNION ALL
  1490. -- not-null constraints
  1491. SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
  1492. CAST(nr.nspname AS sql_identifier) AS constraint_schema,
  1493. CAST(CAST(nr.oid AS text) || '_' || CAST(r.oid AS text) || '_' || CAST(a.attnum AS text) || '_not_null' AS sql_identifier) AS constraint_name, -- XXX
  1494. CAST(current_database() AS sql_identifier) AS table_catalog,
  1495. CAST(nr.nspname AS sql_identifier) AS table_schema,
  1496. CAST(r.relname AS sql_identifier) AS table_name,
  1497. CAST('CHECK' AS character_data) AS constraint_type,
  1498. CAST('NO' AS yes_or_no) AS is_deferrable,
  1499. CAST('NO' AS yes_or_no) AS initially_deferred,
  1500. CAST('YES' AS yes_or_no) AS enforced
  1501. FROM pg_namespace nr,
  1502. pg_class r,
  1503. pg_attribute a
  1504. WHERE nr.oid = r.relnamespace
  1505. AND r.oid = a.attrelid
  1506. AND a.attnotnull
  1507. AND a.attnum > 0
  1508. AND NOT a.attisdropped
  1509. AND r.relkind IN ('r', 'p')
  1510. AND (NOT pg_is_other_temp_schema(nr.oid))
  1511. AND (pg_has_role(r.relowner, 'USAGE')
  1512. -- SELECT privilege omitted, per SQL standard
  1513. OR has_table_privilege(r.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
  1514. OR has_any_column_privilege(r.oid, 'INSERT, UPDATE, REFERENCES') );
  1515. GRANT SELECT ON table_constraints TO PUBLIC;
  1516. /*
  1517. * 5.62
  1518. * TABLE_METHOD_PRIVILEGES view
  1519. */
  1520. -- feature not supported
  1521. /*
  1522. * 5.63
  1523. * TABLE_PRIVILEGES view
  1524. */
  1525. CREATE VIEW table_privileges AS
  1526. SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
  1527. CAST(grantee.rolname AS sql_identifier) AS grantee,
  1528. CAST(current_database() AS sql_identifier) AS table_catalog,
  1529. CAST(nc.nspname AS sql_identifier) AS table_schema,
  1530. CAST(c.relname AS sql_identifier) AS table_name,
  1531. CAST(c.prtype AS character_data) AS privilege_type,
  1532. CAST(
  1533. CASE WHEN
  1534. -- object owner always has grant options
  1535. pg_has_role(grantee.oid, c.relowner, 'USAGE')
  1536. OR c.grantable
  1537. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable,
  1538. CAST(CASE WHEN c.prtype = 'SELECT' THEN 'YES' ELSE 'NO' END AS yes_or_no) AS with_hierarchy
  1539. FROM (
  1540. SELECT oid, relname, relnamespace, relkind, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class
  1541. ) AS c (oid, relname, relnamespace, relkind, relowner, grantor, grantee, prtype, grantable),
  1542. pg_namespace nc,
  1543. pg_authid u_grantor,
  1544. (
  1545. SELECT oid, rolname FROM pg_authid
  1546. UNION ALL
  1547. SELECT 0::oid, 'PUBLIC'
  1548. ) AS grantee (oid, rolname)
  1549. WHERE c.relnamespace = nc.oid
  1550. AND c.relkind IN ('r', 'v', 'f', 'p')
  1551. AND c.grantee = grantee.oid
  1552. AND c.grantor = u_grantor.oid
  1553. AND c.prtype IN ('INSERT', 'SELECT', 'UPDATE', 'DELETE', 'TRUNCATE', 'REFERENCES', 'TRIGGER')
  1554. AND (pg_has_role(u_grantor.oid, 'USAGE')
  1555. OR pg_has_role(grantee.oid, 'USAGE')
  1556. OR grantee.rolname = 'PUBLIC');
  1557. GRANT SELECT ON table_privileges TO PUBLIC;
  1558. /*
  1559. * 5.43
  1560. * ROLE_TABLE_GRANTS view
  1561. */
  1562. CREATE VIEW role_table_grants AS
  1563. SELECT grantor,
  1564. grantee,
  1565. table_catalog,
  1566. table_schema,
  1567. table_name,
  1568. privilege_type,
  1569. is_grantable,
  1570. with_hierarchy
  1571. FROM table_privileges
  1572. WHERE grantor IN (SELECT role_name FROM enabled_roles)
  1573. OR grantee IN (SELECT role_name FROM enabled_roles);
  1574. GRANT SELECT ON role_table_grants TO PUBLIC;
  1575. /*
  1576. * 5.63
  1577. * TABLES view
  1578. */
  1579. CREATE VIEW tables AS
  1580. SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
  1581. CAST(nc.nspname AS sql_identifier) AS table_schema,
  1582. CAST(c.relname AS sql_identifier) AS table_name,
  1583. CAST(
  1584. CASE WHEN nc.oid = pg_my_temp_schema() THEN 'LOCAL TEMPORARY'
  1585. WHEN c.relkind IN ('r', 'p') THEN 'BASE TABLE'
  1586. WHEN c.relkind = 'v' THEN 'VIEW'
  1587. WHEN c.relkind = 'f' THEN 'FOREIGN'
  1588. ELSE null END
  1589. AS character_data) AS table_type,
  1590. CAST(null AS sql_identifier) AS self_referencing_column_name,
  1591. CAST(null AS character_data) AS reference_generation,
  1592. CAST(CASE WHEN t.typname IS NOT NULL THEN current_database() ELSE null END AS sql_identifier) AS user_defined_type_catalog,
  1593. CAST(nt.nspname AS sql_identifier) AS user_defined_type_schema,
  1594. CAST(t.typname AS sql_identifier) AS user_defined_type_name,
  1595. CAST(CASE WHEN c.relkind IN ('r', 'p') OR
  1596. (c.relkind IN ('v', 'f') AND
  1597. -- 1 << CMD_INSERT
  1598. pg_relation_is_updatable(c.oid, false) & 8 = 8)
  1599. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_insertable_into,
  1600. CAST(CASE WHEN t.typname IS NOT NULL THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_typed,
  1601. CAST(null AS character_data) AS commit_action
  1602. FROM pg_namespace nc JOIN pg_class c ON (nc.oid = c.relnamespace)
  1603. LEFT JOIN (pg_type t JOIN pg_namespace nt ON (t.typnamespace = nt.oid)) ON (c.reloftype = t.oid)
  1604. WHERE c.relkind IN ('r', 'v', 'f', 'p')
  1605. AND (NOT pg_is_other_temp_schema(nc.oid))
  1606. AND (pg_has_role(c.relowner, 'USAGE')
  1607. OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
  1608. OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
  1609. GRANT SELECT ON tables TO PUBLIC;
  1610. /*
  1611. * 5.65
  1612. * TRANSFORMS view
  1613. */
  1614. CREATE VIEW transforms AS
  1615. SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
  1616. CAST(nt.nspname AS sql_identifier) AS udt_schema,
  1617. CAST(t.typname AS sql_identifier) AS udt_name,
  1618. CAST(current_database() AS sql_identifier) AS specific_catalog,
  1619. CAST(np.nspname AS sql_identifier) AS specific_schema,
  1620. CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
  1621. CAST(l.lanname AS sql_identifier) AS group_name,
  1622. CAST('FROM SQL' AS character_data) AS transform_type
  1623. FROM pg_type t JOIN pg_transform x ON t.oid = x.trftype
  1624. JOIN pg_language l ON x.trflang = l.oid
  1625. JOIN pg_proc p ON x.trffromsql = p.oid
  1626. JOIN pg_namespace nt ON t.typnamespace = nt.oid
  1627. JOIN pg_namespace np ON p.pronamespace = np.oid
  1628. UNION
  1629. SELECT CAST(current_database() AS sql_identifier) AS udt_catalog,
  1630. CAST(nt.nspname AS sql_identifier) AS udt_schema,
  1631. CAST(t.typname AS sql_identifier) AS udt_name,
  1632. CAST(current_database() AS sql_identifier) AS specific_catalog,
  1633. CAST(np.nspname AS sql_identifier) AS specific_schema,
  1634. CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name,
  1635. CAST(l.lanname AS sql_identifier) AS group_name,
  1636. CAST('TO SQL' AS character_data) AS transform_type
  1637. FROM pg_type t JOIN pg_transform x ON t.oid = x.trftype
  1638. JOIN pg_language l ON x.trflang = l.oid
  1639. JOIN pg_proc p ON x.trftosql = p.oid
  1640. JOIN pg_namespace nt ON t.typnamespace = nt.oid
  1641. JOIN pg_namespace np ON p.pronamespace = np.oid
  1642. ORDER BY udt_catalog, udt_schema, udt_name, group_name, transform_type -- some sensible grouping for interactive use
  1643. ;
  1644. /*
  1645. * 5.66
  1646. * TRANSLATIONS view
  1647. */
  1648. -- feature not supported
  1649. /*
  1650. * 5.67
  1651. * TRIGGERED_UPDATE_COLUMNS view
  1652. */
  1653. CREATE VIEW triggered_update_columns AS
  1654. SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
  1655. CAST(n.nspname AS sql_identifier) AS trigger_schema,
  1656. CAST(t.tgname AS sql_identifier) AS trigger_name,
  1657. CAST(current_database() AS sql_identifier) AS event_object_catalog,
  1658. CAST(n.nspname AS sql_identifier) AS event_object_schema,
  1659. CAST(c.relname AS sql_identifier) AS event_object_table,
  1660. CAST(a.attname AS sql_identifier) AS event_object_column
  1661. FROM pg_namespace n, pg_class c, pg_trigger t,
  1662. (SELECT tgoid, (ta0.tgat).x AS tgattnum, (ta0.tgat).n AS tgattpos
  1663. FROM (SELECT oid AS tgoid, information_schema._pg_expandarray(tgattr) AS tgat FROM pg_trigger) AS ta0) AS ta,
  1664. pg_attribute a
  1665. WHERE n.oid = c.relnamespace
  1666. AND c.oid = t.tgrelid
  1667. AND t.oid = ta.tgoid
  1668. AND (a.attrelid, a.attnum) = (t.tgrelid, ta.tgattnum)
  1669. AND NOT t.tgisinternal
  1670. AND (NOT pg_is_other_temp_schema(n.oid))
  1671. AND (pg_has_role(c.relowner, 'USAGE')
  1672. -- SELECT privilege omitted, per SQL standard
  1673. OR has_column_privilege(c.oid, a.attnum, 'INSERT, UPDATE, REFERENCES') );
  1674. GRANT SELECT ON triggered_update_columns TO PUBLIC;
  1675. /*
  1676. * 5.68
  1677. * TRIGGER_COLUMN_USAGE view
  1678. */
  1679. -- not tracked by PostgreSQL
  1680. /*
  1681. * 5.69
  1682. * TRIGGER_PERIOD_USAGE view
  1683. */
  1684. -- feature not supported
  1685. /*
  1686. * 5.70
  1687. * TRIGGER_ROUTINE_USAGE view
  1688. */
  1689. -- not tracked by PostgreSQL
  1690. /*
  1691. * 5.71
  1692. * TRIGGER_SEQUENCE_USAGE view
  1693. */
  1694. -- not tracked by PostgreSQL
  1695. /*
  1696. * 5.72
  1697. * TRIGGER_TABLE_USAGE view
  1698. */
  1699. -- not tracked by PostgreSQL
  1700. /*
  1701. * 5.73
  1702. * TRIGGERS view
  1703. */
  1704. CREATE VIEW triggers AS
  1705. SELECT CAST(current_database() AS sql_identifier) AS trigger_catalog,
  1706. CAST(n.nspname AS sql_identifier) AS trigger_schema,
  1707. CAST(t.tgname AS sql_identifier) AS trigger_name,
  1708. CAST(em.text AS character_data) AS event_manipulation,
  1709. CAST(current_database() AS sql_identifier) AS event_object_catalog,
  1710. CAST(n.nspname AS sql_identifier) AS event_object_schema,
  1711. CAST(c.relname AS sql_identifier) AS event_object_table,
  1712. CAST(
  1713. -- To determine action order, partition by schema, table,
  1714. -- event_manipulation (INSERT/DELETE/UPDATE), ROW/STATEMENT (1),
  1715. -- BEFORE/AFTER (66), then order by trigger name. It's preferable
  1716. -- to partition by view output columns, so that query constraints
  1717. -- can be pushed down below the window function.
  1718. rank() OVER (PARTITION BY CAST(n.nspname AS sql_identifier),
  1719. CAST(c.relname AS sql_identifier),
  1720. em.num,
  1721. t.tgtype & 1,
  1722. t.tgtype & 66
  1723. ORDER BY t.tgname)
  1724. AS cardinal_number) AS action_order,
  1725. CAST(
  1726. CASE WHEN pg_has_role(c.relowner, 'USAGE')
  1727. THEN (regexp_match(pg_get_triggerdef(t.oid), E'.{35,} WHEN \\((.+)\\) EXECUTE FUNCTION'))[1]
  1728. ELSE null END
  1729. AS character_data) AS action_condition,
  1730. CAST(
  1731. substring(pg_get_triggerdef(t.oid) from
  1732. position('EXECUTE FUNCTION' in substring(pg_get_triggerdef(t.oid) from 48)) + 47)
  1733. AS character_data) AS action_statement,
  1734. CAST(
  1735. -- hard-wired reference to TRIGGER_TYPE_ROW
  1736. CASE t.tgtype & 1 WHEN 1 THEN 'ROW' ELSE 'STATEMENT' END
  1737. AS character_data) AS action_orientation,
  1738. CAST(
  1739. -- hard-wired refs to TRIGGER_TYPE_BEFORE, TRIGGER_TYPE_INSTEAD
  1740. CASE t.tgtype & 66 WHEN 2 THEN 'BEFORE' WHEN 64 THEN 'INSTEAD OF' ELSE 'AFTER' END
  1741. AS character_data) AS action_timing,
  1742. CAST(tgoldtable AS sql_identifier) AS action_reference_old_table,
  1743. CAST(tgnewtable AS sql_identifier) AS action_reference_new_table,
  1744. CAST(null AS sql_identifier) AS action_reference_old_row,
  1745. CAST(null AS sql_identifier) AS action_reference_new_row,
  1746. CAST(null AS time_stamp) AS created
  1747. FROM pg_namespace n, pg_class c, pg_trigger t,
  1748. -- hard-wired refs to TRIGGER_TYPE_INSERT, TRIGGER_TYPE_DELETE,
  1749. -- TRIGGER_TYPE_UPDATE; we intentionally omit TRIGGER_TYPE_TRUNCATE
  1750. (VALUES (4, 'INSERT'),
  1751. (8, 'DELETE'),
  1752. (16, 'UPDATE')) AS em (num, text)
  1753. WHERE n.oid = c.relnamespace
  1754. AND c.oid = t.tgrelid
  1755. AND t.tgtype & em.num <> 0
  1756. AND NOT t.tgisinternal
  1757. AND (NOT pg_is_other_temp_schema(n.oid))
  1758. AND (pg_has_role(c.relowner, 'USAGE')
  1759. -- SELECT privilege omitted, per SQL standard
  1760. OR has_table_privilege(c.oid, 'INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
  1761. OR has_any_column_privilege(c.oid, 'INSERT, UPDATE, REFERENCES') );
  1762. GRANT SELECT ON triggers TO PUBLIC;
  1763. /*
  1764. * 5.74
  1765. * UDT_PRIVILEGES view
  1766. */
  1767. CREATE VIEW udt_privileges AS
  1768. SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
  1769. CAST(grantee.rolname AS sql_identifier) AS grantee,
  1770. CAST(current_database() AS sql_identifier) AS udt_catalog,
  1771. CAST(n.nspname AS sql_identifier) AS udt_schema,
  1772. CAST(t.typname AS sql_identifier) AS udt_name,
  1773. CAST('TYPE USAGE' AS character_data) AS privilege_type, -- sic
  1774. CAST(
  1775. CASE WHEN
  1776. -- object owner always has grant options
  1777. pg_has_role(grantee.oid, t.typowner, 'USAGE')
  1778. OR t.grantable
  1779. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
  1780. FROM (
  1781. SELECT oid, typname, typnamespace, typtype, typowner, (aclexplode(coalesce(typacl, acldefault('T', typowner)))).* FROM pg_type
  1782. ) AS t (oid, typname, typnamespace, typtype, typowner, grantor, grantee, prtype, grantable),
  1783. pg_namespace n,
  1784. pg_authid u_grantor,
  1785. (
  1786. SELECT oid, rolname FROM pg_authid
  1787. UNION ALL
  1788. SELECT 0::oid, 'PUBLIC'
  1789. ) AS grantee (oid, rolname)
  1790. WHERE t.typnamespace = n.oid
  1791. AND t.typtype = 'c'
  1792. AND t.grantee = grantee.oid
  1793. AND t.grantor = u_grantor.oid
  1794. AND t.prtype IN ('USAGE')
  1795. AND (pg_has_role(u_grantor.oid, 'USAGE')
  1796. OR pg_has_role(grantee.oid, 'USAGE')
  1797. OR grantee.rolname = 'PUBLIC');
  1798. GRANT SELECT ON udt_privileges TO PUBLIC;
  1799. /*
  1800. * 5.46
  1801. * ROLE_UDT_GRANTS view
  1802. */
  1803. CREATE VIEW role_udt_grants AS
  1804. SELECT grantor,
  1805. grantee,
  1806. udt_catalog,
  1807. udt_schema,
  1808. udt_name,
  1809. privilege_type,
  1810. is_grantable
  1811. FROM udt_privileges
  1812. WHERE grantor IN (SELECT role_name FROM enabled_roles)
  1813. OR grantee IN (SELECT role_name FROM enabled_roles);
  1814. GRANT SELECT ON role_udt_grants TO PUBLIC;
  1815. /*
  1816. * 5.75
  1817. * USAGE_PRIVILEGES view
  1818. */
  1819. CREATE VIEW usage_privileges AS
  1820. /* collations */
  1821. -- Collations have no real privileges, so we represent all collations with implicit usage privilege here.
  1822. SELECT CAST(u.rolname AS sql_identifier) AS grantor,
  1823. CAST('PUBLIC' AS sql_identifier) AS grantee,
  1824. CAST(current_database() AS sql_identifier) AS object_catalog,
  1825. CAST(n.nspname AS sql_identifier) AS object_schema,
  1826. CAST(c.collname AS sql_identifier) AS object_name,
  1827. CAST('COLLATION' AS character_data) AS object_type,
  1828. CAST('USAGE' AS character_data) AS privilege_type,
  1829. CAST('NO' AS yes_or_no) AS is_grantable
  1830. FROM pg_authid u,
  1831. pg_namespace n,
  1832. pg_collation c
  1833. WHERE u.oid = c.collowner
  1834. AND c.collnamespace = n.oid
  1835. AND collencoding IN (-1, (SELECT encoding FROM pg_database WHERE datname = current_database()))
  1836. UNION ALL
  1837. /* domains */
  1838. SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
  1839. CAST(grantee.rolname AS sql_identifier) AS grantee,
  1840. CAST(current_database() AS sql_identifier) AS object_catalog,
  1841. CAST(n.nspname AS sql_identifier) AS object_schema,
  1842. CAST(t.typname AS sql_identifier) AS object_name,
  1843. CAST('DOMAIN' AS character_data) AS object_type,
  1844. CAST('USAGE' AS character_data) AS privilege_type,
  1845. CAST(
  1846. CASE WHEN
  1847. -- object owner always has grant options
  1848. pg_has_role(grantee.oid, t.typowner, 'USAGE')
  1849. OR t.grantable
  1850. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
  1851. FROM (
  1852. SELECT oid, typname, typnamespace, typtype, typowner, (aclexplode(coalesce(typacl, acldefault('T', typowner)))).* FROM pg_type
  1853. ) AS t (oid, typname, typnamespace, typtype, typowner, grantor, grantee, prtype, grantable),
  1854. pg_namespace n,
  1855. pg_authid u_grantor,
  1856. (
  1857. SELECT oid, rolname FROM pg_authid
  1858. UNION ALL
  1859. SELECT 0::oid, 'PUBLIC'
  1860. ) AS grantee (oid, rolname)
  1861. WHERE t.typnamespace = n.oid
  1862. AND t.typtype = 'd'
  1863. AND t.grantee = grantee.oid
  1864. AND t.grantor = u_grantor.oid
  1865. AND t.prtype IN ('USAGE')
  1866. AND (pg_has_role(u_grantor.oid, 'USAGE')
  1867. OR pg_has_role(grantee.oid, 'USAGE')
  1868. OR grantee.rolname = 'PUBLIC')
  1869. UNION ALL
  1870. /* foreign-data wrappers */
  1871. SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
  1872. CAST(grantee.rolname AS sql_identifier) AS grantee,
  1873. CAST(current_database() AS sql_identifier) AS object_catalog,
  1874. CAST('' AS sql_identifier) AS object_schema,
  1875. CAST(fdw.fdwname AS sql_identifier) AS object_name,
  1876. CAST('FOREIGN DATA WRAPPER' AS character_data) AS object_type,
  1877. CAST('USAGE' AS character_data) AS privilege_type,
  1878. CAST(
  1879. CASE WHEN
  1880. -- object owner always has grant options
  1881. pg_has_role(grantee.oid, fdw.fdwowner, 'USAGE')
  1882. OR fdw.grantable
  1883. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
  1884. FROM (
  1885. SELECT fdwname, fdwowner, (aclexplode(coalesce(fdwacl, acldefault('F', fdwowner)))).* FROM pg_foreign_data_wrapper
  1886. ) AS fdw (fdwname, fdwowner, grantor, grantee, prtype, grantable),
  1887. pg_authid u_grantor,
  1888. (
  1889. SELECT oid, rolname FROM pg_authid
  1890. UNION ALL
  1891. SELECT 0::oid, 'PUBLIC'
  1892. ) AS grantee (oid, rolname)
  1893. WHERE u_grantor.oid = fdw.grantor
  1894. AND grantee.oid = fdw.grantee
  1895. AND fdw.prtype IN ('USAGE')
  1896. AND (pg_has_role(u_grantor.oid, 'USAGE')
  1897. OR pg_has_role(grantee.oid, 'USAGE')
  1898. OR grantee.rolname = 'PUBLIC')
  1899. UNION ALL
  1900. /* foreign servers */
  1901. SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
  1902. CAST(grantee.rolname AS sql_identifier) AS grantee,
  1903. CAST(current_database() AS sql_identifier) AS object_catalog,
  1904. CAST('' AS sql_identifier) AS object_schema,
  1905. CAST(srv.srvname AS sql_identifier) AS object_name,
  1906. CAST('FOREIGN SERVER' AS character_data) AS object_type,
  1907. CAST('USAGE' AS character_data) AS privilege_type,
  1908. CAST(
  1909. CASE WHEN
  1910. -- object owner always has grant options
  1911. pg_has_role(grantee.oid, srv.srvowner, 'USAGE')
  1912. OR srv.grantable
  1913. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
  1914. FROM (
  1915. SELECT srvname, srvowner, (aclexplode(coalesce(srvacl, acldefault('S', srvowner)))).* FROM pg_foreign_server
  1916. ) AS srv (srvname, srvowner, grantor, grantee, prtype, grantable),
  1917. pg_authid u_grantor,
  1918. (
  1919. SELECT oid, rolname FROM pg_authid
  1920. UNION ALL
  1921. SELECT 0::oid, 'PUBLIC'
  1922. ) AS grantee (oid, rolname)
  1923. WHERE u_grantor.oid = srv.grantor
  1924. AND grantee.oid = srv.grantee
  1925. AND srv.prtype IN ('USAGE')
  1926. AND (pg_has_role(u_grantor.oid, 'USAGE')
  1927. OR pg_has_role(grantee.oid, 'USAGE')
  1928. OR grantee.rolname = 'PUBLIC')
  1929. UNION ALL
  1930. /* sequences */
  1931. SELECT CAST(u_grantor.rolname AS sql_identifier) AS grantor,
  1932. CAST(grantee.rolname AS sql_identifier) AS grantee,
  1933. CAST(current_database() AS sql_identifier) AS object_catalog,
  1934. CAST(n.nspname AS sql_identifier) AS object_schema,
  1935. CAST(c.relname AS sql_identifier) AS object_name,
  1936. CAST('SEQUENCE' AS character_data) AS object_type,
  1937. CAST('USAGE' AS character_data) AS privilege_type,
  1938. CAST(
  1939. CASE WHEN
  1940. -- object owner always has grant options
  1941. pg_has_role(grantee.oid, c.relowner, 'USAGE')
  1942. OR c.grantable
  1943. THEN 'YES' ELSE 'NO' END AS yes_or_no) AS is_grantable
  1944. FROM (
  1945. SELECT oid, relname, relnamespace, relkind, relowner, (aclexplode(coalesce(relacl, acldefault('r', relowner)))).* FROM pg_class
  1946. ) AS c (oid, relname, relnamespace, relkind, relowner, grantor, grantee, prtype, grantable),
  1947. pg_namespace n,
  1948. pg_authid u_grantor,
  1949. (
  1950. SELECT oid, rolname FROM pg_authid
  1951. UNION ALL
  1952. SELECT 0::oid, 'PUBLIC'
  1953. ) AS grantee (oid, rolname)
  1954. WHERE c.relnamespace = n.oid
  1955. AND c.relkind = 'S'
  1956. AND c.grantee = grantee.oid
  1957. AND c.grantor = u_grantor.oid
  1958. AND c.prtype IN ('USAGE')
  1959. AND (pg_has_role(u_grantor.oid, 'USAGE')
  1960. OR pg_has_role(grantee.oid, 'USAGE')
  1961. OR grantee.rolname = 'PUBLIC');
  1962. GRANT SELECT ON usage_privileges TO PUBLIC;
  1963. /*
  1964. * 5.45
  1965. * ROLE_USAGE_GRANTS view
  1966. */
  1967. CREATE VIEW role_usage_grants AS
  1968. SELECT grantor,
  1969. grantee,
  1970. object_catalog,
  1971. object_schema,
  1972. object_name,
  1973. object_type,
  1974. privilege_type,
  1975. is_grantable
  1976. FROM usage_privileges
  1977. WHERE grantor IN (SELECT role_name FROM enabled_roles)
  1978. OR grantee IN (SELECT role_name FROM enabled_roles);
  1979. GRANT SELECT ON role_usage_grants TO PUBLIC;
  1980. /*
  1981. * 5.76
  1982. * USER_DEFINED_TYPES view
  1983. */
  1984. CREATE VIEW user_defined_types AS
  1985. SELECT CAST(current_database() AS sql_identifier) AS user_defined_type_catalog,
  1986. CAST(n.nspname AS sql_identifier) AS user_defined_type_schema,
  1987. CAST(c.relname AS sql_identifier) AS user_defined_type_name,
  1988. CAST('STRUCTURED' AS character_data) AS user_defined_type_category,
  1989. CAST('YES' AS yes_or_no) AS is_instantiable,
  1990. CAST(null AS yes_or_no) AS is_final,
  1991. CAST(null AS character_data) AS ordering_form,
  1992. CAST(null AS character_data) AS ordering_category,
  1993. CAST(null AS sql_identifier) AS ordering_routine_catalog,
  1994. CAST(null AS sql_identifier) AS ordering_routine_schema,
  1995. CAST(null AS sql_identifier) AS ordering_routine_name,
  1996. CAST(null AS character_data) AS reference_type,
  1997. CAST(null AS character_data) AS data_type,
  1998. CAST(null AS cardinal_number) AS character_maximum_length,
  1999. CAST(null AS cardinal_number) AS character_octet_length,
  2000. CAST(null AS sql_identifier) AS character_set_catalog,
  2001. CAST(null AS sql_identifier) AS character_set_schema,
  2002. CAST(null AS sql_identifier) AS character_set_name,
  2003. CAST(null AS sql_identifier) AS collation_catalog,
  2004. CAST(null AS sql_identifier) AS collation_schema,
  2005. CAST(null AS sql_identifier) AS collation_name,
  2006. CAST(null AS cardinal_number) AS numeric_precision,
  2007. CAST(null AS cardinal_number) AS numeric_precision_radix,
  2008. CAST(null AS cardinal_number) AS numeric_scale,
  2009. CAST(null AS cardinal_number) AS datetime_precision,
  2010. CAST(null AS character_data) AS interval_type,
  2011. CAST(null AS cardinal_number) AS interval_precision,
  2012. CAST(null AS sql_identifier) AS source_dtd_identifier,
  2013. CAST(null AS sql_identifier) AS ref_dtd_identifier
  2014. FROM pg_namespace n, pg_class c, pg_type t
  2015. WHERE n.oid = c.relnamespace
  2016. AND t.typrelid = c.oid
  2017. AND c.relkind = 'c'
  2018. AND (pg_has_role(t.typowner, 'USAGE')
  2019. OR has_type_privilege(t.oid, 'USAGE'));
  2020. GRANT SELECT ON user_defined_types TO PUBLIC;
  2021. /*
  2022. * 5.77
  2023. * VIEW_COLUMN_USAGE
  2024. */
  2025. CREATE VIEW view_column_usage AS
  2026. SELECT DISTINCT
  2027. CAST(current_database() AS sql_identifier) AS view_catalog,
  2028. CAST(nv.nspname AS sql_identifier) AS view_schema,
  2029. CAST(v.relname AS sql_identifier) AS view_name,
  2030. CAST(current_database() AS sql_identifier) AS table_catalog,
  2031. CAST(nt.nspname AS sql_identifier) AS table_schema,
  2032. CAST(t.relname AS sql_identifier) AS table_name,
  2033. CAST(a.attname AS sql_identifier) AS column_name
  2034. FROM pg_namespace nv, pg_class v, pg_depend dv,
  2035. pg_depend dt, pg_class t, pg_namespace nt,
  2036. pg_attribute a
  2037. WHERE nv.oid = v.relnamespace
  2038. AND v.relkind = 'v'
  2039. AND v.oid = dv.refobjid
  2040. AND dv.refclassid = 'pg_catalog.pg_class'::regclass
  2041. AND dv.classid = 'pg_catalog.pg_rewrite'::regclass
  2042. AND dv.deptype = 'i'
  2043. AND dv.objid = dt.objid
  2044. AND dv.refobjid <> dt.refobjid
  2045. AND dt.classid = 'pg_catalog.pg_rewrite'::regclass
  2046. AND dt.refclassid = 'pg_catalog.pg_class'::regclass
  2047. AND dt.refobjid = t.oid
  2048. AND t.relnamespace = nt.oid
  2049. AND t.relkind IN ('r', 'v', 'f', 'p')
  2050. AND t.oid = a.attrelid
  2051. AND dt.refobjsubid = a.attnum
  2052. AND pg_has_role(t.relowner, 'USAGE');
  2053. GRANT SELECT ON view_column_usage TO PUBLIC;
  2054. /*
  2055. * 5.78
  2056. * VIEW_PERIOD_USAGE
  2057. */
  2058. -- feature not supported
  2059. /*
  2060. * 5.79
  2061. * VIEW_ROUTINE_USAGE
  2062. */
  2063. CREATE VIEW view_routine_usage AS
  2064. SELECT DISTINCT
  2065. CAST(current_database() AS sql_identifier) AS table_catalog,
  2066. CAST(nv.nspname AS sql_identifier) AS table_schema,
  2067. CAST(v.relname AS sql_identifier) AS table_name,
  2068. CAST(current_database() AS sql_identifier) AS specific_catalog,
  2069. CAST(np.nspname AS sql_identifier) AS specific_schema,
  2070. CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier) AS specific_name
  2071. FROM pg_namespace nv, pg_class v, pg_depend dv,
  2072. pg_depend dp, pg_proc p, pg_namespace np
  2073. WHERE nv.oid = v.relnamespace
  2074. AND v.relkind = 'v'
  2075. AND v.oid = dv.refobjid
  2076. AND dv.refclassid = 'pg_catalog.pg_class'::regclass
  2077. AND dv.classid = 'pg_catalog.pg_rewrite'::regclass
  2078. AND dv.deptype = 'i'
  2079. AND dv.objid = dp.objid
  2080. AND dp.classid = 'pg_catalog.pg_rewrite'::regclass
  2081. AND dp.refclassid = 'pg_catalog.pg_proc'::regclass
  2082. AND dp.refobjid = p.oid
  2083. AND p.pronamespace = np.oid
  2084. AND pg_has_role(p.proowner, 'USAGE');
  2085. GRANT SELECT ON view_routine_usage TO PUBLIC;
  2086. /*
  2087. * 5.80
  2088. * VIEW_TABLE_USAGE
  2089. */
  2090. CREATE VIEW view_table_usage AS
  2091. SELECT DISTINCT
  2092. CAST(current_database() AS sql_identifier) AS view_catalog,
  2093. CAST(nv.nspname AS sql_identifier) AS view_schema,
  2094. CAST(v.relname AS sql_identifier) AS view_name,
  2095. CAST(current_database() AS sql_identifier) AS table_catalog,
  2096. CAST(nt.nspname AS sql_identifier) AS table_schema,
  2097. CAST(t.relname AS sql_identifier) AS table_name
  2098. FROM pg_namespace nv, pg_class v, pg_depend dv,
  2099. pg_depend dt, pg_class t, pg_namespace nt
  2100. WHERE nv.oid = v.relnamespace
  2101. AND v.relkind = 'v'
  2102. AND v.oid = dv.refobjid
  2103. AND dv.refclassid = 'pg_catalog.pg_class'::regclass
  2104. AND dv.classid = 'pg_catalog.pg_rewrite'::regclass
  2105. AND dv.deptype = 'i'
  2106. AND dv.objid = dt.objid
  2107. AND dv.refobjid <> dt.refobjid
  2108. AND dt.classid = 'pg_catalog.pg_rewrite'::regclass
  2109. AND dt.refclassid = 'pg_catalog.pg_class'::regclass
  2110. AND dt.refobjid = t.oid
  2111. AND t.relnamespace = nt.oid
  2112. AND t.relkind IN ('r', 'v', 'f', 'p')
  2113. AND pg_has_role(t.relowner, 'USAGE');
  2114. GRANT SELECT ON view_table_usage TO PUBLIC;
  2115. /*
  2116. * 5.81
  2117. * VIEWS view
  2118. */
  2119. CREATE VIEW views AS
  2120. SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
  2121. CAST(nc.nspname AS sql_identifier) AS table_schema,
  2122. CAST(c.relname AS sql_identifier) AS table_name,
  2123. CAST(
  2124. CASE WHEN pg_has_role(c.relowner, 'USAGE')
  2125. THEN pg_get_viewdef(c.oid)
  2126. ELSE null END
  2127. AS character_data) AS view_definition,
  2128. CAST(
  2129. CASE WHEN 'check_option=cascaded' = ANY (c.reloptions)
  2130. THEN 'CASCADED'
  2131. WHEN 'check_option=local' = ANY (c.reloptions)
  2132. THEN 'LOCAL'
  2133. ELSE 'NONE' END
  2134. AS character_data) AS check_option,
  2135. CAST(
  2136. -- (1 << CMD_UPDATE) + (1 << CMD_DELETE)
  2137. CASE WHEN pg_relation_is_updatable(c.oid, false) & 20 = 20
  2138. THEN 'YES' ELSE 'NO' END
  2139. AS yes_or_no) AS is_updatable,
  2140. CAST(
  2141. -- 1 << CMD_INSERT
  2142. CASE WHEN pg_relation_is_updatable(c.oid, false) & 8 = 8
  2143. THEN 'YES' ELSE 'NO' END
  2144. AS yes_or_no) AS is_insertable_into,
  2145. CAST(
  2146. -- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_UPDATE
  2147. CASE WHEN EXISTS (SELECT 1 FROM pg_trigger WHERE tgrelid = c.oid AND tgtype & 81 = 81)
  2148. THEN 'YES' ELSE 'NO' END
  2149. AS yes_or_no) AS is_trigger_updatable,
  2150. CAST(
  2151. -- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_DELETE
  2152. CASE WHEN EXISTS (SELECT 1 FROM pg_trigger WHERE tgrelid = c.oid AND tgtype & 73 = 73)
  2153. THEN 'YES' ELSE 'NO' END
  2154. AS yes_or_no) AS is_trigger_deletable,
  2155. CAST(
  2156. -- TRIGGER_TYPE_ROW + TRIGGER_TYPE_INSTEAD + TRIGGER_TYPE_INSERT
  2157. CASE WHEN EXISTS (SELECT 1 FROM pg_trigger WHERE tgrelid = c.oid AND tgtype & 69 = 69)
  2158. THEN 'YES' ELSE 'NO' END
  2159. AS yes_or_no) AS is_trigger_insertable_into
  2160. FROM pg_namespace nc, pg_class c
  2161. WHERE c.relnamespace = nc.oid
  2162. AND c.relkind = 'v'
  2163. AND (NOT pg_is_other_temp_schema(nc.oid))
  2164. AND (pg_has_role(c.relowner, 'USAGE')
  2165. OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
  2166. OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES') );
  2167. GRANT SELECT ON views TO PUBLIC;
  2168. -- The following views have dependencies that force them to appear out of order.
  2169. /*
  2170. * 5.25
  2171. * DATA_TYPE_PRIVILEGES view
  2172. */
  2173. CREATE VIEW data_type_privileges AS
  2174. SELECT CAST(current_database() AS sql_identifier) AS object_catalog,
  2175. CAST(x.objschema AS sql_identifier) AS object_schema,
  2176. CAST(x.objname AS sql_identifier) AS object_name,
  2177. CAST(x.objtype AS character_data) AS object_type,
  2178. CAST(x.objdtdid AS sql_identifier) AS dtd_identifier
  2179. FROM
  2180. (
  2181. SELECT udt_schema, udt_name, 'USER-DEFINED TYPE'::text, dtd_identifier FROM attributes
  2182. UNION ALL
  2183. SELECT table_schema, table_name, 'TABLE'::text, dtd_identifier FROM columns
  2184. UNION ALL
  2185. SELECT domain_schema, domain_name, 'DOMAIN'::text, dtd_identifier FROM domains
  2186. UNION ALL
  2187. SELECT specific_schema, specific_name, 'ROUTINE'::text, dtd_identifier FROM parameters
  2188. UNION ALL
  2189. SELECT specific_schema, specific_name, 'ROUTINE'::text, dtd_identifier FROM routines
  2190. ) AS x (objschema, objname, objtype, objdtdid);
  2191. GRANT SELECT ON data_type_privileges TO PUBLIC;
  2192. /*
  2193. * 5.30
  2194. * ELEMENT_TYPES view
  2195. */
  2196. CREATE VIEW element_types AS
  2197. SELECT CAST(current_database() AS sql_identifier) AS object_catalog,
  2198. CAST(n.nspname AS sql_identifier) AS object_schema,
  2199. CAST(x.objname AS sql_identifier) AS object_name,
  2200. CAST(x.objtype AS character_data) AS object_type,
  2201. CAST(x.objdtdid AS sql_identifier) AS collection_type_identifier,
  2202. CAST(
  2203. CASE WHEN nbt.nspname = 'pg_catalog' THEN format_type(bt.oid, null)
  2204. ELSE 'USER-DEFINED' END AS character_data) AS data_type,
  2205. CAST(null AS cardinal_number) AS character_maximum_length,
  2206. CAST(null AS cardinal_number) AS character_octet_length,
  2207. CAST(null AS sql_identifier) AS character_set_catalog,
  2208. CAST(null AS sql_identifier) AS character_set_schema,
  2209. CAST(null AS sql_identifier) AS character_set_name,
  2210. CAST(CASE WHEN nco.nspname IS NOT NULL THEN current_database() END AS sql_identifier) AS collation_catalog,
  2211. CAST(nco.nspname AS sql_identifier) AS collation_schema,
  2212. CAST(co.collname AS sql_identifier) AS collation_name,
  2213. CAST(null AS cardinal_number) AS numeric_precision,
  2214. CAST(null AS cardinal_number) AS numeric_precision_radix,
  2215. CAST(null AS cardinal_number) AS numeric_scale,
  2216. CAST(null AS cardinal_number) AS datetime_precision,
  2217. CAST(null AS character_data) AS interval_type,
  2218. CAST(null AS cardinal_number) AS interval_precision,
  2219. CAST(null AS character_data) AS domain_default, -- XXX maybe a bug in the standard
  2220. CAST(current_database() AS sql_identifier) AS udt_catalog,
  2221. CAST(nbt.nspname AS sql_identifier) AS udt_schema,
  2222. CAST(bt.typname AS sql_identifier) AS udt_name,
  2223. CAST(null AS sql_identifier) AS scope_catalog,
  2224. CAST(null AS sql_identifier) AS scope_schema,
  2225. CAST(null AS sql_identifier) AS scope_name,
  2226. CAST(null AS cardinal_number) AS maximum_cardinality,
  2227. CAST('a' || CAST(x.objdtdid AS text) AS sql_identifier) AS dtd_identifier
  2228. FROM pg_namespace n, pg_type at, pg_namespace nbt, pg_type bt,
  2229. (
  2230. /* columns, attributes */
  2231. SELECT c.relnamespace, CAST(c.relname AS sql_identifier),
  2232. CASE WHEN c.relkind = 'c' THEN 'USER-DEFINED TYPE'::text ELSE 'TABLE'::text END,
  2233. a.attnum, a.atttypid, a.attcollation
  2234. FROM pg_class c, pg_attribute a
  2235. WHERE c.oid = a.attrelid
  2236. AND c.relkind IN ('r', 'v', 'f', 'c', 'p')
  2237. AND attnum > 0 AND NOT attisdropped
  2238. UNION ALL
  2239. /* domains */
  2240. SELECT t.typnamespace, CAST(t.typname AS sql_identifier),
  2241. 'DOMAIN'::text, 1, t.typbasetype, t.typcollation
  2242. FROM pg_type t
  2243. WHERE t.typtype = 'd'
  2244. UNION ALL
  2245. /* parameters */
  2246. SELECT pronamespace,
  2247. CAST(nameconcatoid(proname, oid) AS sql_identifier),
  2248. 'ROUTINE'::text, (ss.x).n, (ss.x).x, 0
  2249. FROM (SELECT p.pronamespace, p.proname, p.oid,
  2250. _pg_expandarray(coalesce(p.proallargtypes, p.proargtypes::oid[])) AS x
  2251. FROM pg_proc p) AS ss
  2252. UNION ALL
  2253. /* result types */
  2254. SELECT p.pronamespace,
  2255. CAST(nameconcatoid(p.proname, p.oid) AS sql_identifier),
  2256. 'ROUTINE'::text, 0, p.prorettype, 0
  2257. FROM pg_proc p
  2258. ) AS x (objschema, objname, objtype, objdtdid, objtypeid, objcollation)
  2259. LEFT JOIN (pg_collation co JOIN pg_namespace nco ON (co.collnamespace = nco.oid))
  2260. ON x.objcollation = co.oid AND (nco.nspname, co.collname) <> ('pg_catalog', 'default')
  2261. WHERE n.oid = x.objschema
  2262. AND at.oid = x.objtypeid
  2263. AND (at.typelem <> 0 AND at.typlen = -1)
  2264. AND at.typelem = bt.oid
  2265. AND nbt.oid = bt.typnamespace
  2266. AND (n.nspname, x.objname, x.objtype, CAST(x.objdtdid AS sql_identifier)) IN
  2267. ( SELECT object_schema, object_name, object_type, dtd_identifier
  2268. FROM data_type_privileges );
  2269. GRANT SELECT ON element_types TO PUBLIC;
  2270. -- SQL/MED views; these use section numbers from part 9 of the standard.
  2271. /* Base view for foreign table columns */
  2272. CREATE VIEW _pg_foreign_table_columns AS
  2273. SELECT n.nspname,
  2274. c.relname,
  2275. a.attname,
  2276. a.attfdwoptions
  2277. FROM pg_foreign_table t, pg_authid u, pg_namespace n, pg_class c,
  2278. pg_attribute a
  2279. WHERE u.oid = c.relowner
  2280. AND (pg_has_role(c.relowner, 'USAGE')
  2281. OR has_column_privilege(c.oid, a.attnum, 'SELECT, INSERT, UPDATE, REFERENCES'))
  2282. AND n.oid = c.relnamespace
  2283. AND c.oid = t.ftrelid
  2284. AND c.relkind = 'f'
  2285. AND a.attrelid = c.oid
  2286. AND a.attnum > 0;
  2287. /*
  2288. * 24.2
  2289. * COLUMN_OPTIONS view
  2290. */
  2291. CREATE VIEW column_options AS
  2292. SELECT CAST(current_database() AS sql_identifier) AS table_catalog,
  2293. CAST(c.nspname AS sql_identifier) AS table_schema,
  2294. CAST(c.relname AS sql_identifier) AS table_name,
  2295. CAST(c.attname AS sql_identifier) AS column_name,
  2296. CAST((pg_options_to_table(c.attfdwoptions)).option_name AS sql_identifier) AS option_name,
  2297. CAST((pg_options_to_table(c.attfdwoptions)).option_value AS character_data) AS option_value
  2298. FROM _pg_foreign_table_columns c;
  2299. GRANT SELECT ON column_options TO PUBLIC;
  2300. /* Base view for foreign-data wrappers */
  2301. CREATE VIEW _pg_foreign_data_wrappers AS
  2302. SELECT w.oid,
  2303. w.fdwowner,
  2304. w.fdwoptions,
  2305. CAST(current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
  2306. CAST(fdwname AS sql_identifier) AS foreign_data_wrapper_name,
  2307. CAST(u.rolname AS sql_identifier) AS authorization_identifier,
  2308. CAST('c' AS character_data) AS foreign_data_wrapper_language
  2309. FROM pg_foreign_data_wrapper w, pg_authid u
  2310. WHERE u.oid = w.fdwowner
  2311. AND (pg_has_role(fdwowner, 'USAGE')
  2312. OR has_foreign_data_wrapper_privilege(w.oid, 'USAGE'));
  2313. /*
  2314. * 24.4
  2315. * FOREIGN_DATA_WRAPPER_OPTIONS view
  2316. */
  2317. CREATE VIEW foreign_data_wrapper_options AS
  2318. SELECT foreign_data_wrapper_catalog,
  2319. foreign_data_wrapper_name,
  2320. CAST((pg_options_to_table(w.fdwoptions)).option_name AS sql_identifier) AS option_name,
  2321. CAST((pg_options_to_table(w.fdwoptions)).option_value AS character_data) AS option_value
  2322. FROM _pg_foreign_data_wrappers w;
  2323. GRANT SELECT ON foreign_data_wrapper_options TO PUBLIC;
  2324. /*
  2325. * 24.5
  2326. * FOREIGN_DATA_WRAPPERS view
  2327. */
  2328. CREATE VIEW foreign_data_wrappers AS
  2329. SELECT foreign_data_wrapper_catalog,
  2330. foreign_data_wrapper_name,
  2331. authorization_identifier,
  2332. CAST(NULL AS character_data) AS library_name,
  2333. foreign_data_wrapper_language
  2334. FROM _pg_foreign_data_wrappers w;
  2335. GRANT SELECT ON foreign_data_wrappers TO PUBLIC;
  2336. /* Base view for foreign servers */
  2337. CREATE VIEW _pg_foreign_servers AS
  2338. SELECT s.oid,
  2339. s.srvoptions,
  2340. CAST(current_database() AS sql_identifier) AS foreign_server_catalog,
  2341. CAST(srvname AS sql_identifier) AS foreign_server_name,
  2342. CAST(current_database() AS sql_identifier) AS foreign_data_wrapper_catalog,
  2343. CAST(w.fdwname AS sql_identifier) AS foreign_data_wrapper_name,
  2344. CAST(srvtype AS character_data) AS foreign_server_type,
  2345. CAST(srvversion AS character_data) AS foreign_server_version,
  2346. CAST(u.rolname AS sql_identifier) AS authorization_identifier
  2347. FROM pg_foreign_server s, pg_foreign_data_wrapper w, pg_authid u
  2348. WHERE w.oid = s.srvfdw
  2349. AND u.oid = s.srvowner
  2350. AND (pg_has_role(s.srvowner, 'USAGE')
  2351. OR has_server_privilege(s.oid, 'USAGE'));
  2352. /*
  2353. * 24.6
  2354. * FOREIGN_SERVER_OPTIONS view
  2355. */
  2356. CREATE VIEW foreign_server_options AS
  2357. SELECT foreign_server_catalog,
  2358. foreign_server_name,
  2359. CAST((pg_options_to_table(s.srvoptions)).option_name AS sql_identifier) AS option_name,
  2360. CAST((pg_options_to_table(s.srvoptions)).option_value AS character_data) AS option_value
  2361. FROM _pg_foreign_servers s;
  2362. GRANT SELECT ON TABLE foreign_server_options TO PUBLIC;
  2363. /*
  2364. * 24.7
  2365. * FOREIGN_SERVERS view
  2366. */
  2367. CREATE VIEW foreign_servers AS
  2368. SELECT foreign_server_catalog,
  2369. foreign_server_name,
  2370. foreign_data_wrapper_catalog,
  2371. foreign_data_wrapper_name,
  2372. foreign_server_type,
  2373. foreign_server_version,
  2374. authorization_identifier
  2375. FROM _pg_foreign_servers;
  2376. GRANT SELECT ON foreign_servers TO PUBLIC;
  2377. /* Base view for foreign tables */
  2378. CREATE VIEW _pg_foreign_tables AS
  2379. SELECT
  2380. CAST(current_database() AS sql_identifier) AS foreign_table_catalog,
  2381. CAST(n.nspname AS sql_identifier) AS foreign_table_schema,
  2382. CAST(c.relname AS sql_identifier) AS foreign_table_name,
  2383. t.ftoptions AS ftoptions,
  2384. CAST(current_database() AS sql_identifier) AS foreign_server_catalog,
  2385. CAST(srvname AS sql_identifier) AS foreign_server_name,
  2386. CAST(u.rolname AS sql_identifier) AS authorization_identifier
  2387. FROM pg_foreign_table t, pg_foreign_server s, pg_foreign_data_wrapper w,
  2388. pg_authid u, pg_namespace n, pg_class c
  2389. WHERE w.oid = s.srvfdw
  2390. AND u.oid = c.relowner
  2391. AND (pg_has_role(c.relowner, 'USAGE')
  2392. OR has_table_privilege(c.oid, 'SELECT, INSERT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER')
  2393. OR has_any_column_privilege(c.oid, 'SELECT, INSERT, UPDATE, REFERENCES'))
  2394. AND n.oid = c.relnamespace
  2395. AND c.oid = t.ftrelid
  2396. AND c.relkind = 'f'
  2397. AND s.oid = t.ftserver;
  2398. /*
  2399. * 24.8
  2400. * FOREIGN_TABLE_OPTIONS view
  2401. */
  2402. CREATE VIEW foreign_table_options AS
  2403. SELECT foreign_table_catalog,
  2404. foreign_table_schema,
  2405. foreign_table_name,
  2406. CAST((pg_options_to_table(t.ftoptions)).option_name AS sql_identifier) AS option_name,
  2407. CAST((pg_options_to_table(t.ftoptions)).option_value AS character_data) AS option_value
  2408. FROM _pg_foreign_tables t;
  2409. GRANT SELECT ON TABLE foreign_table_options TO PUBLIC;
  2410. /*
  2411. * 24.9
  2412. * FOREIGN_TABLES view
  2413. */
  2414. CREATE VIEW foreign_tables AS
  2415. SELECT foreign_table_catalog,
  2416. foreign_table_schema,
  2417. foreign_table_name,
  2418. foreign_server_catalog,
  2419. foreign_server_name
  2420. FROM _pg_foreign_tables;
  2421. GRANT SELECT ON foreign_tables TO PUBLIC;
  2422. /* Base view for user mappings */
  2423. CREATE VIEW _pg_user_mappings AS
  2424. SELECT um.oid,
  2425. um.umoptions,
  2426. um.umuser,
  2427. CAST(COALESCE(u.rolname,'PUBLIC') AS sql_identifier ) AS authorization_identifier,
  2428. s.foreign_server_catalog,
  2429. s.foreign_server_name,
  2430. s.authorization_identifier AS srvowner
  2431. FROM pg_user_mapping um LEFT JOIN pg_authid u ON (u.oid = um.umuser),
  2432. _pg_foreign_servers s
  2433. WHERE s.oid = um.umserver;
  2434. /*
  2435. * 24.12
  2436. * USER_MAPPING_OPTIONS view
  2437. */
  2438. CREATE VIEW user_mapping_options AS
  2439. SELECT authorization_identifier,
  2440. foreign_server_catalog,
  2441. foreign_server_name,
  2442. CAST(opts.option_name AS sql_identifier) AS option_name,
  2443. CAST(CASE WHEN (umuser <> 0 AND authorization_identifier = current_user)
  2444. OR (umuser = 0 AND pg_has_role(srvowner, 'USAGE'))
  2445. OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
  2446. THEN opts.option_value
  2447. ELSE NULL END AS character_data) AS option_value
  2448. FROM _pg_user_mappings um,
  2449. pg_options_to_table(um.umoptions) opts;
  2450. GRANT SELECT ON user_mapping_options TO PUBLIC;
  2451. /*
  2452. * 24.13
  2453. * USER_MAPPINGS view
  2454. */
  2455. CREATE VIEW user_mappings AS
  2456. SELECT authorization_identifier,
  2457. foreign_server_catalog,
  2458. foreign_server_name
  2459. FROM _pg_user_mappings;
  2460. GRANT SELECT ON user_mappings TO PUBLIC;
上海开阖软件有限公司 沪ICP备12045867号-1