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 1wANjB-002KLO-2l for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 07:53:34 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wANi9-005t8Y-2n for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 07:52:30 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wANi9-005t8P-19 for pgsql-hackers@lists.postgresql.org; Wed, 08 Apr 2026 07:52:29 +0000 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wANi7-00000001BQ5-2ffb for pgsql-hackers@postgresql.org; Wed, 08 Apr 2026 07:52:28 +0000 Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-2b256a4c6b5so35260825ad.0 for ; Wed, 08 Apr 2026 00:52:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775634747; cv=none; d=google.com; s=arc-20240605; b=aPvaCr1bvUEOcv9DDHh/WUQotHJPClXv4VSucSoeE1Rp35mSQGd3mlklrqSICYtAQ9 fA/YzEPybIt/amS+/Rcnh2SklIF6sYyx9GB0pnO00avkhaes4eV09e0B3gNmVZ/NOQ81 cfdwKBb1RfSr3urolYU+r8viUcWxcGchMHYq72Clpd/MeskDi0uIgSed3IaKp7OL0oN5 Mkcvmt3OlihlvQhYhbQP/2fnJFTNpFBcPSzCCykzNWvw/TjNsrInOsVyOA9V9vWXrCvc 6/hZfW3EVrfa1/FQ26G/L3mNjXBm992QK6jy6TIiIumxpznzi2tjmmQoVTpPLi/DB5Fn FTRQ== 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=KONmhN/tByE8u5pHzHJCzZ+8Mh9DRDHxjTfPyrskrc8=; fh=nsh2wtTuoWJz7a4zDzfdZ5FITumQYPFcwNk9wHkGJOY=; b=SIsobRaOfy/FZZVqKJWxei8admFQziS+gCi3TnEP/fYXPwfDQG9TMrFN4wbz9kYY9H g+g4uaGOZZDj5dM7VFm5shvpl7SGiA7ZPcEHC53yHBnvpTu/lNszpvyN3HCDnBXQVWtI NcHpkw5yIlhkwwvf31/SR54rfqJ8QEnyytOyTT7u49MaozO0Kgk1WgSt+REePJEVX3FG snGzTyGxbesPq0KqSxCTXNQDFhcQJ4pMRG9zZxd0F09xYiC1+9ly7EU/sh/qXa1UfUF9 3ONjlF/o6KS3L2E5b5CnnM+LRWjPJk//DV6/ihtXzDhLAYfptO/+pJwLwsupuCwoIiQK ikbA==; darn=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=1775634747; x=1776239547; darn=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=KONmhN/tByE8u5pHzHJCzZ+8Mh9DRDHxjTfPyrskrc8=; b=Fn0XrZMte/ZPI9AKv/v7ma/fArZmCUsaBqqm3h8KjsJ/Cdg2p922Rw7NdBaBisv2H6 OoidFdH4TrmSoUtASreRPAuOP+psmsiI5xweB+2YGmeK9cqYqssviLvmTT90W0Juy/vE kNMI/xmIKapjsUoUX5VmGiXICkHCaA7L9zi+Sc1QX/CujJ40aB2OSWjNHdPuDabwSZce R5xJCsdxPlFS6/S7Lo0JuFuu2mtqJ4tp/m27nxk7FQ7DT9t/WA8+Iut0P5w77bu9DKts 6Cu4qbRR5U7SWfB1HHCHMPzjpI0X0WTuDti7u0X+/dK+E+ioOsXkGuxml+WafPTL21hJ 66bQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775634747; x=1776239547; 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=KONmhN/tByE8u5pHzHJCzZ+8Mh9DRDHxjTfPyrskrc8=; b=Tg2L20LEYHxbEJg6niFtPDX73j2R2JP0xIfRP2MpqjHXAisLA3mJybn4iLmM3greHz WYm9zGOpKwSRsy9Muwj1OBJWcJACd6WnjO7McaoL2A5Ah9cZL63iIqaDtsW0EV2LgKGO 0J7HV9LRDxXLHjKMmldDgFiMZFqyozig+NwPTFRnbYHGy7MFKX/8kPzBCQeCtcN1H6pG yEnine1AeF6mWx+sHP9PYOajQKLPQhTycxjoESWKHGTpd+7yo5zxwMQpAy7Bxwyd7mKf 75cnMjI6wfm/89m9vSW3VRE/a2B+Zt8NJfLWR1mlIW8aabyEx63P34W9mVFzezwHij5C JIOg== X-Gm-Message-State: AOJu0YztSbjnbKbHkQwxCmhS33i/Dkq9Tuj/q7ZtI1/cLayEmHjMgSEE rpkX4gZkspdMIHLZGq5pmqGBVVz9tXdiXFWX4nDBPt8b/cGmgE2EnFG3pLHhZ8IfHLIIiLZdMcP XToGxQQbj7ZZapXW5zsdnMNRg9tMrdS8= X-Gm-Gg: AeBDietAm2jUIyop4sUwmGCn5QJKZcsFGL1gs5WsGcdhhFJl/fpopRVoqfHx5vjLUHQ TopCgGcd4b2acarIbJbbW5pnJbNpfhpiUSQviwmcNjthunHBQXTg7DdNZ7NIbZuftmLqqHBxYLc rlpWvpilcMr3aHZzel7uL9WdVh7+ufSWpX8SibhnRVkSqnSunj3qcoRKW50ktTM4tpFpOld75WJ cc5fwDH2C3SYtOAjZmJ9F4H++duXQpdD3V/LJqTxKGDnHakizP4ktQq84ziC7495NH9+GVGXsoH 5IiiTgl2OjwZyWjHFP8RhKo7CpkevIuE X-Received: by 2002:a17:903:2ac5:b0:2b2:42da:25cc with SMTP id d9443c01a7336-2b28163ad55mr217213545ad.1.1775634746589; Wed, 08 Apr 2026 00:52:26 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: jie wang Date: Wed, 8 Apr 2026 15:52:10 +0800 X-Gm-Features: AQROBzAJc_q8nEB6qOXJGV0jetCnux3AithX_q2CFOE7by8VELh7EhhEb9wzkr8 Message-ID: Subject: Re: DOCS: pg_plan_advice minor doc fixes To: Lakshmi N Cc: pgsql-hackers@postgresql.org, pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000525d28064eee2ed4" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000525d28064eee2ed4 Content-Type: multipart/alternative; boundary="000000000000525d27064eee2ed2" --000000000000525d27064eee2ed2 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Lakshmi N =E4=BA=8E2026=E5=B9=B44=E6=9C=888=E6=97= =A5=E5=91=A8=E4=B8=89 15:09=E5=86=99=E9=81=93=EF=BC=9A > Hi hackers, > > I noticed the following minor discrepancy in the pg_plan_advice docs, > attached a patch to address this. > > (1) FOREIGN SCAN should be FOREIGN JOIN in the scan method advice tag. I > tested with FOREIGN SCAN and can confirm it gives a syntax error while th= e > other one works correctly. > > postgres=3D# SET pg_plan_advice.advice =3D 'FOREIGN_JOIN((t1 t2))'; > EXPLAIN (COSTS OFF, PLAN_ADVICE) > SELECT * FROM fdw_t1 t1 JOIN fdw_t2 t2 ON t1.id =3D t2.t1_id; > > SET > QUERY PLAN > ------------------------------------------------- > Foreign Scan > Relations: (fdw_t1 t1) INNER JOIN (fdw_t2 t2) > Supplied Plan Advice: > FOREIGN_JOIN((t1 t2)) /* matched */ > Generated Plan Advice: > FOREIGN_JOIN((t1 t2)) > NO_GATHER(t1 t2) > (7 rows) > > > (2) NESTED_LOOP_MEMOIZE is missing from the join method list in the doc > though it is supported. Verified this by running below: > > postgres=3D# SET pg_plan_advice.advice =3D 'NESTED_LOOP_MEMOIZE(d)'; > SET > postgres=3D# EXPLAIN (COSTS OFF, PLAN_ADVICE) select * from t1 f JOIN t2 = ON > f.id =3D t2.t1_id; > QUERY PLAN > -------------------------------------------- > Hash Join > Hash Cond: (t2.t1_id =3D f.id) > -> Seq Scan on t2 > -> Hash > -> Seq Scan on t1 f > Supplied Plan Advice: > NESTED_LOOP_MEMOIZE(d) /* not matched */ > Generated Plan Advice: > JOIN_ORDER(t2 f) > HASH_JOIN(f) > SEQ_SCAN(t2 f) > NO_GATHER(f t2) > (12 rows) > > Regards, > Lakshmi > Hi, I found that this patch is not fully modified and is missing a part: `Foreign Scan` ---> `Foreign Join` Best regards, -- wang jie --000000000000525d27064eee2ed2 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


