WITH updates AS (
SELECT
s.userid,
s.dbid,
s.queryid,
s.calls,
s.query,
(
regexp_match(
regexp_replace(s.query, '[[:space:]]+', ' ', 'g'),
$re$\mSET\M(.*?)(\mWHERE\M|\mRETURNING\M|$)$re$,
'i'
)
)[1] AS set_clause
FROM pg_stat_statements s
WHERE s.query ~* '^[[:space:]]*UPDATE[[:space:]]'
),
matches AS (
SELECT
u.*,
regexp_match(
u.set_clause,
$re$\m([a-z_][a-z0-9_$]*)\M[[:space:]]*=[[:space:]]*(?:\m[a-z_][a-z0-9_$]*\M[[:space:]]*\.[[:space:]]*)?\1\M[[:space:]]*(?:,|$)$re$,
'i'
) AS self_assignment
FROM updates u
WHERE u.set_clause IS NOT NULL
)
SELECT
d.datname AS database_name,
pg_get_userbyid(m.userid) AS user_name,
m.queryid,
m.calls,
m.self_assignment[1] AS self_assigned_column,
m.set_clause,
m.query
FROM matches m
JOIN pg_database d
ON d.oid = m.dbid
WHERE m.self_assignment IS NOT NULL
ORDER BY m.calls DESC;