scripts/collector/postgres/sql/aws_extension_dependency.sql (390 lines of code) (raw):
/*
Copyright 2024 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
with proc_alias1 as (
select distinct n.nspname as function_schema,
p.proname as function_name,
l.lanname as function_language,
(
select 'Y'
from pg_trigger
where tgfoid = (n.nspname || '.' || p.proname)::regproc
) as Trigger_Func,
lower(pg_get_functiondef(p.oid)::text) as def
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype
where n.nspname not in (
'pg_catalog',
'information_schema',
'aws_oracle_ext'
)
and p.prokind not in ('a', 'w', 'f')
and l.lanname in ('sql', 'plpgsql')
order by function_schema,
function_name
),
proc_alias2 as (
select proc_alias1.function_schema,
proc_alias1.function_name,
proc_alias1.function_language,
proc_alias1.Trigger_Func,
proc_alias2.*
from proc_alias1
cross join LATERAL (
select i as funcname,
cntgroup as cnt
from (
select (
regexp_matches(
proc_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1] i,
count(1) cntgroup
group by (
regexp_matches(
proc_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1]
) t
) as proc_alias2
where def ~* 'aws_oracle_ext.*'
),
tbl_alias1 as (
select alias1.proname,
ns.nspname,
case
when relkind = 'r' then 'TABLE'
end as objType,
depend.relname,
pg_get_expr(pg_attrdef.adbin, pg_attrdef.adrelid) as def
from pg_depend
inner join (
select distinct pg_proc.oid as procoid,
nspname || '.' || proname as proname,
pg_namespace.oid
from pg_namespace,
pg_proc
where nspname = 'aws_oracle_ext'
and pg_proc.pronamespace = pg_namespace.oid
) alias1 on pg_depend.refobjid = alias1.procoid
inner join pg_attrdef on pg_attrdef.oid = pg_depend.objid
inner join pg_class depend on depend.oid = pg_attrdef.adrelid
inner join pg_namespace ns on ns.oid = depend.relnamespace
),
tbl_alias2 as (
select tbl_alias1.nspname as SCHEMA,
tbl_alias1.relname as TABLE_NAME,
alias2.*
from tbl_alias1
cross join LATERAL (
select i as funcname,
cntgroup as cnt
from (
select (
regexp_matches(
tbl_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1] i,
count(1) cntgroup
group by (
regexp_matches(
tbl_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1]
) t
) as alias2
where def ~* 'aws_oracle_ext.*'
),
constraint_alias1 as (
select pgc.conname as CONSTRAINT_NAME,
ccu.table_schema as table_schema,
ccu.table_name,
ccu.column_name,
pg_get_constraintdef(pgc.oid) as def
from pg_constraint pgc
join pg_namespace nsp on nsp.oid = pgc.connamespace
join pg_class cls on pgc.conrelid = cls.oid
left join information_schema.constraint_column_usage ccu on pgc.conname = ccu.constraint_name
and nsp.nspname = ccu.constraint_schema
where contype = 'c'
order by pgc.conname
),
constraint_alias2 as (
select constraint_alias1.table_schema,
constraint_alias1.constraint_name,
constraint_alias1.table_name,
constraint_alias1.column_name,
alias2.*
from constraint_alias1
cross join LATERAL (
select i as funcname,
cntgroup as cnt
from (
select (
regexp_matches(
constraint_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1] i,
count(1) cntgroup
group by (
regexp_matches(
constraint_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1]
) t
) as alias2
where def ~* 'aws_oracle_ext.*'
),
index_alias1 as (
select alias1.proname,
nspname,
case
when relkind = 'i' then 'INDEX'
end as objType,
depend.relname,
pg_get_indexdef(depend.oid) def
from pg_depend
inner join (
select distinct pg_proc.oid as procoid,
nspname || '.' || proname as proname,
pg_namespace.oid
from pg_namespace,
pg_proc
where nspname = 'aws_oracle_ext'
and pg_proc.pronamespace = pg_namespace.oid
) alias1 on pg_depend.refobjid = alias1.procoid
inner join pg_class depend on depend.oid = pg_depend.objid
inner join pg_namespace ns on ns.oid = depend.relnamespace
where relkind = 'i'
),
index_alias2 as (
select index_alias1.nspname as SCHEMA,
index_alias1.relname as IndexName,
alias2.*
from index_alias1
cross join LATERAL (
select i as funcname,
cntgroup as cnt
from (
select (
regexp_matches(
index_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1] i,
count(1) cntgroup
group by (
regexp_matches(
index_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1]
) t
) as alias2
where def ~* 'aws_oracle_ext.*'
),
view_alias1 as (
select alias1.proname,
nspname,
case
when depend.relkind = 'v' then 'VIEW'
end as objType,
depend.relname,
pg_get_viewdef(depend.oid) def
from pg_depend
inner join (
select distinct pg_proc.oid as procoid,
nspname || '.' || proname as proname,
pg_namespace.oid
from pg_namespace,
pg_proc
where nspname = 'aws_oracle_ext'
and pg_proc.pronamespace = pg_namespace.oid
) alias1 on pg_depend.refobjid = alias1.procoid
inner join pg_rewrite on pg_rewrite.oid = pg_depend.objid
inner join pg_class depend on depend.oid = pg_rewrite.ev_class
inner join pg_namespace ns on ns.oid = depend.relnamespace
where not exists (
select 1
from pg_namespace
where pg_namespace.oid = depend.relnamespace
and nspname = 'aws_oracle_ext'
)
),
view_alias2 as (
select view_alias1.nspname as SCHEMA,
view_alias1.relname as ViewName,
alias2.*
from view_alias1
cross join LATERAL (
select i as funcname,
cntgroup as cnt
from (
select (
regexp_matches(
view_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1] i,
count(1) cntgroup
group by (
regexp_matches(
view_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1]
) t
) as alias2
where def ~* 'aws_oracle_ext.*'
),
trigger_alias1 as (
select distinct n.nspname as function_schema,
p.proname as function_name,
l.lanname as function_language,
(
select 'Y'
from pg_trigger
where tgfoid = (n.nspname || '.' || p.proname)::regproc
) as Trigger_Func,
lower(pg_get_functiondef(p.oid)::text) as def
from pg_proc p
left join pg_namespace n on p.pronamespace = n.oid
left join pg_language l on p.prolang = l.oid
left join pg_type t on t.oid = p.prorettype
where n.nspname not in (
'pg_catalog',
'information_schema',
'aws_oracle_ext'
)
and p.prokind not in ('a', 'w')
and l.lanname in ('sql', 'plpgsql')
order by function_schema,
function_name
),
trigger_alias2 as (
select trigger_alias1.function_schema,
trigger_alias1.function_name,
trigger_alias1.function_language,
trigger_alias1.Trigger_Func,
alias2.*
from trigger_alias1
cross join LATERAL (
select i as funcname,
cntgroup as cnt
from (
select (
regexp_matches(
trigger_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1] i,
count(1) cntgroup
group by (
regexp_matches(
trigger_alias1.def,
'aws_oracle_ext[.][a-z]*[_,a-z,$,"]*',
'ig'
)
) [1]
) t
) as alias2
where def ~* 'aws_oracle_ext.*'
and Trigger_Func = 'Y'
),
src as (
select tbl_alias2.schema as schemaName,
'N/A' as LANGUAGE,
'TableDefaultConstraints' as type,
tbl_alias2.table_name as typeName,
tbl_alias2.funcname as AWSExtensionDependency,
sum(cnt) as SCTFunctionReferenceCount
from tbl_alias2
group by tbl_alias2.schema,
tbl_alias2.table_name,
tbl_alias2.funcname
union
select function_schema as object_schema_name,
function_language as object_language,
'Procedures' as object_type,
function_name as object_name,
funcname as aws_extension_dependency,
sum(cnt) as sct_function_reference_count
from proc_alias2
where 1 = 1
group by function_schema,
function_language,
function_name,
funcname
union
select constraint_alias2.table_schema as schemaName,
'N/A' as LANGUAGE,
'TableCheckConstraints' as type,
constraint_alias2.table_name as typeName,
constraint_alias2.funcname as AWSExtensionDependency,
sum(cnt) as SCTFunctionReferenceCount
from constraint_alias2
group by constraint_alias2.table_schema,
constraint_alias2.table_name,
constraint_alias2.funcname
union
select index_alias2.Schema as schemaName,
'N/A' as LANGUAGE,
'TableIndexesAsFunctions' as type,
index_alias2.IndexName as typeName,
index_alias2.funcname as AWSExtensionDependency,
sum(cnt) as SCTFunctionReferenceCount
from index_alias2
group by index_alias2.Schema,
index_alias2.IndexName,
index_alias2.funcname
union
select view_alias2.Schema as schemaName,
'N/A' as LANGUAGE,
'Views' as type,
view_alias2.ViewName as typeName,
view_alias2.funcname as AWSExtensionDependency,
sum(cnt) as SCTFunctionReferenceCount
from view_alias2
group by view_alias2.Schema,
view_alias2.ViewName,
view_alias2.funcname
union
select function_schema as schemaName,
function_language as LANGUAGE,
'Triggers' as type,
function_name as typeName,
funcname as AWSExtensionDependency,
sum(cnt) as SCTFunctionReferenceCount
from trigger_alias2
where 1 = 1
group by function_schema,
function_language,
function_name,
funcname
)
select chr(34) || :PKEY || chr(34) as pkey,
chr(34) || :DMA_SOURCE_ID || chr(34) as dma_source_id,
chr(34) || :DMA_MANUAL_ID || chr(34) as dma_manual_id,
chr(34) || src.schemaName || chr(34) as schema_name,
chr(34) || src.LANGUAGE || chr(34) as object_language,
chr(34) || src.type || chr(34) as object_type,
chr(34) || src.typeName || chr(34) as object_name,
chr(34) || src.AWSExtensionDependency || chr(34) as aws_extension_dependency,
src.SCTFunctionReferenceCount as sct_function_reference_count
from src;