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 1eo3z8-0005eA-Jm for pgsql-hackers@arkaria.postgresql.org; Tue, 20 Feb 2018 09:13:15 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eo3z6-0001sh-5g for pgsql-hackers@arkaria.postgresql.org; Tue, 20 Feb 2018 09:13:12 +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.84_2) (envelope-from ) id 1eo3z5-0001sX-Pa for pgsql-hackers@lists.postgresql.org; Tue, 20 Feb 2018 09:13:11 +0000 Received: from mail-pl0-x231.google.com ([2607:f8b0:400e:c01::231]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1eo3z0-0007VC-VC for pgsql-hackers@postgresql.org; Tue, 20 Feb 2018 09:13:11 +0000 Received: by mail-pl0-x231.google.com with SMTP id s13so7109532plq.6 for ; Tue, 20 Feb 2018 01:13:06 -0800 (PST) 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=5OXaJ8COkZo5ZHotW4vsoBsPYd+Ah/JFqYVKiMlC3K4=; b=TKrMgCd7Lll5sofEfeu612w9DePcmje5o9z52tNEwfFBK7sO4Vx4ETjOfHB60OaNND dTSZQ7v0Nsrcvp2vmlmxda7ciiGLJpjZnWq/dlROphN9/fQfx+V7Nclhzyrr+7fortHk o6h2X+9q+Huw2F7hzA6CHZ2f6l2EdlglSwISFlZ1oCC8a1zEnrJVG4GENkQ7VVpT3jfo oAySBdKZz9/cAiPevWCSZebTWKF78cfve+NIXNvdc5U3HFMXDl9zvS8WCzTt1Pzfvhyb AsXqRgGi8+pRjrRD7oDoe6XlypOx9i23S73AUVrIQ35kCcsSBqnsBWto1jPnJP5rlZMU M9Jg== 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=5OXaJ8COkZo5ZHotW4vsoBsPYd+Ah/JFqYVKiMlC3K4=; b=fpa5VWbu9GdPFOYfPlMDoZLcDZhgroUF+5taA61hmq9OYutOvyp2i+mWZWDD4hPbPS sqTy+gpGkJea0iOC6WxW6iGWyd6R+TG5NGLtkAEfuLPBOCo1JG+8r2eAezhExQ+4peW4 hTUNWRdtm57kiTlWQVu80aZEE1k5SaGURkCKaCOX7lxOcufyCNTYtd6hPcagyUumeafH 3TXgQILtrtgXPcnzRdQAC73fXeEHLs5aa47a9TPvFaaAoatO5roq/6TDSGOgyuJvvyoH Ndo2nRXgCSq9VXLbHMmVnL7vBbCIUA+uyHgdgcmmZ5DYZvAOJIeeQWVRl2eygE7b0pyF Ootw== X-Gm-Message-State: APf1xPA4UAVHYnoKZ4za5nePUBa+tyJbrBUEev/QnHWr7oJDUxAPhTLy I8bsULT/qbiibd5VbRNILRNkcMM3B1p3w4D84iONfg== X-Google-Smtp-Source: AH8x224W3PIbvueZuVxq44vl2tRJOiuswjBEjvlZuOwM1satn59zuyF2To/KBHVaPlZVybL0Avh+GXaELq7RhEEdVlA= X-Received: by 2002:a17:902:b109:: with SMTP id q9-v6mr17139767plr.340.1519117983610; Tue, 20 Feb 2018 01:13:03 -0800 (PST) MIME-Version: 1.0 Received: by 10.236.137.139 with HTTP; Tue, 20 Feb 2018 01:13:02 -0800 (PST) In-Reply-To: References: From: Ashutosh Bapat Date: Tue, 20 Feb 2018 14:43:02 +0530 Message-ID: Subject: Re: Expression errors with "FOR UPDATE" and postgres_fdw with partition wise join enabled. To: Rajkumar Raghuwanshi Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000c9267a0565a1375b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --000000000000c9267a0565a1375b Content-Type: text/plain; charset="UTF-8" On Tue, Feb 13, 2018 at 6:21 PM, Ashutosh Bapat wrote: > > 1. Push down ConvertRowtypeExpr and include it in the pushed down targetlist. > This would solve both the problems described above. Both set_plan_ref() and > get_relation_column_alias_ids() will find ConvertRowtypeExpr, they are looking > for and won't throw an error. > > This requires two parts > a. In build_tlist_to_deparse(), instead of pulling > Var node from ConvertRowtypeExpr, we pull whole ConvertRowtypeExpr and include > it in the targetlist being deparsed which is also used as to set > fdw_scan_tlist. In order to pull any ConvertRowtypeExpr's in the local quals, > which may be hidden in the expression tree, we will add two more options to > flags viz. PVC_INCLUDE_CONVERTROWTYPEEXPR and PVC_RECURSE_CONVERTROWTYPEEXPR. > Unlike the other PVC_* options, which do not default to a value, we may want to > default to PVC_RECURSE_CONVERTROWTYPEEXPR if nothing is specified. That will > avoid, possibly updating every pull_var_clause call with > PVC_RECURSE_CONVERTROWTYPEEXPR. > b. deparse ConvertRowtypeExpr > For this we need to get the conversion map between the parent and child. We > then deparse ConvertRowtypeExpr as a ROW() with the attributes of child > rearranged per the conversion map. A multi-level partitioned table will have > nested ConvertRowtypeExpr. To deparse such expressions, we need to find the > conversion map between the topmost parent and the child, by ignoring any > intermediate parents. > > Here's patchset implementing this solution. 0001 adds PVC_*_CONVERTROWTYPEEXPR to pull_var_clause() and adjusts its callers. 0002 fixes a similar bug for regular partitioned tables. The patch has testcase. The commit message explains the bug in more detail. 0003 has postgres_fdw fixes as outlined above with tests. -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company --000000000000c9267a0565a1375b Content-Type: application/x-gzip; name="expr_ref_error_pwj.tar.gz" Content-Disposition: attachment; filename="expr_ref_error_pwj.tar.gz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_jdvfmdxq0 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 /wEa57S1AKAAAA== --000000000000c9267a0565a1375b--