Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1fBH5h-0003AT-3R for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Apr 2018 09:51:57 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1fBH5e-0000yR-9J for pgsql-hackers@arkaria.postgresql.org; Wed, 25 Apr 2018 09:51:54 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1fBH5d-0000yH-KY for pgsql-hackers@lists.postgresql.org; Wed, 25 Apr 2018 09:51:53 +0000 Received: from mail-pg0-x22d.google.com ([2607:f8b0:400e:c05::22d]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1fBH5a-0007D6-RT for pgsql-hackers@postgresql.org; Wed, 25 Apr 2018 09:51:52 +0000 Received: by mail-pg0-x22d.google.com with SMTP id j11so12949937pgf.2 for ; Wed, 25 Apr 2018 02:51:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=MGlxaMYbh7y4xyxqns5ELnDRzWgh3+lEPaleWvK2jhE=; b=qr8SqX42WONadZHwNkkSMFSeeFwkPMukdG+uyvT7pPFHX9888QgrQNuqNxWjOjnEi3 9bAmLqLoSAuqte6gTj/x6LAB6v3WgrO6wxoIuh13VCInSqc8DLWiHerkiC0g2ILcQKpG TwobQs+L0vIr92UMEkL3YwwCdd0WY1v3qV92qEHUm1Di9YRcTCuOZR/TrL/07qy8m5bP Zk5kWUrBEX0EGU95r92OArhggkV6PEg5l9WkZ0lt7elITEdtCmjMFSI7LqC1c69Yg2Sj eCyW1n9hDmDUL3ykjWR3twnOGl5V2wjbhjwcN27zVtVU5gO70eMgkaJP3EDGI/BjnwFh CR8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=MGlxaMYbh7y4xyxqns5ELnDRzWgh3+lEPaleWvK2jhE=; b=kUMYeQhwndAhWmwBuhCKY8TWZR9m51WvKTfagLXi71Oul5TJFGmVfQ5Yu/PPtP/GCO E+KwSnHmwdgSZLS5bk+5kEOtIBzkY55F0pRMek/qohN8Emi8OTNqIVb2Ghor6/9xTg9/ FnlsmikxIzyc+uQywwyum5jVn1FLG4pa8RNAHVEkj6PTRRAbQ9y4oiCpbAILq9ApSoQR dtiDGZH3CMqkzfqmRig+HJqT2J1bmqE75Vw7M/K+1nqp+o6A3CYAK6hFeQO9m7N6vCNu awIoQHh1yHqZ217ktpZY01XFGGJVF1h7yX10pH/6xwsddvIGvoZtCr95Z6eu1mtwV595 W+dw== X-Gm-Message-State: ALQs6tCw/GlYCKTdnCBPQYhhPvZ9rh4P5s3h4hcB4v7gEQtHlBEu4KCf QrtL1vy1TDXwW85/z1P6y8Xi7217mWSztrt3V4JzrA== X-Google-Smtp-Source: AB8JxZr0ozjKBB3HZCsj7N4oBn6OQrrVRtQGEFyBb2KTBK++LkQ1LY5FJ9DZ+vkSSBBCUBQPV1m+MMGefGHzwB66drI= X-Received: by 10.99.95.209 with SMTP id t200mr5512522pgb.246.1524649909382; Wed, 25 Apr 2018 02:51:49 -0700 (PDT) MIME-Version: 1.0 Received: by 10.100.138.193 with HTTP; Wed, 25 Apr 2018 02:51:48 -0700 (PDT) In-Reply-To: <5ADF12D1.1030406@lab.ntt.co.jp> References: <5AD5B1E0.8020404@lab.ntt.co.jp> <5AD5C5A1.1070509@lab.ntt.co.jp> <5ADF12D1.1030406@lab.ntt.co.jp> From: Ashutosh Bapat Date: Wed, 25 Apr 2018 15:21:48 +0530 Message-ID: Subject: Re: Expression errors with "FOR UPDATE" and postgres_fdw with partition wise join enabled. To: Etsuro Fujita Cc: Rajkumar Raghuwanshi , pgsql-hackers Content-Type: multipart/mixed; boundary="001a114fd0b441a97e056aa93876" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --001a114fd0b441a97e056aa93876 Content-Type: text/plain; charset="UTF-8" On Tue, Apr 24, 2018 at 4:49 PM, Etsuro Fujita wrote: > (2018/04/17 19:00), Etsuro Fujita wrote: >> >> (2018/04/17 18:43), Ashutosh Bapat wrote: >>> >>> Here's updated patch-set. >> >> >> Will review. > > > I started reviewing this. > > o 0001-Handle-ConvertRowtypeExprs-in-pull_vars_clause.patch: > > + else if (IsA(node, ConvertRowtypeExpr)) > + { > +#ifdef USE_ASSERT_CHECKING > + ConvertRowtypeExpr *cre = castNode(ConvertRowtypeExpr, node); > + Var *var; > + > + /* > + * ConvertRowtypeExprs only result when parent's whole-row reference > is > + * translated for a child using adjust_appendrel_attrs(). That > function > + * does not handle any upper level Var references. > + */ > + while (IsA(cre->arg, ConvertRowtypeExpr)) > + cre = castNode(ConvertRowtypeExpr, cre->arg); > + var = castNode(Var, cre->arg); > + Assert (var->varlevelsup == 0); > +#endif /* USE_ASSERT_CHECKING */ > > Isn't it better to throw ERROR as in other cases in pull_vars_clause()? Actually I noticed that ConvertRowtypeExpr are used to cast a child's whole row reference expression (not just a Var node) into that of its parent and not. For example a cast like NULL::child::parent produces a ConvertRowtypeExpr encapsulating a NULL constant node and not a Var node. We are interested only in ConvertRowtypeExprs embedding Var nodes with Var::varattno = 0. I have changed this code to use function is_converted_whole_row_reference() instead of the above code with Assert. In order to use that function, I had to take it out of setrefs.c and put it in nodeFuncs.c which seemed to be a better fit. > Another thing I noticed about this patch is this: > > postgres=# create table prt1 (a int, b int, c varchar) partition by range > (a); > postgres=# create table prt1_p1 partition of prt1 FOR VALUES FROM (0) TO > (250); > postgres=# create table prt1_p2 partition of prt1 FOR VALUES FROM (250) TO > (500) > ; > postgres=# insert into prt1 select i, i % 25, to_char(i, 'FM0000') from > generate > _series(0, 499) i where i % 2 = 0; > postgres=# analyze prt1; > postgres=# create table prt2 (a int, b int, c varchar) partition by range > (b); > postgres=# create table prt2_p1 partition of prt2 FOR VALUES FROM (0) TO > (250); > postgres=# create table prt2_p2 partition of prt2 FOR VALUES FROM (250) TO > (500) > ; > postgres=# insert into prt2 select i % 25, i, to_char(i, 'FM0000') from > generate > _series(0, 499) i where i % 3 = 0; > postgres=# analyze prt2; > > postgres=# update prt1 t1 set c = 'foo' from prt2 t2 where t1::text = > t2::text a > nd t1.a = t2.b; > ERROR: ConvertRowtypeExpr found where not expected > > To fix this, I think we need to pass PVC_RECURSE_CONVERTROWTYPES to > pull_vars_clause() in distribute_qual_to_rels() and > generate_base_implied_equalities_no_const() as well. Thanks for the catch. I have updated patch with your suggested fix. -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company --001a114fd0b441a97e056aa93876 Content-Type: application/x-gzip; name="expr_ref_error_pwj_v3.tar.gz" Content-Disposition: attachment; filename="expr_ref_error_pwj_v3.tar.gz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_jgex6ebh0 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 --001a114fd0b441a97e056aa93876--