diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2019-04-01 18:09:20 +0300 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2019-04-01 18:09:20 +0300 |
commit | b4cc19ab01ffe6a72a915b21aa41536de80923f5 (patch) | |
tree | 694ca7dabee34a7a8b1e6a03a9fe6a37efc24b57 /src/backend/utils/adt/jsonpath_exec.c | |
parent | 2e643501e5281ad5e0fa626dab1d51c1d38f639a (diff) | |
download | postgresql-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.c | 26 |
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(); } /* |