From: | David Rowley <dgrowleyml(at)gmail(dot)com> |
---|---|
To: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>, Amit Langote <amitlan(at)postgresql(dot)org>, Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org> |
Cc: | exclusion(at)gmail(dot)com, pgsql-bugs(at)lists(dot)postgresql(dot)org |
Subject: | Re: BUG #18344: Pruning tables partitioned by bool range fails with invalid strategy |
Date: | 2024-02-18 12:53:29 |
Message-ID: | CAApHDvoFbt0fne1C_prK5j0MvxHccJD7NxUY0UDaTtAZuEyxrg@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-bugs |
On Sat, 17 Feb 2024 at 01:32, David Rowley <dgrowleyml(at)gmail(dot)com> wrote:
> I see three options:
>
> 1) Make get_matching_list_bounds() work for bool IS NOT clauses by
> properly including the NULL partition when handling a bool IS NOT
> clause.
> 2) Just don't generate a pruning step for bool IS NOT clauses.
> 3) Just always include the NULL partition in
> get_matching_list_bounds's "if (opstrategy == InvalidStrategy)" block.
It turns out there's a 4th, and much better option that allows this
just to work without any weirdness.
The method used in partprune.c to handle "partkey IN ('const1',
'const2')" is to transform that into "partkey = 'const1' OR partkey =
'const2'". Whenever we see a ScalarArrayOpExpr with consts, we just
form such an OR clause and recursively generate pruning steps for the
OR clause. That'll end up creating two pruning steps and combining
them with a PARTPRUNE_COMBINE_UNION.
We can do the same for BooleanTests. Given a clause such as: "partkey
IS NOT false", we can just generate the clause "partkey IS true OR
partkey IS NULL" and recursively generate steps for that.
I've attached a draft patch. I'll work on this more after I sleep.
I'm tempted to go a bit further in master only and add support for
bool IS NOT UNKNOWN and bool IS UNKNOWN using the same method.
David
Attachment | Content-Type | Size |
---|---|---|
fix_partprune_BooleanTests_draft.patch | text/plain | 2.9 KB |
From | Date | Subject | |
---|---|---|---|
Next Message | Tom Lane | 2024-02-18 16:24:59 | Re: BUG #18344: Pruning tables partitioned by bool range fails with invalid strategy |
Previous Message | Tom Lane | 2024-02-18 02:19:08 | Re: BUG #18348: Inconsistency with EXTRACT([field] from INTERVAL); |