suggestions by @diogob

This commit is contained in:
Ruslan Talpa
2016-03-01 08:08:57 +02:00
parent 40eec0b2ff
commit 7b94fb608d
+19 -40
View File
@@ -563,11 +563,10 @@ allSynonyms cols =
WITH view_columns AS ( WITH view_columns AS (
SELECT SELECT
c.oid AS view_oid, c.oid AS view_oid,
nc.nspname::information_schema.sql_identifier AS view_schema,
c.relname::information_schema.sql_identifier AS view_name,
a.attname::information_schema.sql_identifier AS column_name a.attname::information_schema.sql_identifier AS column_name
FROM pg_attribute a FROM pg_attribute a
JOIN (pg_class c JOIN pg_namespace nc ON c.relnamespace = nc.oid) ON a.attrelid = c.oid JOIN pg_class c ON a.attrelid = c.oid
JOIN pg_namespace nc ON c.relnamespace = nc.oid
WHERE WHERE
NOT pg_is_other_temp_schema(nc.oid) NOT pg_is_other_temp_schema(nc.oid)
AND a.attnum > 0 AND a.attnum > 0
@@ -575,7 +574,6 @@ allSynonyms cols =
AND (c.relkind = 'v'::"char") AND (c.relkind = 'v'::"char")
AND nc.nspname NOT IN ('information_schema', 'pg_catalog') AND nc.nspname NOT IN ('information_schema', 'pg_catalog')
), ),
view_column_usage AS ( view_column_usage AS (
SELECT DISTINCT SELECT DISTINCT
v.oid as view_oid, v.oid as view_oid,
@@ -585,57 +583,38 @@ allSynonyms cols =
t.relname::information_schema.sql_identifier AS table_name, t.relname::information_schema.sql_identifier AS table_name,
a.attname::information_schema.sql_identifier AS column_name, a.attname::information_schema.sql_identifier AS column_name,
pg_get_viewdef(v.oid)::information_schema.character_data AS view_definition pg_get_viewdef(v.oid)::information_schema.character_data AS view_definition
FROM FROM pg_namespace nv
pg_namespace nv, JOIN pg_class v ON nv.oid = v.relnamespace
pg_class v, JOIN pg_depend dv ON v.oid = dv.refobjid
pg_depend dv, JOIN pg_depend dt ON dv.objid = dt.objid
pg_depend dt, JOIN pg_class t ON dt.refobjid = t.oid
pg_class t, JOIN pg_namespace nt ON t.relnamespace = nt.oid
pg_namespace nt, JOIN pg_attribute a ON t.oid = a.attrelid AND dt.refobjsubid = a.attnum
pg_attribute a
WHERE WHERE
nv.oid = v.relnamespace nv.nspname not in ('information_schema', 'pg_catalog')
AND nv.nspname not in ('information_schema', 'pg_catalog')
AND v.relkind = 'v'::"char" AND v.relkind = 'v'::"char"
AND v.oid = dv.refobjid
AND dv.refclassid = 'pg_class'::regclass::oid AND dv.refclassid = 'pg_class'::regclass::oid
AND dv.classid = 'pg_rewrite'::regclass::oid AND dv.classid = 'pg_rewrite'::regclass::oid
AND dv.deptype = 'i'::"char" AND dv.deptype = 'i'::"char"
AND dv.objid = dt.objid
AND dv.refobjid <> dt.refobjid AND dv.refobjid <> dt.refobjid
AND dt.classid = 'pg_rewrite'::regclass::oid AND dt.classid = 'pg_rewrite'::regclass::oid
AND dt.refclassid = 'pg_class'::regclass::oid AND dt.refclassid = 'pg_class'::regclass::oid
AND dt.refobjid = t.oid
AND t.relnamespace = nt.oid
AND (t.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'f'::"char"])) AND (t.relkind = ANY (ARRAY['r'::"char", 'v'::"char", 'f'::"char"]))
AND t.oid = a.attrelid
AND dt.refobjsubid = a.attnum
), ),
candidates AS ( candidates AS (
( SELECT
SELECT vcu.*,
vcu.*, (
(REGEXP_MATCHES( SELECT CASE WHEN match IS NOT NULL THEN coalesce(match[7], match[4]) END
FROM REGEXP_MATCHES(
CONCAT('SELECT ', SPLIT_PART(vcu.view_definition, 'SELECT', 2)), CONCAT('SELECT ', SPLIT_PART(vcu.view_definition, 'SELECT', 2)),
CONCAT('SELECT.*?((',vcu.table_name,')|(\w+))\.(', vcu.column_name, ')(\sAS\s(")?([^"]+)\6)?.*?FROM.*?',vcu.table_schema,'\.(\2|',vcu.table_name,'\s+(AS\s)?\3)'), CONCAT('SELECT.*?((',vcu.table_name,')|(\w+))\.(', vcu.column_name, ')(\sAS\s(")?([^"]+)\6)?.*?FROM.*?',vcu.table_schema,'\.(\2|',vcu.table_name,'\s+(AS\s)?\3)'),
'ns' 'ns'
))[7] AS view_column_name ) match
FROM view_column_usage AS vcu ) AS view_column_name
) FROM view_column_usage AS vcu
UNION
(
SELECT
vcu.*,
(REGEXP_MATCHES(
CONCAT('SELECT ', SPLIT_PART(vcu.view_definition, 'SELECT', 2)),
CONCAT('SELECT.*?((',vcu.table_name,')|(\w+))\.(', vcu.column_name, ')(\sAS\s(")?([^"]+)\6)?.*?FROM.*?',vcu.table_schema,'\.(\2|',vcu.table_name,'\s+(AS\s)?\3)'),
'ns'
))[4] AS view_column_name
FROM view_column_usage AS vcu
)
) )
SELECT SELECT
c.table_schema, c.table_schema,
c.table_name, c.table_name,