From: Andrei Lepikhov <a.lepikhov@postgrespro.ru>
To: Richard Guo <guofenglinux@gmail.com>
To: zuming.jiang@inf.ethz.ch
To: pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #18260: Unexpected error: "negative bitmapset member not allowed" triggered by multiple JOIN
Date: Thu, 28 Dec 2023 11:30:42 +0700
Message-ID: <ac1454ad-dc4d-467c-9a5a-11709ba33195@postgrespro.ru> (raw)
In-Reply-To: <CAMbWs4-7ZRRuaXpksRR2so3XW+gdRWPMiAuSGqdfgy9fFaUCDg@mail.gmail.com>
References: <18260-1b6a0c4ae311b837@postgresql.org>
<CAMbWs4-tpHZyE-aEqhYt_aLtKU0YbcXBgz_GXG0EVHQXhSrENA@mail.gmail.com>
<CAMbWs4-7ZRRuaXpksRR2so3XW+gdRWPMiAuSGqdfgy9fFaUCDg@mail.gmail.com>
On 28/12/2023 10:03, Richard Guo wrote:
> During that time, join removal was only performed for left joins, so it
> was not possible for 'ojrelid' to be negative. However, with the
> introduction of the SJE feature, inner joins can also be removed, and
> 'ojrelid' is set to -1 in the inner join case. That's how we see this
> error.
Agreed, I have come to the same conclusion.
> if (bms_is_subset(phinfo->ph_needed, joinrelids) &&
> bms_is_member(relid, phinfo->ph_eval_at) &&
> - !bms_is_member(ojrelid, phinfo->ph_eval_at))
> + (sjinfo == NULL || !bms_is_member(ojrelid, phinfo->ph_eval_at)))
It would be better to check "ojrelid >= 0" as a sign. But why do you
think SJE could need to delete PlaceHolderVar at all?
>
> Alternatively, we can modify bms_is_member() to return false for
> negative numbers instead of emitting an error, as suggested by the
> comment there.
> - /* XXX better to just return false for x<0 ? */
> + /* negative number cannot be a member of the bitmapset */
> if (x < 0)
> - elog(ERROR, "negative bitmapset member not allowed");
> + return false;
>
> I prefer the second option, but I'm open to other thoughts.
I don't like this option. It could mask some blunders somewhere like a
current one.
> FWIW, here is a simplified repro for this error.
>
> create table t (a int primary key, b int);
>
> explain (verbose, costs off)
> select 1 from t t1 left join
> (lateral (select 1 as x, * from t t2) s1 inner join
> (select * from t t3) s2 on s1.a = s2.a)
> on true
> where s1.x = 1;
> ERROR: negative bitmapset member not allowed
It can be simplified even more (without LATERAL):
explain (verbose, costs off)
select 1 from t t1 left join
(select 1 as x, * from t t2) s1 inner join
(select * from t t3) using (a)
on true
where s1.x = 1;
--
regards,
Andrei Lepikhov
Postgres Professional
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: a.lepikhov@postgrespro.ru, guofenglinux@gmail.com, zuming.jiang@inf.ethz.ch, pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #18260: Unexpected error: "negative bitmapset member not allowed" triggered by multiple JOIN
In-Reply-To: <ac1454ad-dc4d-467c-9a5a-11709ba33195@postgrespro.ru>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox