Hi Ashutosh,

On 2016/08/22 15:49, Ashutosh Bapat wrote:
1. deparsePlaceHolderVar looks odd - each of the deparse* function is
named as deparse + <name of the parser node the string would parse
into>. PlaceHolderVar is not a parser node, so no string is going to be
parsed as a PlaceHolderVar. May be you want to name it as
deparseExerFromPlaceholderVar or something like that.

The name "deparseExerFromPlaceholderVar" seems long to me. How about "deparsePlaceHolderExpr"?

2. You will need to check phlevelsup member while assessing whether a
PHV is safe to push down.

Good catch! In addition to that, I added another check that the eval_at set for the PHV should be included in the relids set for the foreign relation. I think that would make the shippability check more robust.

3. I think registerAlias stuff should happen really at the time of
creating paths and should be stored in fpinfo. Without that it will be
computed every time we deparse the query. This means every time we try
to EXPLAIN the query at various levels in the join tree and once for the
query to be sent to the foreign server.

Hmm. I think the overhead in calculating aliases would be negligible compared to the overhead in explaining each remote query for costing or sending the remote query for execution. So, I created aliases in the same way as remote params created and stored into params_list in deparse_expr_cxt. I'm not sure it's worth complicating the code.

4. The changes related to retrieved_attrs look unrelated to the patch.
Either your patch should use the current method of handling
retrieved_attrs or there should be a separate patch for retrieved_attrs
changes. May be you want to take a look at the discussion in join
pushdown thread as to why we assume retrieved_attrs to be non-NIL always.

OK, I removed those changes from the patch.

5. The blocks related to inner and outer relations in
deparseFromExprForRel() look same. We should probably separate that code
out into a function and call it at two places.

Done.

6.
!     if (is_placeholder)
!         errcontext("placeholder expression at position %d in select list",
!                    errpos->cur_attno);
A user wouldn't know what a placeholder expression is, there is no such
term in the documentation. We have to device a better way to provide an
error context for an expression in general.

Though I proposed that, I don't think that it's that important to let users know that the expression is from a PHV. How about just saying "expression", not "placeholder expression", so that we have the message "expression at position %d in select list" in the context?

Attached is an updated version of the patch.

Other changes:

* Add a bit more regression test
* Revise code/comments
* Cleanups

Thanks for the comments!

Best regards,
Etsuro Fujita

Attachment: postgres-fdw-more-full-join-pushdown-v2.patch
Description: binary/octet-stream

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to