On Tue, 16 Apr 2019 at 23:55, Yuzuko Hosoya <hosoya.yuz...@lab.ntt.co.jp> wrote:
> postgres=# explain analyze select * from t1 where dt = current_date + 400;
>                                       QUERY PLAN
> ---------------------------------------------------------------------------------------
>  Append  (cost=0.00..198.42 rows=44 width=8) (actual time=0.000..0.001 rows=0 
> loops=1)
>    Subplans Removed: 3
>    ->  Seq Scan on t1_1  (cost=0.00..49.55 rows=11 width=8) (never executed)
>          Filter: (dt = (CURRENT_DATE + 400))
>  Planning Time: 0.400 ms
>  Execution Time: 0.070 ms
> (6 rows)
> ----
>
> I realized t1_1 was not scanned actually since "never executed"
> was displayed in the plan using EXPLAIN ANALYZE.  But I think
> "One-Time Filter: false" and "Subplans Removed: ALL" or something
> like that should be displayed instead.
>
> What do you think?

This is intended behaviour explained by the following comment in nodeAppend.c

/*
* The case where no subplans survive pruning must be handled
* specially.  The problem here is that code in explain.c requires
* an Append to have at least one subplan in order for it to
* properly determine the Vars in that subplan's targetlist.  We
* sidestep this issue by just initializing the first subplan and
* setting as_whichplan to NO_MATCHING_SUBPLANS to indicate that
* we don't really need to scan any subnodes.
*/

It's true that there is a small overhead in this case of having to
initialise a useless subplan, but the code never tries to pull any
tuples from it, so it should be fairly minimal.  I expected that using
a value that matches no partitions would be unusual enough not to go
contorting explain.c into working for this case.

-- 
 David Rowley                   http://www.2ndQuadrant.com/
 PostgreSQL Development, 24x7 Support, Training & Services


Reply via email to