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 <[email protected]> 于2026年10月21日周三 02:56写道:

>
> On Monday, August 24th, 2026 at 6:13 AM, Keyerror Smart <
> [email protected]> 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
>

Reply via email to