Find user-defined non-trigger SQL and PL/pgSQL routines where the beginning of the name of the routine indicates a certain action inside the routine (INSERT, UPDATE, or DELETE) but there is no such statement in the routine body.
Type
Problem detection (Each row in the result could represent a flaw in the design)
SELECT
routine_schema,
routine_name,
pg_get_function_identity_arguments(translate(substring(routines.specific_name,'_[0-9]+$'),'_','')::int::oid) AS parameters,
data_type AS return_type,
is_deterministic,
routine_type,
security_type,
external_language,
regexp_replace(pg_get_functiondef(translate(substring(routines.specific_name,'_[0-9]+$'),'_','')::int::oid),'[\r\n]',' ','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 external_language IN ('PLPGSQL','SQL')
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)
AND (data_type<>'trigger' OR data_type IS NULL)
AND
(
(routine_name~*'^(registreeri|lisa|logi|register|add|log)'
AND pg_get_functiondef(translate(substring(routines.specific_name,'_[0-9]+$'),'_','')::int::oid)!~*'[[:space:]]*(INSERT|UPDATE)[[:space:]]')
OR
(routine_name~*'^(uuenda|muuda|update|change)'
AND pg_get_functiondef(translate(substring(routines.specific_name,'_[0-9]+$'),'_','')::int::oid)!~*'[[:space:]]*UPDATE[[:space:]]')
OR
(routine_name~*'^(kustuta|eemalda|tyhista|delete|remove|cancel)'
AND pg_get_functiondef(translate(substring(routines.specific_name,'_[0-9]+$'),'_','')::int::oid)!~*'[[:space:]]*(DELETE|UPDATE)[[:space:]]')
)
ORDER BY routine_schema, routine_name, parameters;
Collections
This query belongs to the following collections:
Name
Description
Find problems automatically
Queries, that results point to problems in the database. Each query in the collection produces an initial assessment. However, a human reviewer has the final say as to whether there is a problem or not .
Categories
This query is classified under the following categories:
Name
Description
Naming
Queries of this category provide information about the style of naming.
User-defined routines
Queries of this category provide information about the user-defined routines