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 1wDQDy-002wpA-2l for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Apr 2026 17:09:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wDQDx-006P1W-2U for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Apr 2026 17:09:53 +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 1wDQDx-006P1N-1K for pgsql-hackers@lists.postgresql.org; Thu, 16 Apr 2026 17:09:53 +0000 Received: from mail-ot1-x329.google.com ([2607:f8b0:4864:20::329]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wDQDt-00000001REX-3hSi for pgsql-hackers@lists.postgresql.org; Thu, 16 Apr 2026 17:09:52 +0000 Received: by mail-ot1-x329.google.com with SMTP id 46e09a7af769-7d556c1a79eso11179413a34.3 for ; Thu, 16 Apr 2026 10:09:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776359385; cv=none; d=google.com; s=arc-20240605; b=YUfFwmsC0qEtljt3Mt+UOjUtkPfgCaA2q/4LpSa5pn/NbRcLJxRdzbWZV3OdduJGBb btz5nrq4QDpfv5KQCHJClUfbt22pA0Fax8UdSwlaBGO1KPKzcJO3XqaUnJxX8g5/490p ladYWPxAovJeI9/xOw9DrN863jCmSGyvK7Mtjcc755bLTtlS3wipUWqgWYiwCe6h0DQM lIk9mIxqcY4aa2JbBjRxLdVufwSmhHBivLZAk2BXco1yjUQkwCdD0O2AwB0NFmxHGwR5 sZSjTRbhr9npv+j2gVIPZ8/OEjMIIgJtoS6pj1rvhVdEuexXKZBe7TJxHQdcyRAW8QVS kdkw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=JNLbVzsbqt1erI7cb0ZT63H/LE1hbuX2/shxHNjywpo=; fh=L3KEH29bFGr3GlKZZhOzv7kB7LBS6NU6yLXrrzzjsAg=; b=AdHoA0JmYUZuszKUcjwoZZ1+j7XhYM0Vtt2ChCZgtaAr6kHOpwOsczphchyKEN8iRO PNgfd/7Kl0slH+Oj7pjEqLaDgFLAxJEi2nTgfx/l9HRDqqq29MU5BO/7+36CJFODcpRi bBTFAgFENPGfQ/6dbBwieiH5nFZZaUzJC+7L5M3/ZD+x5lEenykgUq7dXz+d7c8jkHZu vK+McSAVvDPYvSDzaQJZixK057jDsxUY14T9mn115xpI88HiO5oxKXbRYQ2WParbUIgG 7YiRuMDwzVBbpzM3dZC8bBCFhOqqo1aWFN+LUAg4xdzmQLz7y2shI/WM4Tx2aF11KxWZ Z7ww==; 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=1776359385; x=1776964185; darn=lists.postgresql.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=JNLbVzsbqt1erI7cb0ZT63H/LE1hbuX2/shxHNjywpo=; b=D8KtvP8h/HV2KklsymUE9Iec2OdfjboY5gym42sMnEXD28IpjKcbuHdM6cuo6/cY0g MtL+m5PZf8PvD8YH/rY7TfIofprmlAso3omgU/YPwaJekUlfKtj80ekRJ97lYcfsGzHS fkGxQNG7TFcLP3UmLok5LEfKdzj5CxME8AmEzIlNOfwZKFkhEt+ilyyDespUv96CYHkA owhl1oFPreMM0SEri0BkwOLK+JFodKNDGxEKm2lNEur7LQBnYa+X13LsGzNVhxgPZcCy Ya+FA1LomnQM7J/luIXT/LwQq1QRKILRW6TbzsFhU7DfRTY0WZyxGnnON/VMunLSF8aI GQcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776359385; x=1776964185; h=content-transfer-encoding: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=JNLbVzsbqt1erI7cb0ZT63H/LE1hbuX2/shxHNjywpo=; b=hEqUz2jh2Dsg3T4MePcM6z9daHc7n+ZV6m22SuTQl8lLO8Qv7dx3Hg2H/MhniZE3sk DeDZ3/SRtvYLheBj4dARb6a8mK1Osnw+vUmnvIWrXsK+vQo1Qv3t4VsY9sqOKDbRBV1a N1/jlX2qkSswFQswamx3BamHDs0jp/oYO/rEAb2QVIYOCu1xBm0yUmxCGkeJALDMMMls v6BK+l2ZkoePeEETGTlnf5wvkzZv8wErN3ov4w6C8TyHBB50v+dqGY2XcJA+f4zq80hh cd8SzEfURRfQWau+U+8cyJNUtxtmsUcHE119pjqrYDsoJGOoAb6t8cRJFuadYvR1ALpS wuGg== X-Forwarded-Encrypted: i=1; AFNElJ/2Ky9COkL/h8j24jwO/oz2LkjxM3UyMP4/kxd8qT2jqzn01DQgUb10YrNhbx2cKk5esj9HqvyAwiHYOg1V@lists.postgresql.org X-Gm-Message-State: AOJu0Yx6n/7Dv6XLMX1A6o2SY81HMHcyAI/p+4vBr4zB2rZbbwNsgfNd juoNdUPcvIx7ARlvW2SUjajCAJRwmTgr7SGDV42FrqZS8XRwijFntsHx088v7JSsYeqh/DrwTNj +Z8MbBTVdkQZQEYjIjQiKyNSxH/It8AcIX+4Audg= X-Gm-Gg: AeBDiesKCQv8IWJb8VUbA/kaz75ULf283VkJ/XoPuIDLO+2MGVvH0hO0PJOkTD/SVZn Q0zTXrXA+jNX6mfgK1NaCfZigoEwv13ZWalYjowMNDwJdvUhyrDmLKlG2QezR1+Fikj7YMbR+lu VWvSVNhznHmX2y0Dj1XBpgptXwbUfRWHjyISeVHXea/rEIIcoBGPQ5DCZDdOa24EuoEgMuYVjUj AKsojaqPS1IcGXHuvyU1g/JnNu0XJIJU7OrbbB2AoCy27Mb+V/2grQB0TG0xEZSuh9wVe6G6ipZ +LzdKs+GdtQ9A+fHR4ULsIP0cFHfzoVF80fgx5dca5rjrwSRaG8= X-Received: by 2002:a05:6820:2d08:b0:67e:3e13:3301 with SMTP id 006d021491bc7-68be84d35ccmr14244157eaf.47.1776359385447; Thu, 16 Apr 2026 10:09:45 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Fujii Masao Date: Fri, 17 Apr 2026 02:09:32 +0900 X-Gm-Features: AQROBzB9em9fnHdS46hwIo1v5tPErDPKFBaNU0ZCM-ySTCkB4wllcY7_aljQb_4 Message-ID: Subject: Re: Fix tab completion after EXCEPT (...) in IMPORT FOREIGN SCHEMA To: shveta malik Cc: vignesh C , PostgreSQL Hackers Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk 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 w= rote: > > > > 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 simpler to keep a single condition?, for example: ------------------- else if (TailMatches("LIMIT", "TO", "(*)") || - TailMatches("EXCEPT", "(*)")) + Matches("IMPORT", "FOREIGN", "SCHEMA", MatchAny, "EXCEPT", "(*)")) COMPLETE_WITH("FROM SERVER"); ------------------- Regards, --=20 Fujii Masao