Fix bugs in referential_constraints view.

This commit is contained in:
Peter Eisentraut 2003-10-16 23:46:17 +00:00
parent 4a48c671d2
commit 44430dbc15
2 changed files with 31 additions and 19 deletions

View File

@ -1,4 +1,4 @@
<!-- $Header: /cvsroot/pgsql/doc/src/sgml/information_schema.sgml,v 1.9 2003/09/20 20:12:05 tgl Exp $ --> <!-- $Header: /cvsroot/pgsql/doc/src/sgml/information_schema.sgml,v 1.10 2003/10/16 23:46:17 petere Exp $ -->
<chapter id="information-schema"> <chapter id="information-schema">
<title>The Information Schema</title> <title>The Information Schema</title>
@ -2146,7 +2146,7 @@ ORDER BY c.ordinal_position;
<entry> <entry>
Update rule of the foreign key constraint: Update rule of the foreign key constraint:
<literal>CASCADE</literal>, <literal>SET NULL</literal>, <literal>CASCADE</literal>, <literal>SET NULL</literal>,
<literal>SET DEFAULT</literal>, <literal>RESTRICT</literal>,or <literal>SET DEFAULT</literal>, <literal>RESTRICT</literal>, or
<literal>NO ACTION</literal>. <literal>NO ACTION</literal>.
</entry> </entry>
</row> </row>
@ -2157,7 +2157,7 @@ ORDER BY c.ordinal_position;
<entry> <entry>
Delete rule of the foreign key constraint: Delete rule of the foreign key constraint:
<literal>CASCADE</literal>, <literal>SET NULL</literal>, <literal>CASCADE</literal>, <literal>SET NULL</literal>,
<literal>SET DEFAULT</literal>, <literal>RESTRICT</literal>,or <literal>SET DEFAULT</literal>, <literal>RESTRICT</literal>, or
<literal>NO ACTION</literal>. <literal>NO ACTION</literal>.
</entry> </entry>
</row> </row>

View File

@ -4,7 +4,7 @@
* *
* Copyright 2003, PostgreSQL Global Development Group * Copyright 2003, PostgreSQL Global Development Group
* *
* $Id: information_schema.sql,v 1.12 2003/06/29 15:14:41 petere Exp $ * $Id: information_schema.sql,v 1.13 2003/10/16 23:46:17 petere Exp $
*/ */
/* /*
@ -747,11 +747,26 @@ GRANT SELECT ON parameters TO PUBLIC;
* REFERENTIAL_CONSTRAINTS view * REFERENTIAL_CONSTRAINTS view
*/ */
CREATE FUNCTION _pg_keyissubset(smallint[], smallint[]) RETURNS boolean
LANGUAGE sql
IMMUTABLE
RETURNS NULL ON NULL INPUT
AS 'select $1[1] is null or ($1[1] = any ($2) and coalesce(_pg_keyissubset($1[2:array_upper($1,1)], $2), true))';
CREATE FUNCTION _pg_keysequal(smallint[], smallint[]) RETURNS boolean
LANGUAGE sql
IMMUTABLE
RETURNS NULL ON NULL INPUT
AS 'select _pg_keyissubset($1, $2) and _pg_keyissubset($2, $1)';
CREATE VIEW referential_constraints AS CREATE VIEW referential_constraints AS
SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog, SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
CAST(ncon.nspname AS sql_identifier) AS constraint_schema, CAST(ncon.nspname AS sql_identifier) AS constraint_schema,
CAST(con.conname AS sql_identifier) AS constraint_name, CAST(con.conname AS sql_identifier) AS constraint_name,
CAST(current_database() AS sql_identifier) AS unique_constraint_catalog, CAST(
CASE WHEN npkc.nspname IS NULL THEN NULL
ELSE current_database() END
AS sql_identifier) AS unique_constraint_catalog,
CAST(npkc.nspname AS sql_identifier) AS unique_constraint_schema, CAST(npkc.nspname AS sql_identifier) AS unique_constraint_schema,
CAST(pkc.conname AS sql_identifier) AS unique_constraint_name, CAST(pkc.conname AS sql_identifier) AS unique_constraint_name,
@ -766,7 +781,7 @@ CREATE VIEW referential_constraints AS
WHEN 'n' THEN 'SET NULL' WHEN 'n' THEN 'SET NULL'
WHEN 'd' THEN 'SET DEFAULT' WHEN 'd' THEN 'SET DEFAULT'
WHEN 'r' THEN 'RESTRICT' WHEN 'r' THEN 'RESTRICT'
WHEN 'a' THEN 'NOACTION' END WHEN 'a' THEN 'NO ACTION' END
AS character_data) AS update_rule, AS character_data) AS update_rule,
CAST( CAST(
@ -774,22 +789,19 @@ CREATE VIEW referential_constraints AS
WHEN 'n' THEN 'SET NULL' WHEN 'n' THEN 'SET NULL'
WHEN 'd' THEN 'SET DEFAULT' WHEN 'd' THEN 'SET DEFAULT'
WHEN 'r' THEN 'RESTRICT' WHEN 'r' THEN 'RESTRICT'
WHEN 'a' THEN 'NOACTION' END WHEN 'a' THEN 'NO ACTION' END
AS character_data) AS delete_rule AS character_data) AS delete_rule
FROM pg_namespace ncon, FROM (pg_namespace ncon INNER JOIN pg_constraint con ON ncon.oid = con.connamespace
pg_constraint con, INNER JOIN pg_class c ON con.conrelid = c.oid
pg_class c, INNER JOIN pg_user u ON c.relowner = u.usesysid)
pg_constraint pkc, LEFT JOIN
pg_namespace npkc, (pg_constraint pkc INNER JOIN pg_namespace npkc ON pkc.connamespace = npkc.oid)
pg_user u ON con.confrelid = pkc.conrelid AND _pg_keysequal(con.confkey, pkc.conkey)
WHERE ncon.oid = con.connamespace WHERE c.relkind = 'r'
AND con.conrelid = c.oid AND con.contype = 'f'
AND con.confkey = pkc.conkey AND (pkc.contype IN ('p', 'u') OR pkc.contype IS NULL)
AND pkc.connamespace = npkc.oid
AND c.relowner = u.usesysid
AND c.relkind = 'r'
AND u.usename = current_user; AND u.usename = current_user;
GRANT SELECT ON referential_constraints TO PUBLIC; GRANT SELECT ON referential_constraints TO PUBLIC;