4
4
*
5
5
* Copyright 2003, PostgreSQL Global Development Group
6
6
*
7
- * $Id: information_schema.sql,v 1.12 2003/06/29 15:14:41 petere Exp $
7
+ * $Id: information_schema.sql,v 1.13 2003/10/16 23:46:17 petere Exp $
8
8
*/
9
9
10
10
/*
@@ -747,11 +747,26 @@ GRANT SELECT ON parameters TO PUBLIC;
747
747
* REFERENTIAL_CONSTRAINTS view
748
748
*/
749
749
750
+ CREATE FUNCTION _pg_keyissubset (smallint [], smallint []) RETURNS boolean
751
+ LANGUAGE sql
752
+ IMMUTABLE
753
+ RETURNS NULL ON NULL INPUT
754
+ AS ' select $1[1] is null or ($1[1] = any ($2) and coalesce(_pg_keyissubset($1[2:array_upper($1,1)], $2), true))' ;
755
+
756
+ CREATE FUNCTION _pg_keysequal (smallint [], smallint []) RETURNS boolean
757
+ LANGUAGE sql
758
+ IMMUTABLE
759
+ RETURNS NULL ON NULL INPUT
760
+ AS ' select _pg_keyissubset($1, $2) and _pg_keyissubset($2, $1)' ;
761
+
750
762
CREATE VIEW referential_constraints AS
751
763
SELECT CAST(current_database() AS sql_identifier) AS constraint_catalog,
752
764
CAST(ncon .nspname AS sql_identifier) AS constraint_schema,
753
765
CAST(con .conname AS sql_identifier) AS constraint_name,
754
- CAST(current_database() AS sql_identifier) AS unique_constraint_catalog,
766
+ CAST(
767
+ CASE WHEN npkc .nspname IS NULL THEN NULL
768
+ ELSE current_database() END
769
+ AS sql_identifier) AS unique_constraint_catalog,
755
770
CAST(npkc .nspname AS sql_identifier) AS unique_constraint_schema,
756
771
CAST(pkc .conname AS sql_identifier) AS unique_constraint_name,
757
772
@@ -766,30 +781,27 @@ CREATE VIEW referential_constraints AS
766
781
WHEN ' n' THEN ' SET NULL'
767
782
WHEN ' d' THEN ' SET DEFAULT'
768
783
WHEN ' r' THEN ' RESTRICT'
769
- WHEN ' a' THEN ' NOACTION ' END
784
+ WHEN ' a' THEN ' NO ACTION ' END
770
785
AS character_data) AS update_rule,
771
786
772
787
CAST(
773
788
CASE con .confdeltype WHEN ' c' THEN ' CASCADE'
774
789
WHEN ' n' THEN ' SET NULL'
775
790
WHEN ' d' THEN ' SET DEFAULT'
776
791
WHEN ' r' THEN ' RESTRICT'
777
- WHEN ' a' THEN ' NOACTION ' END
792
+ WHEN ' a' THEN ' NO ACTION ' END
778
793
AS character_data) AS delete_rule
779
794
780
- FROM pg_namespace ncon,
781
- pg_constraint con,
782
- pg_class c,
783
- pg_constraint pkc,
784
- pg_namespace npkc,
785
- pg_user u
795
+ FROM ( pg_namespace ncon INNER JOIN pg_constraint con ON ncon . oid = con . connamespace
796
+ INNER JOIN pg_class c ON con . conrelid = c . oid
797
+ INNER JOIN pg_user u ON c . relowner = u . usesysid )
798
+ LEFT JOIN
799
+ (pg_constraint pkc INNER JOIN pg_namespace npkc ON pkc . connamespace = npkc . oid )
800
+ ON con . confrelid = pkc . conrelid AND _pg_keysequal( con . confkey , pkc . conkey )
786
801
787
- WHERE ncon .oid = con .connamespace
788
- AND con .conrelid = c .oid
789
- AND con .confkey = pkc .conkey
790
- AND pkc .connamespace = npkc .oid
791
- AND c .relowner = u .usesysid
792
- AND c .relkind = ' r'
802
+ WHERE c .relkind = ' r'
803
+ AND con .contype = ' f'
804
+ AND (pkc .contype IN (' p' , ' u' ) OR pkc .contype IS NULL )
793
805
AND u .usename = current_user ;
794
806
795
807
GRANT SELECT ON referential_constraints TO PUBLIC;
0 commit comments