pg_plan_advice: fix empty FOREIGN_JOIN sublist validation - Mailing list pgsql-hackers

From Chao Li
Subject pg_plan_advice: fix empty FOREIGN_JOIN sublist validation
Date
Msg-id BEDC04E0-6732-4310-95BA-6EC34BC1442C@gmail.com
Whole thread
Responses Re: pg_plan_advice: fix empty FOREIGN_JOIN sublist validation
List pgsql-hackers
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
formost 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.
```

Best regards,
--
Chao Li (Evan)
HighGo Software Co., Ltd.
https://www.highgo.com/







pgsql-hackers by date:

Previous
From: Grigoriy Novikov
Date:
Subject: Re: [PATCH] Add cascade synchronous replication
Next
From: shveta malik
Date:
Subject: Re: sequencesync worker race with REFRESH SEQUENCES