WITH named_objects AS (
SELECT
translate(substring(specific_name,'_[0-9]+$'),'_','')::int::oid AS oid,
specific_schema || '.' || regexp_replace(specific_name,'_[0-9]*$','') || '(' || pg_get_function_identity_arguments(translate(substring(specific_name,'_[0-9]+$'),'_','')::int::oid) || ')' AS container_name,
'ROUTINE' AS container_type,
parameter_name AS object_name,
'PARAMETER' AS object_type,
data_type
FROM information_schema.parameters
WHERE specific_schema NOT IN (SELECT schema_name
FROM INFORMATION_SCHEMA.schemata
WHERE schema_name<>'public' AND
schema_owner='postgres' AND schema_name IS NOT NULL) AND parameter_name IS NOT NULL
UNION ALL SELECT
c.oid,
n.nspname || '.' || c.relname AS container_name,
CASE WHEN c.relkind='r' THEN 'BASE TABLE'
WHEN c.relkind='v' THEN 'VIEW'
WHEN c.relkind='m' THEN 'MATERIALIZED VIEW'
WHEN c.relkind='f' THEN 'FOREIGN TABLE'
WHEN c.relkind='p' THEN 'PARTITIONED TABLE'
ELSE 'TABLE' END AS container_type,
at.attname AS object_name,
'COLUMN' AS object_type,
co.data_type
FROM pg_attribute at INNER JOIN pg_class c ON at.attrelid=c.oid
INNER JOIN pg_namespace AS n ON n.oid=c.relnamespace
INNER JOIN pg_authid AS a ON n.nspowner=a.oid
INNER JOIN INFORMATION_SCHEMA.columns AS co ON co.table_schema=n.nspname AND co.table_name=c.relname AND co.column_name=at.attname
WHERE (nspname='public' OR rolname<>'postgres')
AND c.relkind IN ('r','v','m','f','p')
AND at.attisdropped='f'
AND at.attnum>0
),
named_user_defined_objects AS (
SELECT container_name, container_type, object_name, object_type, data_type
FROM named_objects nob
WHERE NOT EXISTS (SELECT 1
FROM pg_catalog.pg_depend d
WHERE EXISTS (SELECT 1 FROM pg_catalog.pg_extension e WHERE d.refobjid=e.oid) AND
d.objid=nob.oid)
)
SELECT container_name, container_type, regexp_replace(object_name, '_(integer|int|smallint|bigint|char|varchar|boolean|float|decimal|numeric|double|timestamp)$', E'<b>_\\1</b>', 'g') AS suspected_name, object_type, data_type
FROM named_user_defined_objects
WHERE object_name~*'_(integer|int|smallint|bigint|char|varchar|boolean|float|decimal|numeric|double|timestamp)$'
ORDER BY object_type, container_name, object_name;