BUG #17363: 14 regression: "could not identify a hash function for type record" in a nested record in sublink

Started by PG Bug reporting formover 4 years ago3 messagesbugs
Jump to latest
#1PG Bug reporting form
noreply@postgresql.org

The following bug has been logged on the website:

Bug reference: 17363
Logged by: Elvis Pranskevichus
Email address: elprans@gmail.com
PostgreSQL version: 14.0
Operating system: Linux
Description:

The following fails in PostgreSQL 14:

postgres14=# SELECT ROW(ROW(ROW(1))) = ANY (SELECT
(ROW(ROW(ROW(1)))).*);
ERROR: could not identify a hash function for type record

whereas PostgreSQL 13 works fine:

postgres13=# SELECT ROW(ROW(ROW(1))) = ANY (SELECT
(ROW(ROW(ROW(1)))).*);
?column?
──────────
t
(1 row)

Interestingly, reducing the nesting level to two works in 14:

postgres14=# SELECT ROW(ROW(1)) = ANY (SELECT (ROW(ROW(1))).*);
?column?
──────────
t
(1 row)

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: PG Bug reporting form (#1)
Re: BUG #17363: 14 regression: "could not identify a hash function for type record" in a nested record in sublink

PG Bug reporting form <noreply@postgresql.org> writes:

The following fails in PostgreSQL 14:

postgres14=# SELECT ROW(ROW(ROW(1))) = ANY (SELECT (ROW(ROW(ROW(1)))).*);
ERROR: could not identify a hash function for type record

whereas PostgreSQL 13 works fine:

It appears that we're trying to use a hashed subplan for the =ANY,
where v13 did not. So I'm inclined to blame this on 01e658fa7 (Hash
support for row types). We backed off the optimism level a bit in
a3d2b1bbe (Disable anonymous record hash support except in special
cases), but evidently didn't go far enough; or else it's doing the
wrong thing for nested RECORD types.

regards, tom lane

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Tom Lane (#2)
Re: BUG #17363: 14 regression: "could not identify a hash function for type record" in a nested record in sublink

I wrote:

It appears that we're trying to use a hashed subplan for the =ANY,
where v13 did not. So I'm inclined to blame this on 01e658fa7 (Hash
support for row types). We backed off the optimism level a bit in
a3d2b1bbe (Disable anonymous record hash support except in special
cases), but evidently didn't go far enough; or else it's doing the
wrong thing for nested RECORD types.

Ugh, found it: hash_ok_operator() is not accounting for this case.

if (opid == ARRAY_EQ_OP)
{
/* array_eq is strict, but must check input type to ensure hashable */
/* XXX record_eq will need same treatment when it becomes hashable */
Node *leftarg = linitial(expr->args);

return op_hashjoinable(opid, exprType(leftarg));
}

Will fix.

regards, tom lane