On Mon, Oct 16, 2023 at 5:47 PM Amit Langote <amitlangot...@gmail.com> wrote: > > > We're currently looking into this case. > > Thanks for the report. I think I've figured out the problem -- > ExecEvalJsonExprCoercion() mishandles the EMPTY ARRAY ON EMPTY case. > > I'm reading the other 2 patches... > > -- > Thanks, Amit Langote > EDB: http://www.enterprisedb.com
query: select JSON_QUERY('[]'::jsonb, '$.mm' RETURNING text OMIT QUOTES EMPTY ON EMPTY); Breakpoint 2, ExecEvalJsonExpr (state=0x55e47ad685c0, op=0x55e47ad68818, econtext=0x55e47ad682e8) at ../../Desktop/pg_sources/main/postgres/src/backend/executor/execExprInterp.c:4188 4188 JsonExprState *jsestate = op->d.jsonexpr.jsestate; (gdb) fin Run till exit from #0 ExecEvalJsonExpr (state=0x55e47ad685c0, op=0x55e47ad68818, econtext=0x55e47ad682e8) at ../../Desktop/pg_sources/main/postgres/src/backend/executor/execExprInterp.c:4188 ExecInterpExpr (state=0x55e47ad685c0, econtext=0x55e47ad682e8, isnull=0x7ffe63659e2f) at ../../Desktop/pg_sources/main/postgres/src/backend/executor/execExprInterp.c:1556 1556 EEO_NEXT(); (gdb) p *op->resnull $1 = true (gdb) cont Continuing. Breakpoint 1, ExecEvalJsonExprCoercion (state=0x55e47ad685c0, op=0x55e47ad68998, econtext=0x55e47ad682e8, res=94439801785192, resnull=false) at ../../Desktop/pg_sources/main/postgres/src/backend/executor/execExprInterp.c:4453 4453 { (gdb) i args state = 0x55e47ad685c0 op = 0x55e47ad68998 econtext = 0x55e47ad682e8 res = 94439801785192 resnull = false (gdb) p *op->resnull $2 = false ------------------------------------------------------- in ExecEvalJsonExpr, *op->resnull is true. then in ExecEvalJsonExprCoercion *op->resnull is false. I am not sure why *op->resnull value changes, when changes. ------------------------------------------------------- in ExecEvalJsonExprCoercion, if resnull is true, then jb is null, but it seems there is no code to handle the case. ----------------------------- add the following code after ExecEvalJsonExprCoercion if (!InputFunctionCallSafe(...) works, but seems like a hack. if (!val_string) { *op->resnull = true; *op->resvalue = (Datum) 0; }