Lakshmi N <<= a href=3D"mailto:lakshmin.jhs@gmail.com">lakshmin.jhs@gmail.com> =E4= =BA=8E2026=E5=B9=B44=E6=9C=888=E6=97=A5=E5=91=A8=E4=B8=89 15:09=E5=86=99=E9= =81=93=EF=BC=9A
=
Hi hackers,

I noticed the following min= or discrepancy in the pg_plan_advice docs, attached a patch to address this= .=C2=A0

(1) FOREIGN SCAN should be FOREIGN JOIN in= the scan method advice=C2=A0tag. I tested with FOREIGN SCAN and can confir= m it gives a syntax error while the other one works correctly.
postgres=3D# SET pg_plan_advice.advice =3D 'FOREIGN_JOIN((= t1 t2))';=C2=A0
EXPLAIN (COSTS OFF, PLAN_ADVICE)
=C2=A0 =C2=A0 SE= LECT * FROM fdw_t1 t1 JOIN fdw_t2 t2 ON=C2=A0t1.id=C2=A0=3D t2.t1_id;

SET
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0QUERY PLAN =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0
------------= -------------------------------------
=C2=A0Foreign Scan
=C2=A0 =C2= =A0Relations: (fdw_t1 t1) INNER JOIN (fdw_t2 t2)
=C2=A0Supplied Plan Adv= ice:
=C2=A0 =C2=A0FOREIGN_JOIN((t1 t2)) /* matched */
=C2=A0Generated= Plan Advice:
=C2=A0 =C2=A0FOREIGN_JOIN((t1 t2))
=C2=A0 =C2=A0NO_GATH= ER(t1 t2)
(7 rows)


