Re: [PATCH]Fix planner's strictness check for JsonExpr

From: Greg Burd <gregburd(at)protonmail(dot)com>
To: Keyerror Smart <smartkeyerror(at)gmail(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-20 18:55:54
Message-ID: ETYkZUyQLMBcr_QpuSW0lXbemS4reHcxWMCYR7uFZV5dbm6YBWUP7az8N6Nt0LxYTl3ClZUzFHD9Q4iifhhRzcHQ_tjEkQoK-DqjOwTB7N0=@protonmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers


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

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alexander Lakhin 2026-10-20 18:59:01 Re: pg_*_advice: tsv load failure, etc.
Previous Message Tom Lane 2026-10-20 18:31:23 Re: [DEPARSE] IS DOCUMENT as an operand loses needed parentheses