Assert failure in _bt_preprocess_array_keys

Richard Guo <guofenglinux@gmail.com>

From: Richard Guo <guofenglinux@gmail.com>
To: PostgreSQL-development <pgsql-hackers@postgresql.org>
Cc: Peter Geoghegan <pg@bowt.ie>
Date: 2024-04-22T02:36:13Z
Lists: pgsql-hackers
I came across an assert failure in _bt_preprocess_array_keys regarding
the sanity check on the datatype of the array elements.  It can be
reproduced with the query below.

create table t (c int4range);
create unique index on t (c);

select * from t where c in ('(1, 100]'::int4range, '(50, 300]'::int4range);

It fails on this Assert:

+               elemtype = cur->sk_subtype;
+               if (elemtype == InvalidOid)
+                       elemtype = rel->rd_opcintype[cur->sk_attno - 1];
+               Assert(elemtype == ARR_ELEMTYPE(arrayval));

... which was introduced in 5bf748b86b.

I didn't spend much time digging into it, but I wonder if this Assert is
sensible.  I noticed that before commit 5bf748b86b, the two datatypes
were not equal to each other either (anyrange vs. int4range).

Thanks
Richard

Commits

  1. Remove overzealous array element type assertion.

  2. Enhance nbtree ScalarArrayOp execution.