(2) NESTE= D_LOOP_MEMOIZE is missing from the join method list in the doc though it is= supported.=C2=A0 Verified this by running below:

= postgres=3D# SET pg_plan_advice.advice =3D 'NESTED_LOOP_MEMOIZE(d)'= ;
SET
postgres=3D# EXPLAIN (COSTS OFF, PLAN_ADVICE) select * from t1 = f JOIN t2 ON=C2=A0f.id=C2=A0= =3D t2.t1_id;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0QUERY PLAN =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0--------------------------------------------
=C2=A0Hash Join
=C2=A0 = =C2=A0Hash Cond: (t2.t1_id =3D=C2=A0f.id)
=C2=A0 =C2=A0-> =C2=A0Seq Scan on t2
=C2=A0 =C2=A0-&= gt; =C2=A0Hash
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0-> =C2=A0Seq Scan on= t1 f
=C2=A0Supplied Plan Advice:
=C2=A0 =C2=A0NESTED_LOOP_MEMOIZE(d)= /* not matched */
=C2=A0Generated Plan Advice:
=C2=A0 =C2=A0JOIN_ORD= ER(t2 f)
=C2=A0 =C2=A0HASH_JOIN(f)
=C2=A0 =C2=A0SEQ_SCAN(t2 f)
=C2= =A0 =C2=A0NO_GATHER(f t2)
(12 rows)

Regards,
Lakshmi


Hi,
I found that this patch is not fully modified and is missing a part:<= br>`Foreign Scan` ---> =C2=A0`Foreign Join`

