WITH comments_on_routines AS (
SELECT
n.nspname AS routine_schema,
p.proname AS routine_name,
pg_get_function_identity_arguments(p.oid) AS parameters,
d.description AS comment
FROM pg_catalog.pg_proc p INNER JOIN pg_catalog.pg_namespace n ON p.pronamespace = n.oid
LEFT JOIN pg_catalog.pg_description d ON p.oid=d.objoid
WHERE n.nspname NOT IN (SELECT schema_name
FROM INFORMATION_SCHEMA.schemata
WHERE schema_name<>'public' AND
schema_owner='postgres' AND schema_name IS NOT NULL)
AND p.proname NOT IN ('f_assume_you_must_use_files', 'f_check_format_comma_separated_list', 'f_check_password', 'f_default_value_with_no_match')
AND 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=p.oid)
AND d.description LIKE '%OP%'),
user_defined_routines AS (
SELECT
routines.routine_schema,
routines.routine_name,
pg_get_function_identity_arguments(translate(substring(specific_name,'_[0-9]+$'),'_','')::int::oid) AS parameters,
routines.data_type AS return_type,
routines.is_deterministic,
routines.routine_type,
routines.security_type,
routines.external_language,
regexp_replace(pg_get_functiondef(translate(substring(routines.specific_name,'_[0-9]+$'),'_','')::int::oid),'[\r\n]','<br>','g') AS routine_src
FROM
information_schema.routines
WHERE routine_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 (data_type<>'trigger' OR data_type IS NULL)
AND routine_name NOT IN ('f_assume_you_must_use_files', 'f_check_format_comma_separated_list', 'f_check_password', 'f_default_value_with_no_match')
AND NOT EXISTS (SELECT 1
FROM pg_catalog.pg_depend d inner join pg_catalog.pg_proc pc ON d.objid=pc.oid
WHERE EXISTS (SELECT 1 FROM pg_catalog.pg_extension e WHERE d.refobjid=e.oid) AND
pc.proname || '_' || pc.oid = routines.specific_name))
SELECT routine_schema, routine_name, parameters, return_type, is_deterministic, routine_type, security_type, external_language, routine_src
FROM user_defined_routines INNER JOIN comments_on_routines USING (routine_schema, routine_name, parameters)
WHERE (SELECT Count(*)>=8 FROM comments_on_routines AS cr WHERE comment LIKE '%OP%')
ORDER BY routine_schema, routine_name, parameters;