Jeevan Chalke <jeevan.cha...@enterprisedb.com> wrote:

> On Thu, Nov 30, 2017 at 3:44 PM, Jeevan Chalke 
> <jeevan.cha...@enterprisedb.com> wrote:
> 
>  On Thu, Nov 30, 2017 at 1:36 AM, Antonin Houska <a...@cybertec.at> wrote:
> 
>  The following test
> 
>  -- Input relation to aggregate push down hook is not safe to pushdown and 
> thus
>  -- the aggregate cannot be pushed down to foreign server.
>  explain (verbose, costs off)
>  select count(t1.c3) from ft1 t1, ft1 t2 where t1.c1 = 
> postgres_fdw_abs(t1.c2);
> 
>  produces the following plan
> 
>  QUERY PLAN
>  
> ----------------------------------------------------------------------------------------------------------
>  Aggregate
>  Output: count(t1.c3)
>  -> Nested Loop
>  Output: t1.c3
>  -> Foreign Scan on public.ft1 t2
>  Remote SQL: SELECT NULL FROM "S 1"."T 1"
>  -> Materialize
>  Output: t1.c3
>  -> Foreign Scan on public.ft1 t1
>  Output: t1.c3
>  Remote SQL: SELECT c3 FROM "S 1"."T 1" WHERE (("C 1" = 
> public.postgres_fdw_abs(c2)))
> 
>  which is not major problem as such, but gdb shows that the comment "aggregate
>  cannot be pushed" is not correct. In fact, postgresGetForeignUpperPaths()
>  *does* create the upper path.
> 
>  The reason that UPPERREL_GROUP_AGG is eventually not used seems to be that
>  postgresGetForeignJoinPaths() -> add_foreign_grouping_paths() ->
>  estimate_path_cost_size() estimates the join cost in rather generic way. 
> While
>  the remote server can push the join clause down to the inner relation of NL,
>  the postgres_fdw cost computation assumes that the join clause is applied to
>  each pair of output and input tuple.
> 
>  I don't think that the postgres_fdw's estimate can be fixed easily, but if 
> the
>  impact of "shipability" on (not) using the upper relation should be tested, 
> we
>  need a different test.
> 
>  Oops. My bad.
>  Agree with your analysis.
>  Will send a patch fixing this testcase.
> 
> Attached patch to fix the test case. In new test case I am using a JOIN
> query where JOIN condition is not safe to push down and hence the JOIN
> itself is unsafe.

I've just verified that postgresGetForeignUpperPaths() does return here:

        /*
         * If input rel is not safe to pushdown, then simply return as we cannot
         * perform any post-join operations on the foreign server.
         */
        if (!input_rel->fdw_private ||
                !((PgFdwRelationInfo *) input_rel->fdw_private)->pushdown_safe)
                return;

I see no other problems here. You may need to add the patch to the next CF so
it does not get lost.

-- 
Antonin Houska
Cybertec Schönig & Schönig GmbH
Gröhrmühlgasse 26
A-2700 Wiener Neustadt
Web: http://www.postgresql-support.de, http://www.cybertec.at

Reply via email to