> On 17 Jul 2026, at 11:22, Chao Li <[email protected]> wrote:

> PG supports underscores between digits; for example, 1_0 is parsed as 10:
> ```
> evantest=# SELECT 1_0;
> ?column?
> ----------
>       10
> (1 row)
> ```
> 
> pg_plan_advice seems to intend to support the same syntax, based on 
> pgpa_scanner.l:

Agreed.

> The attached patch fixes this by using pg_strtoint32_safe() in the same way 
> as the core scanner.

Yes, but I think we need a bit more since we otherwise accept this case:

postgres=# set pg_plan_advice.advice = 'SEQ_SCAN(x#1_0_)';
SET
postgres=# explain (plan_advice) select 1;
                QUERY PLAN
------------------------------------------
 Result  (cost=0.00..0.01 rows=1 width=4)
 Supplied Plan Advice:
   SEQ_SCAN(x#10) /* not matched */
   SEQ_SCAN(_) /* not matched */
 Generated Plan Advice:
   NO_GATHER("*RESULT*")
(6 rows)

If we also match on integerjunk like in the attached v2 we instead get the
below which I think is more correct:

postgres=# set pg_plan_advice.advice = 'SEQ_SCAN(x#1_0_)';
ERROR:  invalid value for parameter "pg_plan_advice.advice": "SEQ_SCAN(x#1_0_)"
DETAIL:  Could not parse advice: trailing junk after numeric literal at or near 
"1_0_"

AFAICT this shouldn't break parsing for any legitimate cases, but I've only had
a quick look (the tests still pass though).

--
Daniel Gustafsson

Attachment: v2-0001-Fix-parsing-of-underscores-in-pg_plan_advice-occu.patch
Description: Binary data

Reply via email to