Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lVyRi-0004qI-J4 for pgsql-committers@arkaria.postgresql.org; Mon, 12 Apr 2021 15:25:51 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lVyRg-00005f-VQ for pgsql-committers@arkaria.postgresql.org; Mon, 12 Apr 2021 15:25:48 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lVyRg-00005V-9R for pgsql-committers@lists.postgresql.org; Mon, 12 Apr 2021 15:25:48 +0000 Received: from forward5-smtp.messagingengine.com ([66.111.4.239]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lVyRX-0001im-C4 for pgsql-committers@lists.postgresql.org; Mon, 12 Apr 2021 15:25:47 +0000 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailforward.nyi.internal (Postfix) with ESMTP id D62931940E3A; Mon, 12 Apr 2021 11:25:34 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute4.internal (MEProxy); Mon, 12 Apr 2021 11:25:34 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; bh=V+t5m1 OBPYv7TdhVB/PaxU5sQVf98jqb3taLg/dM2hg=; b=EEnPTAScKRvZYnrylAVDDy G04tVwX3vhK50KEkHn/mpZtAAoy1jJENolSzqh42BwCsjHVcTIhSHNjWW2Ln8cQR hkyb7sm/TpKCo4GnPC82pbgXMYgdOrjWBiz4DB7tSw4ji4Iv2t7g0D3MNCIPkX/w /rClhapJogiDG/WIOWNDSZPum5QlFGUUPrxYT/nBE+Ry5yG8lFAAJETaUfvJjjVv smsyPX7gdE1b0A0Vqmd1u0+4RlTKO6yOU3VBk7e0Y0plrFVzpOd3E+e+yZAi4iuO 9EnPZ8Yzgst+pM4A5sGPyinl47fGQ6+H8fLeAW/HyW/LWk2u/dpLekz8fIuW+3GA == X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeduledrudekjedgkeelucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepuffvfhfhkffffgggjggtsehmtderredtfeejnecuhfhrohhmpefrvghtvghr ucfgihhsvghnthhrrghuthcuoehpvghtvghrrdgvihhsvghnthhrrghuthesvghnthgvrh hprhhishgvuggsrdgtohhmqeenucggtffrrghtthgvrhhnpeffvdfhiedvhedutdeihfdt keevfffhkeejudehieeuveegkefggfeiteefhfdtudenucfkphepleefrddvtddvrddvhe efrddugeefnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhho mhepphgvthgvrhdrvghishgvnhhtrhgruhhtsegvnhhtvghrphhrihhsvggusgdrtghomh X-ME-Proxy: Received: from laptop206oxuk.local (p5dcafd8f.dip0.t-ipconnect.de [93.202.253.143]) by mail.messagingengine.com (Postfix) with ESMTPA id 1B5BE24005C; Mon, 12 Apr 2021 11:25:33 -0400 (EDT) Subject: Re: pgsql: SQL-standard function body To: Laurenz Albe , pgsql-committers@lists.postgresql.org References: <7466db64eb6abae93e583faf8ca4004d60c163c4.camel@cybertec.at> From: Peter Eisentraut Message-ID: <823c7393-a2ca-c44a-c57a-b5ff84c3de28@enterprisedb.com> Date: Mon, 12 Apr 2021 17:25:30 +0200 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.9.0 MIME-Version: 1.0 In-Reply-To: <7466db64eb6abae93e583faf8ca4004d60c163c4.camel@cybertec.at> Content-Type: multipart/mixed; boundary="------------53A0D0547C0A2E3FADA4DBF7" Content-Language: en-US List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------53A0D0547C0A2E3FADA4DBF7 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 10.04.21 03:38, Laurenz Albe wrote: > On Fri, 2021-04-09 at 19:44 +0200, I wrote: >>> SQL-standard function body >>> >>> psql needs some new intelligence to keep track of function body >>> boundaries so that it doesn't send off statements when it sees >>> semicolons that are inside a function body. >> >> This causes psql to fail to recognize the semicolon in the following >> statement as the end of a statement: >> >> IMPORT FOREIGN SCHEMA x FROM SERVER y INTO z OPTIONS (case 'lower'); >> >> The cause is the "case", which is recognized as the start of a function >> body. >> >> Would it be an option to recognize BEGIN and CASE as starting a >> function body only if they are *not* inside parentheses, like in >> the attached? > > Here is an improved patch, which treats END in the same fashion > (not properly indented for readability). Thanks, I took another look at this and augmented your change with a change that tracks whether the statement starts with CREATE [OR REPLACE] {FUNCTION|PROCEDURE}. That should make it pretty safe. What do you think? --------------53A0D0547C0A2E3FADA4DBF7 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="0001-psql-Refine-lexing-of-BEGIN.END-blocks-in-CREATE-FUN.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0="0001-psql-Refine-lexing-of-BEGIN.END-blocks-in-CREATE-FUN.pa"; filename*1="tch" RnJvbSAyNjI1MWJlOWJlODk1ODMyNzg1NzNlZDI4NTQwZTVmMTZmMjYxNmZiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogTW9uLCAxMiBBcHIgMjAyMSAxNzoxOTo1OSArMDIwMApTdWJqZWN0 OiBbUEFUQ0hdIHBzcWw6IFJlZmluZSBsZXhpbmcgb2YgQkVHSU4uLi5FTkQgYmxvY2tzIGlu IENSRUFURSBGVU5DVElPTgogc3RhdGVtZW50cwoKT25seSB0cmFjayBCRUdJTi4uLkVORCBi bG9ja3MgaWYgdGhleSBhcmUgaW4gYSBDUkVBVEUgW09SIFJFUExBQ0VdCntGVU5DVElPTnxQ Uk9DRURVUkV9IHN0YXRlbWVudC4gIElnbm9yZSBpZiBpbiBwYXJlbnRoZXNlcy4KClJlcG9y dGVkLWJ5OiBMYXVyZW56IEFsYmUgPGxhdXJlbnouYWxiZUBjeWJlcnRlYy5hdD4KLS0tCiBz cmMvZmVfdXRpbHMvcHNxbHNjYW4ubCAgICAgICAgICAgICB8IDUzICsrKysrKysrKysrKysr KysrKysrKysrKy0tLS0tCiBzcmMvaW5jbHVkZS9mZV91dGlscy9wc3Fsc2Nhbl9pbnQuaCB8 ICA4ICsrKystCiAyIGZpbGVzIGNoYW5nZWQsIDUyIGluc2VydGlvbnMoKyksIDkgZGVsZXRp b25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2ZlX3V0aWxzL3BzcWxzY2FuLmwgYi9zcmMvZmVf dXRpbHMvcHNxbHNjYW4ubAppbmRleCA0ZWM1N2U5NmE5Li45OTFiN2RlMGI1IDEwMDY0NAot LS0gYS9zcmMvZmVfdXRpbHMvcHNxbHNjYW4ubAorKysgYi9zcmMvZmVfdXRpbHMvcHNxbHNj YW4ubApAQCAtODcwLDE4ICs4NzAsNTUgQEAgb3RoZXIJCQkuCiAKIAoge2lkZW50aWZpZXJ9 CXsKLQkJCQkJY3VyX3N0YXRlLT5pZGVudGlmaWVyX2NvdW50Kys7Ci0JCQkJCWlmIChwZ19z dHJjYXNlY21wKHl5dGV4dCwgImJlZ2luIikgPT0gMAotCQkJCQkJfHwgcGdfc3RyY2FzZWNt cCh5eXRleHQsICJjYXNlIikgPT0gMCkKKwkJCQkJLyoKKwkJCQkJICogV2UgbmVlZCB0byB0 cmFjayBpZiB3ZSBhcmUgaW5zaWRlIGEgQkVHSU4gLi4gRU5EIGJsb2NrCisJCQkJCSAqIGlu IGEgZnVuY3Rpb24gZGVmaW5pdGlvbiwgc28gdGhhdCBzZW1pY29sb25zIGNvbnRhaW5lZAor CQkJCQkgKiB0aGVyZWluIGRvbid0IHRlcm1pbmF0ZSB0aGUgd2hvbGUgc3RhdGVtZW50LiAg U2hvcnQgb2YKKwkJCQkJICogd3JpdGluZyBhIGZ1bGwgcGFyc2VyIGhlcmUsIHRoZSBmb2xs b3dpbmcgaGV1cmlzdGljCisJCQkJCSAqIHNob3VsZCB3b3JrLiAgRmlyc3QsIHdlIHRyYWNr IHdoZXRoZXIgdGhlIGJlZ2lubmluZyBvZgorCQkJCQkgKiB0aGUgc3RhdGVtZW50IG1hdGNo ZXMgQ1JFQVRFIFtPUiBSRVBMQUNFXQorCQkJCQkgKiB7RlVOQ1RJT058UFJPQ0VEVVJFfQor CQkJCQkgKi8KKworCQkJCQlpZiAoY3VyX3N0YXRlLT5pZGVudGlmaWVyX2NvdW50ID09IDAp CisJCQkJCQltZW1zZXQoY3VyX3N0YXRlLT5pZGVudGlmaWVycywgMCwgc2l6ZW9mKGN1cl9z dGF0ZS0+aWRlbnRpZmllcnMpKTsKKworCQkJCQlpZiAocGdfc3RyY2FzZWNtcCh5eXRleHQs ICJjcmVhdGUiKSA9PSAwIHx8CisJCQkJCQlwZ19zdHJjYXNlY21wKHl5dGV4dCwgImZ1bmN0 aW9uIikgPT0gMCB8fAorCQkJCQkJcGdfc3RyY2FzZWNtcCh5eXRleHQsICJwcm9jZWR1cmUi KSA9PSAwIHx8CisJCQkJCQlwZ19zdHJjYXNlY21wKHl5dGV4dCwgIm9yIikgPT0gMCB8fAor CQkJCQkJcGdfc3RyY2FzZWNtcCh5eXRleHQsICJyZXBsYWNlIikgPT0gMCkKIAkJCQkJewot CQkJCQkJaWYgKGN1cl9zdGF0ZS0+aWRlbnRpZmllcl9jb3VudCA+IDEpCi0JCQkJCQkJY3Vy X3N0YXRlLT5iZWdpbl9kZXB0aCsrOworCQkJCQkJaWYgKGN1cl9zdGF0ZS0+aWRlbnRpZmll cl9jb3VudCA8IHNpemVvZihjdXJfc3RhdGUtPmlkZW50aWZpZXJzKSkKKwkJCQkJCQljdXJf c3RhdGUtPmlkZW50aWZpZXJzW2N1cl9zdGF0ZS0+aWRlbnRpZmllcl9jb3VudF0gPSBwZ190 b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSB5eXRleHRbMF0pOwogCQkJCQl9Ci0JCQkJCWVsc2Ug aWYgKHBnX3N0cmNhc2VjbXAoeXl0ZXh0LCAiZW5kIikgPT0gMCkKKworCQkJCQljdXJfc3Rh dGUtPmlkZW50aWZpZXJfY291bnQrKzsKKworCQkJCQlpZiAoY3VyX3N0YXRlLT5pZGVudGlm aWVyc1swXSA9PSAnYycgJiYKKwkJCQkJCShjdXJfc3RhdGUtPmlkZW50aWZpZXJzWzFdID09 ICdmJyB8fCBjdXJfc3RhdGUtPmlkZW50aWZpZXJzWzFdID09ICdwJyB8fAorCQkJCQkJIChj dXJfc3RhdGUtPmlkZW50aWZpZXJzWzFdID09ICdvJyAmJiBjdXJfc3RhdGUtPmlkZW50aWZp ZXJzWzJdID09ICdyJyAmJgorCQkJCQkJICAoY3VyX3N0YXRlLT5pZGVudGlmaWVyc1szXSA9 PSAnZicgfHwgY3VyX3N0YXRlLT5pZGVudGlmaWVyc1szXSA9PSAncCcpKSkgJiYKKwkJCQkJ CWN1cl9zdGF0ZS0+cGFyZW5fZGVwdGggPT0gMCkKIAkJCQkJewotCQkJCQkJaWYgKGN1cl9z dGF0ZS0+YmVnaW5fZGVwdGggPiAwKQotCQkJCQkJCWN1cl9zdGF0ZS0+YmVnaW5fZGVwdGgt LTsKKwkJCQkJCWlmIChwZ19zdHJjYXNlY21wKHl5dGV4dCwgImJlZ2luIikgPT0gMCkKKwkJ CQkJCQljdXJfc3RhdGUtPmJlZ2luX2RlcHRoKys7CisJCQkJCQllbHNlIGlmIChwZ19zdHJj YXNlY21wKHl5dGV4dCwgImNhc2UiKSA9PSAwKQorCQkJCQkJeworCQkJCQkJCS8qCisJCQkJ CQkJICogQ0FTRSBhbHNvIGVuZHMgd2l0aCBFTkQuICBXZSBvbmx5IG5lZWQgdG8gdHJhY2sK KwkJCQkJCQkgKiB0aGlzIGlmIHdlIGFyZSBhbHJlYWR5IGluc2lkZSBhIEJFR0lOLgorCQkJ CQkJCSAqLworCQkJCQkJCWlmIChjdXJfc3RhdGUtPmJlZ2luX2RlcHRoID49IDEpCisJCQkJ CQkJCWN1cl9zdGF0ZS0+YmVnaW5fZGVwdGgrKzsKKwkJCQkJCX0KKwkJCQkJCWVsc2UgaWYg KHBnX3N0cmNhc2VjbXAoeXl0ZXh0LCAiZW5kIikgPT0gMCkKKwkJCQkJCXsKKwkJCQkJCQlp ZiAoY3VyX3N0YXRlLT5iZWdpbl9kZXB0aCA+IDApCisJCQkJCQkJCWN1cl9zdGF0ZS0+YmVn aW5fZGVwdGgtLTsKKwkJCQkJCX0KIAkJCQkJfQorCiAJCQkJCUVDSE87CiAJCQkJfQogCmRp ZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9mZV91dGlscy9wc3Fsc2Nhbl9pbnQuaCBiL3NyYy9p bmNsdWRlL2ZlX3V0aWxzL3BzcWxzY2FuX2ludC5oCmluZGV4IDkxZDdkNGQ1YzYuLjQzNGU1 NTQ5NjEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2ZlX3V0aWxzL3BzcWxzY2FuX2ludC5o CisrKyBiL3NyYy9pbmNsdWRlL2ZlX3V0aWxzL3BzcWxzY2FuX2ludC5oCkBAIC0xMTQsOCAr MTE0LDE0IEBAIHR5cGVkZWYgc3RydWN0IFBzcWxTY2FuU3RhdGVEYXRhCiAJaW50CQkJcGFy ZW5fZGVwdGg7CS8qIGRlcHRoIG9mIG5lc3RpbmcgaW4gcGFyZW50aGVzZXMgKi8KIAlpbnQJ CQl4Y2RlcHRoOwkJLyogZGVwdGggb2YgbmVzdGluZyBpbiBzbGFzaC1zdGFyIGNvbW1lbnRz ICovCiAJY2hhcgkgICAqZG9scXN0YXJ0OwkJLyogY3VycmVudCAkZm9vJCBxdW90ZSBzdGFy dCBzdHJpbmcgKi8KKworCS8qCisJICogU3RhdGUgdG8gdHJhY2sgYm91bmRhcmllcyBvZiBC RUdJTiAuLi4gRU5EIGJsb2NrcyBpbiBmdW5jdGlvbgorCSAqIGRlZmluaXRpb25zLCBzbyB0 aGF0IHNlbWljb2xvbnMgZG8gbm90IHNlbmQgcXVlcnkgdG9vIGVhcmx5LgorCSAqLwogCWlu dAkJCWlkZW50aWZpZXJfY291bnQ7CS8qIGlkZW50aWZpZXJzIHNpbmNlIHN0YXJ0IG9mIHN0 YXRlbWVudCAqLwotCWludAkJCWJlZ2luX2RlcHRoOwkvKiBkZXB0aCBvZiBiZWdpbi9lbmQg cm91dGluZSBib2R5IGJsb2NrcyAqLworCWNoYXIJCWlkZW50aWZpZXJzWzRdOwkvKiByZWNv cmRzIHRoZSBmaXJzdCBmZXcgaWRlbnRpZmllcnMgKi8KKwlpbnQJCQliZWdpbl9kZXB0aDsJ LyogZGVwdGggb2YgYmVnaW4vZW5kIHBhaXJzICovCiAKIAkvKgogCSAqIENhbGxiYWNrIGZ1 bmN0aW9ucyBwcm92aWRlZCBieSB0aGUgcHJvZ3JhbSBtYWtpbmcgdXNlIG9mIHRoZSBsZXhl ciwKLS0gCjIuMzEuMQoK --------------53A0D0547C0A2E3FADA4DBF7--