Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wDasP-0039RE-34 for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 04:32:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wDasP-008AwY-0k for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 04:32:21 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wDasO-008AwG-2y for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 04:32:20 +0000 Received: from mail-yw1-x112f.google.com ([2607:f8b0:4864:20::112f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wDasM-00000001akn-3MOT for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 04:32:20 +0000 Received: by mail-yw1-x112f.google.com with SMTP id 00721157ae682-799001d73bdso1465367b3.0 for ; Thu, 16 Apr 2026 21:32:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776400337; cv=none; d=google.com; s=arc-20240605; b=D6OfH8mHJWIU8L+vlQByOA7TtP27WkDzzFaOBDVBVggIaO+eK290Odz3btmEV/4oBO h2Lz8VUazO3GxblST5UcPicrO+qPbJkQoebyG+necqA6f3gJr2e9v5Qn+/lXncuDNJ2t she171kdvZQ8RmR+X/29RefBFA2/hqY/tu3uILBCVjx1+LtFlgFmFuEeNIo452efdbp6 OBZY4qsJEn0RoVi8vJKoWhlP+62KXvZRXcNDWt6QqIYUd5QPy2LsRTHqhw0hL81DGDgV tQlXJ046LsP6BQrszLfdij0ZGZ4hnqgTAUfkFkQUe5YdycNcR+v5oYz0Tf9UFcokUfSl QK7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=Ecf04ufuVyhTqQ8ZRmJzFiEvyxTHROhJ4d1Hw+C+PPs=; fh=6LtCsr+9gKGUCF0gTVEoKwJ42Uz/QNfW+UZ8MQXspts=; b=JIaQnPT7KS/NZhKtGw69loDuxIzAth+4MekHD7JhFLPiJm+4k2wmB8mWtFffjnmsWw p7a/Z/CXzNSzLwqwVViUGUq6feL7pgPwDy0g8x4M1Cf7BZiC/fhtKe+4ReDTtghz7ex+ HGv9CmUqmeB8G8mjUa/y0Rr0981bfFuNw+XurQEc5cOZnj/tGMzZH2pIuhkE27uICicI RoRcqIhkE1XMncd4QvtXyH1QYt2rdfgnKW65sB3Y0hVd0hj0y8BShc9cqehsZ6HwQs97 5+Rip498+Hk+vf9OMNapWrjFT05X7tjcorIPBPFzKDzYJRkb3cDpfpYn9TSQwZ+9Lg+K 0oHg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776400337; x=1777005137; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=Ecf04ufuVyhTqQ8ZRmJzFiEvyxTHROhJ4d1Hw+C+PPs=; b=n5Lcs13aBAxep6SfXTok7S/c26Lw1r2ZrWGkforW3ooH3NFZX+6h8AmyuD/TKQRarD ro3d+tnflJF0vEeKThK0PE1lyc8QnL+5CHM0uSueBS6xRom+KJyNHm3ZsU3VB0XFCgS2 Xou0UXu5YfFFLl5eafrqBy/N8IfYdiE81b7CqnFvDn9OZgf6JJAF0R2DinAxFp9ZH0ME WG0y14PGNv6+dvipew/Yp1rYImWPjZP+gKcPUVx+Mu2S43LPhvGI1Bkt5NmZtrOvc4QO xX/t59mMWT1DD1z2jrxOX4AyGP9LbrlgiMEFbDbbvePxkhkMmluytUFdx1JrD/5HOmNN Zb2Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776400337; x=1777005137; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Ecf04ufuVyhTqQ8ZRmJzFiEvyxTHROhJ4d1Hw+C+PPs=; b=rC4hSwOu2N9T50/Psa+ysTOcpuYoB90wiBzP+AjvS29SL6QdNgBbAO2Cm9N1xD3CwU kEyYSrKqtUFMsLUVms8D2Gtbs3Jy2eESqzPxOQ1GA6vGNxNp2XQH6ChsvgyIDMyPdaaJ cZl3O5wTdybNb4+2O4ah6V4MhcSBr4QL+cCgB31hPeUbi+eJtReT9qDa6D0TKojaJlWP PQiDP9HAOCY0V58COTwvDEUf8gwu5lUTNmkYAr32ZY9iisgKc8iB0TIvvYXGJ6McOHpJ QXtiiMmDmF77eLkksOdxREbUI9K/itIN96G300WCi1gKj0K3NVSYxkzpJViN8j6mw4dL 0VEg== X-Forwarded-Encrypted: i=1; AFNElJ9ezFt2gkb1DfszxS1R/d19wbqUJ8VZJ+0EJOZvVstjKY3FZE9NSKSLGcLXqItPM6Gz1c8bZYRCa3L7Ala4@lists.postgresql.org X-Gm-Message-State: AOJu0YxK2Nq6MDTKw022Kig+pWbvfNXeEUXZmw2A7Q+KeWttHcnwcZdP E/RFjjzuHMaEz4k+znA2q6t3ST4q50UWrTKi3TGFMULIik5uFMOLg1Ypv2wuMHPK2dVcxdGE5Vm cHU+YO88GzXCF3Cj8yFFO4EKjbCeyuXo= X-Gm-Gg: AeBDievfEcvfac9qp6sRokn6qjXntTADvhB3N7yebZLxb/ki8D86M/ARhwzycHX47ir mbaPr2QFE0IDr0jjuCfZF9uRW7kA0SpF45+f09mBiJ/O1qZwTyt7JoPWKOJNUDYd3KaoRp3NrFU Ucdd1nqhd2O6D19OXeWSlmIyrqO3X+WbU7nNRXaxFnEwyryfK0y8FFUnN8FfeFqGC2kghdJE8fb lQxStBfstUEGXX8Wwweaf89kSsUyxf3kicoTqHuIqJXSmxOiWJxm6QnnLXjxzwZd5N0SRvo2OMw 2sfAGdmnA5fSK1lOwA== X-Received: by 2002:a05:690c:7283:b0:79a:d277:21c6 with SMTP id 00721157ae682-7b9eccaa15fmr14296617b3.0.1776400337106; Thu, 16 Apr 2026 21:32:17 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: vignesh C Date: Fri, 17 Apr 2026 10:02:04 +0530 X-Gm-Features: AQROBzDmLCcVp6E-FQRSllDx7ERvYD_gOFvwyoPRVIKvngUIGWvpYlWoKdYj9mU Message-ID: Subject: Re: Fix tab completion after EXCEPT (...) in IMPORT FOREIGN SCHEMA To: Fujii Masao Cc: shveta malik , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="00000000000012c2a4064fa06fce" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000012c2a4064fa06fce Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, 16 Apr 2026 at 22:39, Fujii Masao wrote: > > On Thu, Apr 16, 2026 at 1:00=E2=80=AFPM shveta malik wrote: > > > > On Wed, Apr 15, 2026 at 8:45=E2=80=AFPM vignesh C = wrote: > > > > > > Hi all, > > > > > > While reviewing tab completion behavior, I noticed an issue after > > > EXCEPT (...) support was added to CREATE PUBLICATION. > > > Currently, after typing: > > > IMPORT FOREIGN SCHEMA public EXCEPT (t1) > > > > > > psql correctly suggests FROM SERVER. However, the existing completion > > > rule uses a generic: > > > TailMatches("EXCEPT", "(*)") > > > > > > Previously this was safe because no other command used EXCEPT (...). > > > Now that CREATE PUBLICATION also supports EXCEPT (...), the same rule > > > can incorrectly match publication commands and suggest FROM SERVER > > > there as well. > > > > > > The attached patch fixes this by restricting the EXCEPT (...) path to > > > IMPORT FOREIGN SCHEMA using HeadMatches(), while preserving the > > > existing LIMIT TO (...) behavior. > > Thanks for the patch! > > - else if (TailMatches("LIMIT", "TO", "(*)") || > + else if (HeadMatches("IMPORT", "FOREIGN", "SCHEMA", MatchAny) && > TailMatches("EXCEPT", "(*)")) > COMPLETE_WITH("FROM SERVER"); > + else if (TailMatches("LIMIT", "TO", "(*)")) > + COMPLETE_WITH("FROM SERVER"); > > Do we really need to split this into two conditions? Wouldn't it be simpl= er > to keep a single condition?, for example: > > ------------------- > else if (TailMatches("LIMIT", "TO", "(*)") || > - TailMatches("EXCEPT", "(*)")) > + Matches("IMPORT", "FOREIGN", "SCHEMA", MatchAny, "EXCEPT", "(*)")) > COMPLETE_WITH("FROM SERVER"); > ------------------- Yes, this is better. The attached v2 version patch has the changes for the = same. Regards, Vignesh --00000000000012c2a4064fa06fce Content-Type: application/octet-stream; name="v2-0001-Fix-tab-completion-after-EXCEPT-in-IMPORT-FOREIGN.patch" Content-Disposition: attachment; filename="v2-0001-Fix-tab-completion-after-EXCEPT-in-IMPORT-FOREIGN.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mo2euyw40 RnJvbSA3YzZlMTljMTRkMjBjMDJiMzNmMjI1MzE5NDdjZjljYTFjYjAwYTIxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBWaWduZXNoIEMgPHZpZ25lc2gyMUBnbWFpbC5jb20+CkRhdGU6 IFdlZCwgMTUgQXByIDIwMjYgMTg6MzA6MDMgKzA1MzAKU3ViamVjdDogW1BBVENIIHYyXSBGaXgg dGFiIGNvbXBsZXRpb24gYWZ0ZXIgRVhDRVBUKCkgaW4gSU1QT1JUIEZPUkVJR04gU0NIRU1BCgpU YWIgY29tcGxldGlvbiBmb3IgSU1QT1JUIEZPUkVJR04gU0NIRU1BIGluY29ycmVjdGx5IHN1Z2dl c3RlZCBGUk9NClNFUlZFUiBhZnRlciBFWENFUFQgKC4uLiksIGJlY2F1c2UgRVhDRVBUICguLi4p IGlzIG5vdyBhbHNvIHZhbGlkIGluCkNSRUFURSBhbmQgQUxURVIgUFVCTElDQVRJT04uCgpQcmV2 aW91c2x5LCB0aGUgZ2VuZXJpYyBUYWlsTWF0Y2hlcygiRVhDRVBUIiwgIigqKSIpIGNoZWNrIHdh cyBzYWZlCmJlY2F1c2Ugbm8gb3RoZXIgY29tbWFuZCB1c2VkICdFWENFUFQgKC4uLiknLiBBZnRl ciBhZGRpbmcgc3VwcG9ydCBmb3IKJ0VYQ0VQVCAoLi4uKScgaW4gcHVibGljYXRpb24gY29tbWFu ZHMsIHRoZSBzYW1lIGNvbXBsZXRpb24gcnVsZSBzdGFydGVkCm1hdGNoaW5nIHVucmVsYXRlZCBz dGF0ZW1lbnRzIGFuZCBpbmNvcnJlY3RseSBvZmZlcmVkICdGUk9NIFNFUlZFUicKdGhlcmUgYXMg d2VsbC4KCkZpeCB0aGlzIGJ5IHJlc3RyaWN0aW5nIHRoZSAnRVhDRVBUICguLi4pJyBjb21wbGV0 aW9uIHBhdGggdG8KJ0lNUE9SVCBGT1JFSUdOIFNDSEVNQScgdXNpbmcgTWF0Y2hlcygpLgoKVGhp cyBlbnN1cmVzICdGUk9NIFNFUlZFUicgaXMgc3VnZ2VzdGVkIG9ubHkgZm9yIHZhbGlkCidJTVBP UlQgRk9SRUlHTiBTQ0hFTUEnIHN5bnRheC4KLS0tCiBzcmMvYmluL3BzcWwvdGFiLWNvbXBsZXRl LmluLmMgfCAyICstCiAxIGZpbGUgY2hhbmdlZCwgMSBpbnNlcnRpb24oKyksIDEgZGVsZXRpb24o LSkKCmRpZmYgLS1naXQgYS9zcmMvYmluL3BzcWwvdGFiLWNvbXBsZXRlLmluLmMgYi9zcmMvYmlu L3BzcWwvdGFiLWNvbXBsZXRlLmluLmMKaW5kZXggOTk5MGY4MTg5NDIuLmRiNjVkMTMwZmNiIDEw MDY0NAotLS0gYS9zcmMvYmluL3BzcWwvdGFiLWNvbXBsZXRlLmluLmMKKysrIGIvc3JjL2Jpbi9w c3FsL3RhYi1jb21wbGV0ZS5pbi5jCkBAIC00OTAwLDcgKzQ5MDAsNyBAQCBtYXRjaF9wcmV2aW91 c193b3JkcyhpbnQgcGF0dGVybl9pZCwKIAllbHNlIGlmIChNYXRjaGVzKCJJTVBPUlQiLCAiRk9S RUlHTiIsICJTQ0hFTUEiLCBNYXRjaEFueSkpCiAJCUNPTVBMRVRFX1dJVEgoIkVYQ0VQVCAoIiwg IkZST00gU0VSVkVSIiwgIkxJTUlUIFRPICgiKTsKIAllbHNlIGlmIChUYWlsTWF0Y2hlcygiTElN SVQiLCAiVE8iLCAiKCopIikgfHwKLQkJCSBUYWlsTWF0Y2hlcygiRVhDRVBUIiwgIigqKSIpKQor CQkJIE1hdGNoZXMoIklNUE9SVCIsICJGT1JFSUdOIiwgIlNDSEVNQSIsIE1hdGNoQW55LCAiRVhD RVBUIiwgIigqKSIpKQogCQlDT01QTEVURV9XSVRIKCJGUk9NIFNFUlZFUiIpOwogCWVsc2UgaWYg KFRhaWxNYXRjaGVzKCJGUk9NIiwgIlNFUlZFUiIsIE1hdGNoQW55KSkKIAkJQ09NUExFVEVfV0lU SCgiSU5UTyIpOwotLSAKMi40My4wCgo= --00000000000012c2a4064fa06fce--