From 9e24e4781750ca92a0a5ff0aaa8e2091785c3bed Mon Sep 17 00:00:00 2001 From: Alexander Korotkov Date: Thu, 12 Jan 2023 18:16:34 +0300 Subject: Fix jsonpath existense checking of missing variables The current jsonpath code assumes that the referenced variable always exists. It could only throw an error at the value valuation time. At the same time existence checking assumes variable is present without valuation, and error suppression doesn't work for missing variables. This commit makes existense checking trigger an error for missing variables. This makes the overall behavior consistent. Backpatch to 12 where jsonpath was introduced. Reported-by: David G. Johnston Discussion: https://postgr.es/m/CAKFQuwbeytffJkVnEqDyLZ%3DrQsznoTh1OgDoOF3VmOMkxcTMjA%40mail.gmail.com Author: Alexander Korotkov, David G. Johnston Backpatch-through: 12 --- src/backend/utils/adt/jsonpath_exec.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src/backend/utils/adt/jsonpath_exec.c') diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c index a557ed1ce1e..37b08f1742a 100644 --- a/src/backend/utils/adt/jsonpath_exec.c +++ b/src/backend/utils/adt/jsonpath_exec.c @@ -891,9 +891,13 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp, JsonbValue *v; bool hasNext = jspGetNext(jsp, &elem); - if (!hasNext && !found) + if (!hasNext && !found && jsp->type != jpiVariable) { - res = jperOk; /* skip evaluation */ + /* + * Skip evaluation, but not for variables. We must + * trigger an error for the missing variable. + */ + res = jperOk; break; } -- cgit v1.2.3