Re: BUG #18344: Pruning tables partitioned by bool range fails with invalid strategy
Tender Wang <tndrwang@gmail.com>
From: Tender Wang <tndrwang@gmail.com>
To: David Rowley <dgrowleyml@gmail.com>
Cc: Tom Lane <tgl@sss.pgh.pa.us>, Amit Langote <amitlan@postgresql.org>, Alvaro Herrera <alvherre@alvh.no-ip.org>, exclusion@gmail.com, pgsql-bugs@lists.postgresql.org
Date: 2024-02-19T08:21:11Z
Lists: pgsql-bugs
David Rowley <dgrowleyml@gmail.com> 于2024年2月19日周一 07:49写道:
> On Mon, 19 Feb 2024 at 05:25, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> >
> > David Rowley <dgrowleyml@gmail.com> writes:
> > > 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.
> >
> > +1 ... sounds clean and clearly correct.
>
> Here's a more complete patch for this. I included some tests for LIST
> and RANGE partitioned tables. I did manual testing for HASH, and was
> on the fence about covering that too.
>
> I did try the following using the table from the tests:
>
> select * from boolrangep where a is not true and not b and c = 25 and
> a is not null;
>
> When will be effectively transformed into:
>
> select * from boolrangep where (a is false or a is null) and not b and
> c = 25 and a is not null;
>
> It seems that's unable to prune the NULL partition but that mostly
> seems to be due to a limitation of the current design. I'm not sure
> it's worth going to any additional trouble to make that work. It
> seems a bit unlikely, especially so given how long the BooleanTest
> pruning stuff was broken for before anyone noticed.
>
> > > 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.
> >
> > These are the same as IS NOT NULL and IS NULL, so I don't see the
> > need for an OR?
>
> Uh, yeah. True. That makes it even more simple. Just use
> PARTCLAUSE_MATCH_NULLNESS.
>
> David
>
After git apply fix_partprune_BooleanTests.patch on master, I got below
warnings:
partprune.c: In function ‘match_clause_to_partition_key’:
../../../src/include/nodes/nodes.h:221:25: warning: initialization of
‘BooleanTest *’ {aka ‘struct BooleanTest *’} from incompatible pointer type
‘Expr *’ {aka ‘struct Expr *’} [-Wincompatible-pointer-types]
221 | #define copyObject(obj) ((typeof(obj)) copyObjectImpl(obj))
| ^
partprune.c:1824:32: note: in expansion of macro ‘copyObject’
1824 | BooleanTest *new_booltest = copyObject(clause);
Maybe this: BooleanTest *new_booltest = (BooleanTest *) copyObject(clause);
--
Tender Wang
OpenPie: https://en.openpie.com/
Commits
-
Minor corrections for partition pruning
- d2ca9a50b5b9 17.0 landed
-
Fix incorrect pruning of NULL partition for boolean IS NOT clauses
- 3ffcd24c29c6 12.19 landed
- 3850fcca69b5 13.15 landed
- f9c8f7ccd6e3 14.12 landed
- 1b3495e29db6 15.7 landed
- fb95cc72bfe7 16.3 landed
- 4c2369ac5d0a 17.0 landed