Skip to content

Commit 6478896

Browse files
committed
Teach hash_ok_operator() that record_eq is only sometimes hashable.
The need for this was foreseen long ago, but when record_eq actually became hashable (in commit 01e658f), we missed updating this spot. Per bug #17363 from Elvis Pranskevichus. Back-patch to v14 where the faulty commit came in. Discussion: https://postgr.es/m/17363-f6d42fd0d726be02@postgresql.org
1 parent fe75517 commit 6478896

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

src/backend/optimizer/plan/subselect.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -848,10 +848,10 @@ hash_ok_operator(OpExpr *expr)
848848
/* quick out if not a binary operator */
849849
if (list_length(expr->args) != 2)
850850
return false;
851-
if (opid == ARRAY_EQ_OP)
851+
if (opid == ARRAY_EQ_OP ||
852+
opid == RECORD_EQ_OP)
852853
{
853-
/* array_eq is strict, but must check input type to ensure hashable */
854-
/* XXX record_eq will need same treatment when it becomes hashable */
854+
/* these are strict, but must check input type to ensure hashable */
855855
Node *leftarg = linitial(expr->args);
856856

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

src/test/regress/expected/subselect.out

+23
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,29 @@ select 'foo'::text in (select 'bar'::name union all select 'bar'::name);
789789
f
790790
(1 row)
791791

792+
--
793+
-- Test that we don't try to hash nested records (bug #17363)
794+
-- (Hashing could be supported, but for now we don't)
795+
--
796+
explain (verbose, costs off)
797+
select row(row(row(1))) = any (select row(row(1)));
798+
QUERY PLAN
799+
-------------------------------------------
800+
Result
801+
Output: (SubPlan 1)
802+
SubPlan 1
803+
-> Materialize
804+
Output: '("(1)")'::record
805+
-> Result
806+
Output: '("(1)")'::record
807+
(7 rows)
808+
809+
select row(row(row(1))) = any (select row(row(1)));
810+
?column?
811+
----------
812+
t
813+
(1 row)
814+
792815
--
793816
-- Test case for premature memory release during hashing of subplan output
794817
--

src/test/regress/sql/subselect.sql

+10
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,16 @@ select 'foo'::text in (select 'bar'::name union all select 'bar'::name);
463463

464464
select 'foo'::text in (select 'bar'::name union all select 'bar'::name);
465465

466+
--
467+
-- Test that we don't try to hash nested records (bug #17363)
468+
-- (Hashing could be supported, but for now we don't)
469+
--
470+
471+
explain (verbose, costs off)
472+
select row(row(row(1))) = any (select row(row(1)));
473+
474+
select row(row(row(1))) = any (select row(row(1)));
475+
466476
--
467477
-- Test case for premature memory release during hashing of subplan output
468478
--

0 commit comments

Comments
 (0)