Обсуждение: BUG #17363: 14 regression: "could not identify a hash function for type record" in a nested record in sublink

Поиск
Список
Период
Сортировка

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

От
PG Bug reporting form
Дата:
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)


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



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