| From: | Keyerror Smart <smartkeyerror(at)gmail(dot)com> |
|---|---|
| To: | Greg Burd <gregburd(at)protonmail(dot)com> |
| Cc: | PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org> |
| Subject: | Re: [PATCH]Fix planner's strictness check for JsonExpr |
| Date: | 2026-10-21 06:43:04 |
| Message-ID: | CAD=-kXadaua7UPHqkSnKHHHBwQWncbxMa315nT8NYQopgKb6JA@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
Hi Greg Burd,
Thanks for the review and the +1, and glad to hear you ran into the
same issue.
Regards,
Zhenglong Li
Greg Burd <gregburd(at)protonmail(dot)com> 于2026年10月21日周三 02:56写道:
>
> On Monday, August 24th, 2026 at 6:13 AM, Keyerror Smart <
> smartkeyerror(at)gmail(dot)com> wrote:
>
> > Hi, while testing JSON PASSING, I ran into a minor strictness handling
> bug.
> >
> > JsonExpr is implicitly treated as a strict node in
> contain_nonstrict_functions_walker(), but it
> > isn't actually strict with respect to its PASSING arguments. For
> instance:
> > ```sqlSELECT v FROM (VALUES (1)) a
> > LEFT JOIN (SELECT json_value('1', '$' PASSING y AS p) v
> > FROM (VALUES (1),(2)) b(y)) ss ON false;
> > -- Return 1, not correct
> >
> > -- pull-up plan
> > EXPLAIN (COSTS OFF)
> > SELECT v FROM (VALUES (1)) a
> > LEFT JOIN (SELECT json_value('1', '$' PASSING y AS p) v
> > FROM (VALUES (1),(2)) b(y)) ss ON false;
> > QUERY PLAN
> > ------------------------------------
> > Nested Loop Left Join
> > Disabled: true
> > Join Filter: false
> > -> Result
> > -> Result
> > Replaces: Scan on *VALUES*
> > One-Time Filter: false
> > Optimizer: Postgres-based planner
> > (8 rows)
> >
> > -- Using OFFSET 0 to prevent pulling up
> > SELECT v FROM (VALUES (1)) a
> > LEFT JOIN (SELECT json_value('1', '$' PASSING y AS p) v
> > FROM (VALUES (1),(2)) b(y) OFFSET 0) ss ON false;
> > -- Return NULL, correct
> > ```
> >
> > Fix by treating JsonExpr as non-strict, as we already do for CASE,
> > COALESCE and similar constructs. This is conservative -- a JsonExpr
> > with no PASSING arguments and constant ON EMPTY / ON ERROR behaviors
> > is in fact strict -- but distinguishing those cases hardly seems worth
> > the trouble.
> >
> > Patch attached.
> >
> > Regards,
> > Zhenglong Li
>
> Hello Zhenglong Li,
>
> I just happened upon this same issue yesterday in my testing. I was about
> to start a thread when I found yours so I reviewed your patch.
>
> The diagnosis is right, JsonExpr is not strict with respect to its PASSING
> arguments, so treating it as non-strict in
> contain_nonstrict_functions_walker()
> is the correct call, and matching CASE/COALESCE seems to me to be the
> natural
> place for it.
>
> So +1 from me on the approach and the patch. The conservative choice seems
> right, that case is rare and the cost of getting it wrong is a wrong
> answer.
>
> best.
>
> -greg
>
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Takeshi Ideriha | 2026-10-21 06:52:40 | Re: [PATCH] reindexdb: Fix schema name lookup in parallel mode |
| Previous Message | Hayato Kuroda (Fujitsu) | 2026-10-21 06:37:10 | RE: 035_standby_logical_decoding might fail due to FATAL message lost inside libpq |