aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/jsonpath_exec.c
diff options
context:
space:
mode:
authorAlexander Korotkov <akorotkov@postgresql.org>2019-04-01 18:09:20 +0300
committerAlexander Korotkov <akorotkov@postgresql.org>2019-04-01 18:09:20 +0300
commitb4cc19ab01ffe6a72a915b21aa41536de80923f5 (patch)
tree694ca7dabee34a7a8b1e6a03a9fe6a37efc24b57 /src/backend/utils/adt/jsonpath_exec.c
parent2e643501e5281ad5e0fa626dab1d51c1d38f639a (diff)
downloadpostgresql-b4cc19ab01ffe6a72a915b21aa41536de80923f5.tar.gz
postgresql-b4cc19ab01ffe6a72a915b21aa41536de80923f5.zip
Throw error in jsonb_path_match() when result is not single boolean
jsonb_path_match() checks if jsonb document matches jsonpath query. Therefore, jsonpath query should return single boolean. Currently, if result of jsonpath is not a single boolean, NULL is returned independently whether silent mode is on or off. But that appears to be wrong when silent mode is off. This commit makes jsonb_path_match() throw an error in this case. Author: Nikita Glukhov
Diffstat (limited to 'src/backend/utils/adt/jsonpath_exec.c')
-rw-r--r--src/backend/utils/adt/jsonpath_exec.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c
index c07225749e5..074cea24ae3 100644
--- a/src/backend/utils/adt/jsonpath_exec.c
+++ b/src/backend/utils/adt/jsonpath_exec.c
@@ -320,7 +320,6 @@ jsonb_path_match(PG_FUNCTION_ARGS)
{
Jsonb *jb = PG_GETARG_JSONB_P(0);
JsonPath *jp = PG_GETARG_JSONPATH_P(1);
- JsonbValue *jbv;
JsonValueList found = {0};
Jsonb *vars = NULL;
bool silent = true;
@@ -333,18 +332,27 @@ jsonb_path_match(PG_FUNCTION_ARGS)
(void) executeJsonPath(jp, vars, jb, !silent, &found);
- if (JsonValueListLength(&found) < 1)
- PG_RETURN_NULL();
-
- jbv = JsonValueListHead(&found);
-
PG_FREE_IF_COPY(jb, 0);
PG_FREE_IF_COPY(jp, 1);
- if (jbv->type != jbvBool)
- PG_RETURN_NULL();
+ if (JsonValueListLength(&found) == 1)
+ {
+ JsonbValue *jbv = JsonValueListHead(&found);
+
+ if (jbv->type == jbvBool)
+ PG_RETURN_BOOL(jbv->val.boolean);
+
+ if (jbv->type == jbvNull)
+ PG_RETURN_NULL();
+ }
+
+ if (!silent)
+ ereport(ERROR,
+ (errcode(ERRCODE_SINGLETON_JSON_ITEM_REQUIRED),
+ errmsg(ERRMSG_SINGLETON_JSON_ITEM_REQUIRED),
+ errdetail("expression should return a singleton boolean")));
- PG_RETURN_BOOL(jbv->val.boolean);
+ PG_RETURN_NULL();
}
/*