> On Jul 20, 2026, at 12:45, Chao Li <[email protected]> wrote: > > Hi, > > While playing with pg_plan_advice, I noticed another small issue. > > Each FOREIGN_JOIN target sublist must contain at least two relation > identifiers, as the error message states: > ``` > evantest=# SET pg_plan_advice.advice = 'FOREIGN_JOIN((x))'; > ERROR: invalid value for parameter "pg_plan_advice.advice": > "FOREIGN_JOIN((x))" > DETAIL: Could not parse advice: FOREIGN_JOIN targets must contain more than > one relation identifier at or near ")" > ``` > > However, it silently accepts an empty sublist: > ``` > evantest=# SET pg_plan_advice.advice = 'FOREIGN_JOIN(())'; > SET > ``` > > The problem is that, the parser currently checks whether the sublist length > is == 1, rather than < 2: > ``` > if ($$->tag == PGPA_TAG_FOREIGN_JOIN) > { > foreach_ptr(pgpa_advice_target, target, $3) > { > if (target->ttype == PGPA_TARGET_IDENTIFIER || > list_length(target->children) == 1) > pgpa_yyerror(result, parse_error_msg_p, yyscanner, > "FOREIGN_JOIN targets must contain more than one relation identifier"); > } > } > ``` > > So the fix is simply to change == 1 to < 2. With the fix, FOREIGN_JOIN(()) is > rejected: > ``` > evantest=# SET pg_plan_advice.advice = 'FOREIGN_JOIN(())'; > ERROR: invalid value for parameter "pg_plan_advice.advice": > "FOREIGN_JOIN(())" > DETAIL: Could not parse advice: FOREIGN_JOIN targets must contain more than > one relation identifier at or near ")" > ``` > > FOREIGN_JOIN() is still accepted. As documented in the opening comments of > syntax.sql, empty target lists are allowed for most advice tags, except > JOIN_ORDER: > ``` > -- An empty string is allowed. Empty target lists are allowed for most advice > -- tags, but not for JOIN_ORDER. "Supplied Plan Advice" should be omitted in > -- text format when there is no actual advice, but not in non-text format. > ```
OOPS! Missed the attachment. Best regards, -- Chao Li (Evan) HighGo Software Co., Ltd. https://www.highgo.com/
v1-0001-Fix-empty-FOREIGN_JOIN-sublist-validation.patch
Description: Binary data
