Re: Expression errors with "FOR UPDATE" and postgres_fdw with partitionwise join enabled. - Mailing list pgsql-hackers
From | Etsuro Fujita |
---|---|
Subject | Re: Expression errors with "FOR UPDATE" and postgres_fdw with partitionwise join enabled. |
Date | |
Msg-id | 5AF59415.10309@lab.ntt.co.jp Whole thread Raw |
In response to | Re: Expression errors with "FOR UPDATE" and postgres_fdw withpartition wise join enabled. (Ashutosh Bapat <ashutosh.bapat@enterprisedb.com>) |
Responses |
Re: Expression errors with "FOR UPDATE" and postgres_fdw withpartition wise join enabled.
|
List | pgsql-hackers |
(2018/05/11 16:17), Ashutosh Bapat wrote: > On Thu, May 10, 2018 at 6:23 PM, Etsuro Fujita > <fujita.etsuro@lab.ntt.co.jp> wrote: >> Yeah, but I think the IsA test would be sufficient to make things work >> correctly because we can assume that there aren't any other nodes than Var, >> PHV, and CRE translating a wholerow value of a child table into a wholerow >> value of its parent table's rowtype in the expression clause to which we >> apply pull_var_clause with PVC_INCLUDE_CONVERTROWTYPES. > > Not really. > Consider following case using the same tables fprt1 and fprt2 in test > sql/postgres_fdw.sql > create function row_as_is(a ftprt2_p1) returns ftprt2_p1 as $$begin > return a; end;$$ language plpgsql; > > With the change you propose i.e. > > diff --git a/src/backend/optimizer/util/var.c b/src/backend/optimizer/util/var.c > index f972712..088da14 100644 > --- a/src/backend/optimizer/util/var.c > +++ b/src/backend/optimizer/util/var.c > @@ -646,8 +646,9 @@ pull_var_clause_walker(Node *node, > pull_var_clause_context *context) > else > elog(ERROR, "PlaceHolderVar found where not expected"); > } > - else if (is_converted_whole_row_reference(node)) > + else if (IsA(node, ConvertRowtypeExpr)) > { > + Assert(is_converted_whole_row_reference(node)); > if (context->flags& PVC_INCLUDE_CONVERTROWTYPES) > { > context->varlist = lappend(context->varlist, node); > > > following query crashes at Assert(is_converted_whole_row_reference(node)); I guess you forgot to show the query. > If we remove that assert, it would end up pushing down row_as_is(), > which is a local user defined function, to the foreign server. That's > not desirable since the foreign server may not have that user defined > function. I don't understand the counter-example you tried to show, but I think that I was wrong here; the IsA test isn't sufficient. >> BTW, one thing I noticed about the new version of the patch is: there is yet >> another case where pull_var_clause produces an error. Here is an example: >> To produce this, apply the patch in [1] as well as the new version; without >> that patch in [1], the update query would crash the server (see [1] for >> details). To fix this, I think we need to pass PVC_RECURSE_CONVERTROWTYPES >> to pull_var_clause in build_remote_returning in postgres_fdw.c as well. > > I missed that call to PVC since it was added after I had created my > patches. That's a disadvantage of having changed PVC to use flags > instead of bools. We won't notice such changes. Thanks for pointing it > out. Changed as per your suggestion. Thanks for that change and the updated version! Yet yet another case where pull_var_clause produces an error: postgres=# create table list_pt (a int, b text) partition by list (a); CREATE TABLE postgres=# create table list_ptp1 partition of list_pt for values in (1); CREATE TABLE postgres=# alter table list_ptp1 add constraint list_ptp1_check check (list_ptp1::list_pt::text != NULL); ERROR: ConvertRowtypeExpr found where not expected The patch kept the flags passed to pull_var_clause in src/backend/catalog/heap.c as-is, but I think we need to modify that accordingly. Probably, the flags passed to pull_var_clause in CreateTrigger as well. Having said that, I started to think this approach would make code much complicated. Another idea I came up with to avoid that would be to use pull_var_clause as-is and then rewrite wholerows of partitions back to ConvertRowtypeExprs translating those wholerows to wholerows of their parents tables' rowtypes if necessary. That would be annoying and a little bit inefficient, but the places where we need to rewrite is limited: prepare_sort_from_pathkeys and build_tlist_to_deparse, IIUC. So we could really minimize the code change and avoid the additional overhead caused by the is_converted_whole_row_reference test added to pull_var_clause. I think the latter would be rather important, because PWJ is disabled by default. What do you think about that approach? Best regards, Etsuro Fujita
pgsql-hackers by date: