Received: from malur.postgresql.org ([2a02:16a8:dc51::56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.89) (envelope-from ) id 1fFwvj-0004rB-Ig for pgsql-hackers@arkaria.postgresql.org; Tue, 08 May 2018 07:21:00 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1fFwvi-0004dy-9h for pgsql-hackers@arkaria.postgresql.org; Tue, 08 May 2018 07:20: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 1fFwvh-0004dg-TG for pgsql-hackers@lists.postgresql.org; Tue, 08 May 2018 07:20:58 +0000 Received: from mail-pl0-x236.google.com ([2607:f8b0:400e:c01::236]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1fFwvd-0002To-GC for pgsql-hackers@postgresql.org; Tue, 08 May 2018 07:20:56 +0000 Received: by mail-pl0-x236.google.com with SMTP id ay10-v6so1684334plb.1 for ; Tue, 08 May 2018 00:20:52 -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=YmGNlqzjhC1St2hgR4LqtF1sI/a4s76IQtD+uHOsouA=; b=R1gnqfxehJXNivsr2RRvcF6rik8ugdXTQz4P9uYSNmQug7BX7/MMOr/T9qkX96ovlL fDCtJWCTmk+YQ58LsKgHucKLpzsCp7trRyOV1voB5fiIvoH2XTwj2VmEnNoZen9D46PP wybQ7kByZng6L90D6zBlUd6ozKdJ8HGISC/Ot/9L1NiT0F1BjPx1Q/P6CczWOv8xR1eS kwNCfiW6tLIMzkH5+vEo6BLu6ZLZAoXojXsS4W9JDTttPOJH4fAZBvOuXLEyDXOT2JtC NI82W6SL4SmsITHaOYPChPanxc65qNEC+FCe97hwfW35n9BjSq8+lgPQi6tkAFAbcUer KuXQ== 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=YmGNlqzjhC1St2hgR4LqtF1sI/a4s76IQtD+uHOsouA=; b=Y4/LVoHHPCz/LzjpzeA1iFiFp7dHsJPwoJZiKXrN3omVwaJgP5m6Vaz3yRSD+AmsS4 3jIugs3awmIpdaoGqO73jbeIKFwjlo69aecDcGAMlK/ZYq4D4Oy1wNqqbxI5XKfnbjTt cKPnnfI4Xl2SzvmNTSfPjgPH4yYpYXVhQBix+6KRQpEfG0jmtuYdH2eb7eiZMiOeBAqv 9uwuoRjh4XG5szXcFMvx+/bCVNEj/5irXsBFJ906JD+FboWfAXOKjBwjdjE9AdBGpFGz MZxouN0k1mYd+oPn2G/4JyFEnFwWcZqG8aiMrw0dgkJovRUEHqplJvuwpGw0N3O1tD6o wqVA== X-Gm-Message-State: ALQs6tC7cwmXjlBNY5PeshITtUsYEF/yhsEsYiu+TFh92KTHCzasgAXF nesVVPjmDjE3N8RBViK5ik/37A/k/Xi+NeRrFB26wQ== X-Google-Smtp-Source: AB8JxZrf56t276p+F9W4yCRn0qpklWpUTCm7ezV1OJVGkeJqR2iKkBiE8UXTeOWw1RJjmmjZfhfmDWJN3LRtudZvr9M= X-Received: by 2002:a17:902:ab98:: with SMTP id f24-v6mr13647980plr.144.1525764049713; Tue, 08 May 2018 00:20:49 -0700 (PDT) MIME-Version: 1.0 Received: by 10.100.138.194 with HTTP; Tue, 8 May 2018 00:20:48 -0700 (PDT) In-Reply-To: <5AE84FBF.3040905@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> <5AE84FBF.3040905@lab.ntt.co.jp> From: Ashutosh Bapat Date: Tue, 8 May 2018 12:50: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="00000000000031fb98056baca0ef" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk --00000000000031fb98056baca0ef Content-Type: text/plain; charset="UTF-8" On Tue, May 1, 2018 at 5:00 PM, Etsuro Fujita wrote: > (2018/04/27 14:40), Ashutosh Bapat wrote: >> >> Here's updated patch set. > > > Thanks for updating the patch! Here are my review comments on patch > 0003-postgres_fdw-child-join-with-ConvertRowtypeExprs-cau.patch: > > * This assertion in deparseConvertRowtypeExpr wouldn't always be true > because of cases like ALTER FOREIGN TABLE DROP COLUMN plus ALTER FOREIGN > TABLE ADD COLUMN: > > + Assert(parent_desc->natts == child_desc->natts); > > Here is such an example: > > I think we should remove that assertion. Removed. > > * But I don't think that change is enough. Here is another oddity with that > assertion removed. > > To fix this, I think we should skip the deparseColumnRef processing for > dropped columns in the parent table. Done. I have changed the test file a bit to test these scenarios. Thanks for testing. > > * I think it would be better to do EXPLAIN with the VERBOSE option to the > queries this patch added to the regression tests, to see if > ConvertRowtypeExprs are correctly deparsed in the remote queries. The reason VERBOSE option was omitted for partition-wise join was to avoid repeated and excessive output for every child-join. I think that still applies. PFA patch-set with the fixes. I also noticed that the new function deparseConvertRowtypeExpr is not quite following the naming convention of the other deparseFoo functions. Foo is usually the type of the node the parser would produced when the SQL string produced by that function is parsed. That doesn't hold for the SQL string produced by ConvertRowtypeExpr but then naming it as generic deparseRowExpr() wouldn't be correct either. And then there are functions like deparseColumnRef which may produce a variety of SQL strings which get parsed into different node types e.g. a whole-row reference would produce ROW(...) which gets parsed as a RowExpr. Please let me know if you have any suggestions for the name. -- Best Wishes, Ashutosh Bapat EnterpriseDB Corporation The Postgres Database Company --00000000000031fb98056baca0ef Content-Type: application/x-gzip; name="expr_ref_error_pwj_v5.tar.gz" Content-Disposition: attachment; filename="expr_ref_error_pwj_v5.tar.gz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_jgxcin520 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 B7IZLxYAyAAA --00000000000031fb98056baca0ef--