|
1 | 1 | -- Adapted from
|
2 | 2 | -- https://github.com/PostgREST/postgrest/blob/f9f0f79fa914ac00c11fbf7f4c558e14821e67e2/src/PostgREST/SchemaCache.hs#L722
|
3 |
| -WITH |
4 |
| - pks_uniques_cols AS ( |
5 |
| - SELECT |
6 |
| - connamespace, |
7 |
| - conrelid, |
8 |
| - jsonb_agg(column_info.cols) as cols |
9 |
| - FROM pg_constraint |
10 |
| - JOIN lateral ( |
11 |
| - SELECT array_agg(cols.attname order by cols.attnum) as cols |
12 |
| - FROM ( select unnest(conkey) as col) _ |
13 |
| - JOIN pg_attribute cols on cols.attrelid = conrelid and cols.attnum = col |
14 |
| - ) column_info ON TRUE |
15 |
| - WHERE |
16 |
| - contype IN ('p', 'u') and |
17 |
| - connamespace::regnamespace::text <> 'pg_catalog' |
18 |
| - GROUP BY connamespace, conrelid |
19 |
| - ) |
20 |
| - SELECT |
21 |
| - traint.oid AS id, |
22 |
| - traint.conname AS foreign_key_name, |
23 |
| - ns1.nspname AS schema, |
24 |
| - tab.relname AS relation, |
25 |
| - column_info.cols AS columns, |
26 |
| - ns2.nspname AS referenced_schema, |
27 |
| - other.relname AS referenced_relation, |
28 |
| - column_info.refs AS referenced_columns |
29 |
| - FROM pg_constraint traint |
30 |
| - JOIN LATERAL ( |
31 |
| - SELECT |
32 |
| - array_agg(row(cols.attname, refs.attname) order by ord) AS cols_and_fcols, |
33 |
| - jsonb_agg(cols.attname order by ord) AS cols, |
34 |
| - jsonb_agg(refs.attname order by ord) AS refs |
35 |
| - FROM unnest(traint.conkey, traint.confkey) WITH ORDINALITY AS _(col, ref, ord) |
36 |
| - JOIN pg_attribute cols ON cols.attrelid = traint.conrelid AND cols.attnum = col |
37 |
| - JOIN pg_attribute refs ON refs.attrelid = traint.confrelid AND refs.attnum = ref |
38 |
| - ) AS column_info ON TRUE |
39 |
| - JOIN pg_namespace ns1 ON ns1.oid = traint.connamespace |
40 |
| - JOIN pg_class tab ON tab.oid = traint.conrelid |
41 |
| - JOIN pg_class other ON other.oid = traint.confrelid |
42 |
| - JOIN pg_namespace ns2 ON ns2.oid = other.relnamespace |
43 |
| - LEFT JOIN pks_uniques_cols pks_uqs ON pks_uqs.connamespace = traint.connamespace AND pks_uqs.conrelid = traint.conrelid |
44 |
| - WHERE traint.contype = 'f' |
| 3 | +SELECT |
| 4 | + traint.oid AS id, |
| 5 | + traint.conname AS foreign_key_name, |
| 6 | + ns1.nspname AS schema, |
| 7 | + tab.relname AS relation, |
| 8 | + column_info.cols AS columns, |
| 9 | + ns2.nspname AS referenced_schema, |
| 10 | + other.relname AS referenced_relation, |
| 11 | + column_info.refs AS referenced_columns |
| 12 | +FROM pg_constraint traint |
| 13 | +JOIN LATERAL ( |
| 14 | + SELECT |
| 15 | + jsonb_agg(cols.attname order by ord) AS cols, |
| 16 | + jsonb_agg(refs.attname order by ord) AS refs |
| 17 | + FROM unnest(traint.conkey, traint.confkey) WITH ORDINALITY AS _(col, ref, ord) |
| 18 | + JOIN pg_attribute cols ON cols.attrelid = traint.conrelid AND cols.attnum = col |
| 19 | + JOIN pg_attribute refs ON refs.attrelid = traint.confrelid AND refs.attnum = ref |
| 20 | +) AS column_info ON TRUE |
| 21 | +JOIN pg_namespace ns1 ON ns1.oid = traint.connamespace |
| 22 | +JOIN pg_class tab ON tab.oid = traint.conrelid |
| 23 | +JOIN pg_class other ON other.oid = traint.confrelid |
| 24 | +JOIN pg_namespace ns2 ON ns2.oid = other.relnamespace |
| 25 | +WHERE traint.contype = 'f' |
0 commit comments