aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/jsonpath_exec.c
diff options
context:
space:
mode:
authorAlexander Korotkov <akorotkov@postgresql.org>2023-01-12 18:16:34 +0300
committerAlexander Korotkov <akorotkov@postgresql.org>2023-01-12 18:17:43 +0300
commit4dc3f94fae3de3f19b5c7dd507beac0216b0cde9 (patch)
tree8722a2aba4f16dfee6c3cdbea3cc3f556ead1330 /src/backend/utils/adt/jsonpath_exec.c
parent6f25e48774fe9302ca08dae07420df95998d792a (diff)
downloadpostgresql-4dc3f94fae3de3f19b5c7dd507beac0216b0cde9.tar.gz
postgresql-4dc3f94fae3de3f19b5c7dd507beac0216b0cde9.zip
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
Diffstat (limited to 'src/backend/utils/adt/jsonpath_exec.c')
-rw-r--r--src/backend/utils/adt/jsonpath_exec.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c
index 65c5a328625..ae27baaccea 100644
--- a/src/backend/utils/adt/jsonpath_exec.c
+++ b/src/backend/utils/adt/jsonpath_exec.c
@@ -958,9 +958,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;
}