Best regards,
--
wang jie=C2=A0
--000000000000525d27064eee2ed2-- --000000000000525d28064eee2ed4 Content-Type: application/octet-stream; name="v2-0001-DOCS-Update-pgplanadvice-tags-for-FOREIGN_JOIN-an.patch" Content-Disposition: attachment; filename="v2-0001-DOCS-Update-pgplanadvice-tags-for-FOREIGN_JOIN-an.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnpqyh7d0 RnJvbSA4MzcyM2JmMGI5NmIwNDNiODQ5Yzc0N2RjMmRiYjFjODVhNTZmNmY4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMYWtzaG1pIE4gPGxha3NobWluLmpoc0BnbWFpbC5jb20+CkRh dGU6IFR1ZSwgNyBBcHIgMjAyNiAyMzo1ODoxNSAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggdjJdIERP Q1M6IFVwZGF0ZSBwZ3BsYW5hZHZpY2UgdGFncyBmb3IgRk9SRUlHTl9KT0lOIGFuZAogTkVTVEVE X0xPT1BfTUVNT0laRQoKLS0tCiBkb2Mvc3JjL3NnbWwvcGdwbGFuYWR2aWNlLnNnbWwgfCAxMiAr KysrKystLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA2IGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3BncGxhbmFkdmljZS5zZ21sIGIvZG9jL3Ny Yy9zZ21sL3BncGxhbmFkdmljZS5zZ21sCmluZGV4IGMzZTFjY2I2MGEyLi5lOGY1ZWRlYzg3NCAx MDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL3BncGxhbmFkdmljZS5zZ21sCisrKyBiL2RvYy9zcmMv c2dtbC9wZ3BsYW5hZHZpY2Uuc2dtbApAQCAtMjY2LDcgKzI2Niw3IEBAIFNFUV9TQ0FOKDxyZXBs YWNlYWJsZT50YXJnZXQ8L3JlcGxhY2VhYmxlPiBbIC4uLiBdKQogVElEX1NDQU4oPHJlcGxhY2Vh YmxlPnRhcmdldDwvcmVwbGFjZWFibGU+IFsgLi4uIF0pCiBJTkRFWF9TQ0FOKDxyZXBsYWNlYWJs ZT50YXJnZXQ8L3JlcGxhY2VhYmxlPiA8cmVwbGFjZWFibGU+aW5kZXhfbmFtZTwvcmVwbGFjZWFi bGU+IFsgLi4uIF0pCiBJTkRFWF9PTkxZX1NDQU4oPHJlcGxhY2VhYmxlPnRhcmdldDwvcmVwbGFj ZWFibGU+IDxyZXBsYWNlYWJsZT5pbmRleF9uYW1lPC9yZXBsYWNlYWJsZT4gWyAuLi4gXSkKLUZP UkVJR05fU0NBTigoPHJlcGxhY2VhYmxlPnRhcmdldDwvcmVwbGFjZWFibGU+IFsgLi4uIF0pIFsg Li4uIF0pCitGT1JFSUdOX0pPSU4oKDxyZXBsYWNlYWJsZT50YXJnZXQ8L3JlcGxhY2VhYmxlPiBb IC4uLiBdKSBbIC4uLiBdKQogQklUTUFQX0hFQVBfU0NBTig8cmVwbGFjZWFibGU+dGFyZ2V0PC9y ZXBsYWNlYWJsZT4gWyAuLi4gXSkKIERPX05PVF9TQ0FOKDxyZXBsYWNlYWJsZT50YXJnZXQ8L3Jl cGxhY2VhYmxlPiBbIC4uLiBdKTwvc3lub3BzaXM+CiAKQEAgLTI4OCwxMSArMjg4LDExIEBAIERP X05PVF9TQ0FOKDxyZXBsYWNlYWJsZT50YXJnZXQ8L3JlcGxhY2VhYmxlPiBbIC4uLiBdKTwvc3lu b3BzaXM+CiAgICA8L3BhcmE+CiAKICAgIDxwYXJhPgotICAgIDxsaXRlcmFsPkZPUkVJR05fU0NB TjwvbGl0ZXJhbD4gc3BlY2lmaWVzIHRoYXQgYSBqb2luIGJldHdlZW4gdHdvIG9yCisgICAgPGxp dGVyYWw+Rk9SRUlHTl9KT0lOPC9saXRlcmFsPiBzcGVjaWZpZXMgdGhhdCBhIGpvaW4gYmV0d2Vl biB0d28gb3IKICAgICBtb3JlIGZvcmVpZ24gdGFibGVzIHNob3VsZCBiZSBwdXNoZWQgZG93biB0 byBhIHJlbW90ZSBzZXJ2ZXIgc28KLSAgICB0aGF0IGl0IGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBh IHNpbmdsZSA8bGl0ZXJhbD5Gb3JlaWduIFNjYW48L2xpdGVyYWw+LgotICAgIFNwZWNpZnlpbmcg PGxpdGVyYWw+Rk9SRUlHTl9TQ0FOPC9saXRlcmFsPiBmb3IgYSBzaW5nbGUgZm9yZWlnbiB0YWJs ZSBpcwotICAgIG5laXRoZXIgbmVjZXNzYXJ5IG5vciBwZXJtaXNzaWJsZTogYSA8bGl0ZXJhbD5G b3JlaWduIFNjYW48L2xpdGVyYWw+IHdpbGwKKyAgICB0aGF0IGl0IGNhbiBiZSBpbXBsZW1lbnRl ZCBhcyBhIHNpbmdsZSA8bGl0ZXJhbD5Gb3JlaWduIEpvaW48L2xpdGVyYWw+LgorICAgIFNwZWNp ZnlpbmcgPGxpdGVyYWw+Rk9SRUlHTl9KT0lOPC9saXRlcmFsPiBmb3IgYSBzaW5nbGUgZm9yZWln biB0YWJsZSBpcworICAgIG5laXRoZXIgbmVjZXNzYXJ5IG5vciBwZXJtaXNzaWJsZTogYSA8bGl0 ZXJhbD5Gb3JlaWduIEpvaW48L2xpdGVyYWw+IHdpbGwKICAgICBuZWVkIHRvIGJlIHVzZWQgcmVn YXJkbGVzcy4gSWYgeW91IHdhbnQgdG8gcHJldmVudCBhIGpvaW4gZnJvbSBiZWluZwogICAgIHB1 c2hlZCBkb3duLCBjb25zaWRlciB1c2luZyB0aGUgPGxpdGVyYWw+Sk9JTl9PUkRFUjwvbGl0ZXJh bD4gdGFnIGZvcgogICAgIHRoYXQgcHVycG9zZS4KQEAgLTM5NSw3ICszOTUsNyBAQCBqb2luX21l dGhvZF9uYW1lKDxyZXBsYWNlYWJsZT5qb2luX21ldGhvZF9pdGVtPC9yZXBsYWNlYWJsZT4gWyAu Li4gXSkKIAogPHBocmFzZT53aGVyZSA8cmVwbGFjZWFibGU+am9pbl9tZXRob2RfbmFtZTwvcmVw bGFjZWFibGU+IGlzOjwvcGhyYXNlPgogCi17IE1FUkdFX0pPSU5fTUFURVJJQUxJWkUgfCBNRVJH RV9KT0lOX1BMQUlOIHwgTkVTVEVEX0xPT1BfTUFURVJJQUxJWkUgfCBORVNURURfTE9PUF9QTEFJ TiB8IEhBU0hfSk9JTiB9Cit7IE1FUkdFX0pPSU5fTUFURVJJQUxJWkUgfCBNRVJHRV9KT0lOX1BM QUlOIHwgTkVTVEVEX0xPT1BfTUFURVJJQUxJWkUgfCBORVNURURfTE9PUF9NRU1PSVpFIHwgTkVT VEVEX0xPT1BfUExBSU4gfCBIQVNIX0pPSU4gfQogCiA8cGhyYXNlPmFuZCA8cmVwbGFjZWFibGU+ am9pbl9tZXRob2RfaXRlbTwvcmVwbGFjZWFibGU+IGlzOjwvcGhyYXNlPgogCi0tIAoyLjM0LjEK Cg== --000000000000525d28064eee2ed4--