SELECT pg_namespace.nspname AS routine_schema, pg_proc.proname AS routine_name,
pg_get_function_identity_arguments(pg_proc.oid) AS parameters,
CASE WHEN pg_proc.prokind='f' THEN 'FUNCTION'
WHEN pg_proc.prokind='p' THEN 'PROCEDURE'
WHEN pg_proc.prokind='a' THEN 'AGGREGATE FUNCTION'
WHEN pg_proc.prokind='w' THEN 'WINDOW FUNCTION' END AS routine_type,
regexp_replace(pg_proc.prosrc,'[\r\n]','<br>','g') AS routine_src
FROM pg_catalog.pg_proc, pg_catalog.pg_namespace
WHERE pg_proc.pronamespace = pg_namespace.oid AND
pg_proc.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
pg_namespace.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 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=pg_proc.oid) AND
(
(pg_proc.prosrc~*'(?<!--[^\n]*)SELECT[[:space:]]' AND pg_proc.prosrc!~'(?<!--[^\n]*)SELECT[[:space:]]')
OR (pg_proc.prosrc~*'(?<!((--|'')|'')[^\n]*)FROM[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)FROM[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)WHERE[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)WHERE[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)GROUP[[:space:]]+BY[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)GROUP[[:space:]]+BY[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)HAVING[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)HAVING[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)ORDER[[:space:]]+BY[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)ORDER[[:space:]]+BY[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)LIMIT[[:space:]]+' AND pg_proc.prosrc!~'LIMIT[[:space:]]+')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)FETCH[[:space:]]+FIRST[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)FETCH[[:space:]]+FIRST[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)INSERT[[:space:]]+INTO[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)INSERT[[:space:]]+INTO[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)UPDATE[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)UPDATE[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)DELETE[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)DELETE[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)COMMIT[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)COMMIT[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)ROLLBACK[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)ROLLBACK[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)DECLARE[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)DECLARE[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)BEGIN[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)BEGIN[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)RETURN[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)RETURN[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)END[[:space:]]*;' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)END[[:space:]]*;')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)INNER[[:space:]]+JOIN[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)INNER[[:space:]]+JOIN[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)LEFT[[:space:]]+JOIN[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)LEFT[[:space:]]+JOIN[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)RIGHT[[:space:]]+JOIN[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)RIGHT[[:space:]]+JOIN[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)CROSS[[:space:]]+JOIN[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)CROSS[[:space:]]+JOIN[[:space:]]')
OR (pg_proc.prosrc~*'(?<!(--|'')[^\n]*)FULL[[:space:]]+JOIN[[:space:]]' AND pg_proc.prosrc!~'(?<!(--|'')[^\n]*)FULL[[:space:]]+JOIN[[:space:]]')
)
ORDER BY routine_schema, routine_name, parameters;