Re: Problem, partition pruning for prepared statement with IS NULL clause.

Поиск
Список
Период
Сортировка
От tender wang
Тема Re: Problem, partition pruning for prepared statement with IS NULL clause.
Дата
Msg-id CAHewXNn8gAxh196v3tPyuFTrMOr4_2_eROQokOvPsecP+80Xqg@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Problem, partition pruning for prepared statement with IS NULL clause.  (David Rowley <dgrowleyml@gmail.com>)
Список pgsql-hackers
For hash partition table, if partition key is IS NULL clause,  the condition in if  in get_steps_using_prefix_recurse:
if (cur_keyno < step_lastkeyno - 1) 
is not enough.
Like the decode crashed case, explain select * from hp where a = 1 and b is null and c = 1;
prefix list just has a = 1 clause.
I try fix this in attached patch.
David Rowley <dgrowleyml@gmail.com> 于2023年10月11日周三 10:50写道:
On Tue, 10 Oct 2023 at 21:31, Sergei Glukhov <s.glukhov@postgrespro.ru> wrote:
> create table hp (a int, b text, c int, d int)
>    partition by hash (a part_test_int4_ops, b part_test_text_ops, c
> part_test_int4_ops);
> create table hp0 partition of hp for values with (modulus 4, remainder 0);
> create table hp3 partition of hp for values with (modulus 4, remainder 3);
> create table hp1 partition of hp for values with (modulus 4, remainder 1);
> create table hp2 partition of hp for values with (modulus 4, remainder 2);
>
>
> Another crash in the different place even with the fix:
> explain select * from hp where a = 1 and b is null and c = 1;

Ouch.  It looks like 13838740f tried to fix things in this area before
and even added a regression test for it. Namely:

-- Test that get_steps_using_prefix() handles non-NULL step_nullkeys
explain (costs off) select * from hp_prefix_test where a = 1 and b is
null and c = 1 and d = 1;

I guess that one does not crash because of the "d = 1" clause is in
the "start" ListCell in get_steps_using_prefix_recurse(), whereas,
with your case start is NULL which is an issue for cur_keyno =
((PartClauseInfo *) lfirst(start))->keyno;.

It might have been better if PartClauseInfo could also describe IS
NULL quals, but I feel if we do that now then it would require lots of
careful surgery in partprune.c to account for that.  Probably the fix
should be localised to get_steps_using_prefix_recurse() to have it do
something like pass the keyno to try and work on rather than trying to
get that from the "prefix" list. That way if there's no item in that
list for that keyno, we can check in step_nullkeys for the keyno.

I'll continue looking.

David


Вложения

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Michael Paquier
Дата:
Сообщение: Re: Add a new BGWORKER_BYPASS_ROLELOGINCHECK flag
Следующее
От: Peter Geoghegan
Дата:
Сообщение: Re: interval_ops shall stop using btequalimage (deduplication)