Teach jsonpath string() to unwrap in lax mode

This was an ommission in commit 66ea94e, and brings it into compliance
with both other methods and the standard.

Per complaint from David Wheeler.

Author: David Wheeler, Jeevan Chalke
Reviewed-by: Chapman Flack

Discussion: https://postgr.es/m/A64AE04F-4410-42B7-A141-7A7349260F4D@justatheory.com
pull/163/head
Andrew Dunstan 2 years ago
parent 81d20fbf7a
commit 653d3969bb
  1. 5
      doc/src/sgml/func.sgml
  2. 3
      src/backend/utils/adt/jsonpath_exec.c
  3. 12
      src/test/regress/expected/jsonb_jsonpath.out
  4. 1
      src/test/regress/sql/jsonb_jsonpath.sql

@ -17792,7 +17792,10 @@ ERROR: jsonpath member accessor can only be applied to an object
methods available in <type>jsonpath</type>. Note that while the unary
operators and methods can be applied to multiple values resulting from a
preceding path step, the binary operators (addition etc.) can only be
applied to single values.
applied to single values. In lax mode, methods applied to an array will be
executed for each value in the array. The exceptions are
<literal>.type()</literal> and <literal>.size()</literal>, which apply to
the array itself.
</para>
<table id="functions-sqljson-op-table">

@ -1606,6 +1606,9 @@ executeItemOptUnwrapTarget(JsonPathExecContext *cxt, JsonPathItem *jsp,
JsonbValue jbv;
char *tmp = NULL;
if (unwrap && JsonbType(jb) == jbvArray)
return executeItemUnwrapTargetArray(cxt, jsp, jb, found, false);
switch (JsonbType(jb))
{
case jbvString:

@ -2525,7 +2525,10 @@ select jsonb_path_query('null', '$.string()', silent => true);
(0 rows)
select jsonb_path_query('[]', '$.string()');
ERROR: jsonpath item method .string() can only be applied to a bool, string, numeric, or datetime value
jsonb_path_query
------------------
(0 rows)
select jsonb_path_query('[]', 'strict $.string()');
ERROR: jsonpath item method .string() can only be applied to a bool, string, numeric, or datetime value
select jsonb_path_query('{}', '$.string()');
@ -2576,6 +2579,13 @@ select jsonb_path_query('1234', '$.string().type()');
"string"
(1 row)
select jsonb_path_query('[2, true]', '$.string()');
jsonb_path_query
------------------
"2"
"true"
(2 rows)
select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()');
ERROR: cannot convert value from timestamptz to timestamp without time zone usage
HINT: Use *_tz() function for time zone support.

@ -586,6 +586,7 @@ select jsonb_path_query('"1.23aaa"', '$.string()');
select jsonb_path_query('1234', '$.string()');
select jsonb_path_query('true', '$.string()');
select jsonb_path_query('1234', '$.string().type()');
select jsonb_path_query('[2, true]', '$.string()');
select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()');
select jsonb_path_query_tz('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()'); -- should work
select jsonb_path_query_array('[1.23, "yes", false]', '$[*].string()');

Loading…
Cancel
Save