Hello!
I tested the patch, and I see two possible issues with it
1. It seems to only look for direct operands:
create type t_rec as (a numeric, b int);
create table t_having (id int, r t_rec);
insert into t_having values
(1, row(100,1)::t_rec),
(2, row(100.0,1)::t_rec),
(3, row(2,2)::t_rec);
select r, count(*) from t_having group by r having r *=
row(100,1)::t_rec; -- 2, correct
select r, count(*) from t_having group by r having
row((r).a,(r).b)::t_rec *= row(100,1)::t_rec; -- 1, incorrect
2. unknown operators (non btree/hash) seem to behave incorrectly, they
default to non-conflicting but they should conflict?
CREATE FUNCTION num_image_eq(numeric, numeric) RETURNS bool
LANGUAGE sql IMMUTABLE AS $$ SELECT $1::text = $2::text $$;
CREATE OPERATOR === (LEFTARG = numeric, RIGHTARG = numeric, FUNCTION =
num_image_eq);
CREATE TABLE g_hole (g numeric, v int);
INSERT INTO g_hole VALUES (100, 1), (100.0, 2), (100.00, 3);
SELECT g, count(*), sum(v) FROM g_hole GROUP BY g; -- 100 | 3 | 6
SELECT g, count(*), sum(v) FROM g_hole GROUP BY g HAVING g === 100.0;
-- 100 | 1 | 2