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 1fBw7y-0001oP-Fd for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Apr 2018 05:41:02 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1fBw7u-0003jR-DS for pgsql-hackers@arkaria.postgresql.org; Fri, 27 Apr 2018 05:40:58 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1fBw7u-0003jH-1Z for pgsql-hackers@lists.postgresql.org; Fri, 27 Apr 2018 05:40:58 +0000 Received: from mail-pf0-x241.google.com ([2607:f8b0:400e:c00::241]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1fBw7l-0001vM-AI for pgsql-hackers@postgresql.org; Fri, 27 Apr 2018 05:40:57 +0000 Received: by mail-pf0-x241.google.com with SMTP id g14so648559pfh.3 for ; Thu, 26 Apr 2018 22:40:48 -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=rlS5JT0epB7Ao8pilsO2p3bxFb/iYhRKhhzXXgCoTIA=; b=gsU4sLoLGfrT6ejTyF8vcBrKo7gQNwc3aVZRdOBPfpJ4H1LMyxMrbce2m7/3NqmFPZ r9N+v7viMcQNSTvXnG5PpKTVY+wiHHA3uf6uwrnkyB9uY9EATj+vROUSQmYIeVCt6U4p WjIgxHJBH46cQwH64EtBMpRJSUquA0CB3a6pEg/5idLtBSpTSfYldNfYak3WvQI7zRlF KceFzxzXYH1MdGB4vc0tAkpWOL1gLhWCZVAKx+TKyrtkIBRNntrHY78GVQUrh3p3gOR1 hoFQqEsR01Yg8stIx8gTZMGRbJR7neht3Tht/Z0iOnwuHJQmmejO4YOc1eF3+ShdBtvO YJ4g== 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=rlS5JT0epB7Ao8pilsO2p3bxFb/iYhRKhhzXXgCoTIA=; b=Xr9qhcujX5raaiTI7u/EmDcUJCXa/eh9DuWptDWdfdsVJUVVslfNBGUxRrrYMlBA33 t7ZmvO+32QfstQ52BWIdoONPK9giOxl/vO2ZgStHzS/4tWZIbAmiosBH7KoCHbbUXwe2 6KDVxdvU1S7jnunn+vzdS00u6EKEMt+J0Gy6ZUIV35ZgITH/uhq3lzTbCP5NLiDxArLr w56GeG4cJANkeYmbJlSXykzoe/reBGdFFRrFm9CJekYkKyRbMRxQaiKFhr4ts2qMDwEz tghJXQd4TL8YyJF8HRJGKyQm1tVx8eLanGX65+zqAuaq4WeLVYV9pNBWVmx+8Oq/hD+W 1BjQ== X-Gm-Message-State: ALQs6tCoAdAJN5/2nImmFuXuoecZErh3/94C+bYd9g8Xroze7HdKe8S6 ej3yHp5ziTYStrQtfTdInOrgbOWKtwoyQAwb7VxUrQ== X-Google-Smtp-Source: AB8JxZr296E/NEyDBGIpYhpbvWG9uzj+9BRO0iY2cj8vebiFJSvoIX2+afbWTlHj3vryjkJ8RFCGIlLiX7bkoAUUxDs= X-Received: by 2002:a17:902:8e83:: with SMTP id bg3-v6mr995299plb.144.1524807646185; Thu, 26 Apr 2018 22:40:46 -0700 (PDT) MIME-Version: 1.0 Received: by 10.100.138.193 with HTTP; Thu, 26 Apr 2018 22:40:45 -0700 (PDT) In-Reply-To: <5AE1C0D3.5060009@lab.ntt.co.jp> References: <5AD5B1E0.8020404@lab.ntt.co.jp> <5AD5C5A1.1070509@lab.ntt.co.jp> <5ADF12D1.1030406@lab.ntt.co.jp> <5AE1C0D3.5060009@lab.ntt.co.jp> From: Ashutosh Bapat Date: Fri, 27 Apr 2018 11:10:45 +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="0000000000001a432b056acdf263" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --0000000000001a432b056acdf263 Content-Type: text/plain; charset="UTF-8" On Thu, Apr 26, 2018 at 5:36 PM, Etsuro Fujita wrote: > (2018/04/25 18:51), Ashutosh Bapat wrote: >> >> On Tue, Apr 24, 2018 at 4:49 PM, Etsuro Fujita >> wrote: >>> >>> o 0001-Handle-ConvertRowtypeExprs-in-pull_vars_clause.patch: > > >>> 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. > > > Thanks, but I don't think that's enough. Consider: > > postgres=# create table base_tbl (a int, b int); > postgres=# insert into base_tbl select i % 25, i from generate_series(0, > 499) i where i % 6 = 0; > > postgres=# update prt1 t1 set c = 'foo' from prt2 t2 left join (select a, b, > 1 from base_tbl) ss(c1, c2, c3) on (t2.b = ss.c2) where t1::text = t2::text > and t1.a = t2.b; > ERROR: ConvertRowtypeExpr found where not expected > Thanks for the test. > To fix this, I think we need to pass PVC_RECURSE_CONVERTROWTYPES to > pull_var_clause() in find_placeholders_in_expr() as well. > > The patch doesn't pass that to pull_var_clause() in other places such as > fix_placeholder_input_needed_levels() or planner.c, but I don't understand > the reason why that's OK. I was trying to be conservative not to include PVC_RECURSE_CONVERTROWTYPES everywhere. But it looks like because of inheritance_planner() and partition-wise aggregate commit, we can have ConvertRowtypeExprs almost everywhere. Added PVC_RECURSE_CONVERTROWTYPEs in almost all the places except the ones listed in 0001 patch. > > Sorry, I've not finished the review yet, so I'll continue that. Thanks for the tests and review. Here's updated patch set. -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company --0000000000001a432b056acdf263 Content-Type: application/x-gzip; name="expr_ref_error_pwj_v4.tar.gz" Content-Disposition: attachment; filename="expr_ref_error_pwj_v4.tar.gz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_jghj3jig0 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 rsN1uA7X4Tpcf6rrfzWlIAEAyAAA --0000000000001a432b056acdf263--