Question on partition pruning involving stable operator: timestamptz_ge_date

Поиск
Список
Период
Сортировка
От TAO TANG
Тема Question on partition pruning involving stable operator: timestamptz_ge_date
Дата
Msg-id CAM7-PtGpTMG2wusALf33a0-jZgSEy5AKYoL1WOa3KFrSOENtHQ@mail.gmail.com
обсуждение исходный текст
Ответы Re: Question on partition pruning involving stable operator: timestamptz_ge_date  (Amit Langote <amitlangote09@gmail.com>)
Список pgsql-hackers
Hi,

I tested the following case in PostgreSQL master:58e2e6

the partition table created:

    create table tbl_dts (dts timestamp with time zone not null) partition by range(dts);
    create table tbl_dts_1 partition of tbl_dts for values from ('2021-07-02') to ('2021-08-01');
    create table tbl_dts_2 partition of tbl_dts for values from ('2021-08-02') to ('2021-09-01');
    create table tbl_dts_3 partition of tbl_dts for values from ('2021-09-02') to ('2021-10-01');
    create table tbl_dts_4 partition of tbl_dts for values from ('2021-10-02') to ('2021-11-01');

and the query:

    explain select * from tbl_dts where dts between '2022-01-20'::date and '2022-01-26'::date;

                 QUERY PLAN                  
---------------------------------------------
 Append  (cost=0.00..175.82 rows=44 width=8)
   Subplans Removed: 4
(2 rows)

the plan shows all the partitions are pruned, but in gdb tracing, it shows that
the pruning happens in ExecInitAppend, and during planning stage pg does not
prune any partitions. this is because in function match_clause_to_partition_key
do not handle the case for STABLE operator:

if (op_volatile(opno) != PROVOLATILE_IMMUTABLE)
{
context->has_mutable_op = true;

/*
* When pruning in the planner, we cannot prune with mutable
* operators.
*/
if (context->target == PARTTARGET_PLANNER)
return PARTCLAUSE_UNSUPPORTED;
}

the procs for timestamptz compare with date are STABLE:

       proname        | provolatile
----------------------+-------------
 timestamptz_lt_date  | s
 timestamptz_le_date  | s
 timestamptz_eq_date  | s
 timestamptz_gt_date  | s
 timestamptz_ge_date  | s
 timestamptz_ne_date  | s
 timestamptz_cmp_date | s
(7 rows)

but in ExecInitAppend call perform_pruning_base_step which do not consider the STABLE
property of the cmpfn.

so I have serveral questions:
1) why in planning the function volatility is considered but not in execInitAppend;
2) why timestamptz_xxx_date is STABLE not IMMUTABLE;

thanks.

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

Предыдущее
От: Nathan Bossart
Дата:
Сообщение: Re: Two noncritical bugs of pg_waldump
Следующее
От: Kyotaro Horiguchi
Дата:
Сообщение: Re: Make mesage at end-of-recovery less scary.