Improve documentation and testing of jsonpath string() for datetimes.

Point out that the output format depends on DateStyle, and test that,
along with testing some cases previously not covered.

In passing, adjust the horology test to verify that the prevailing
DateStyle is 'Postgres, MDY', much as it has long verified the
prevailing TimeZone.  We expect pg_regress to have set these up,
and there are multiple regression tests relying on these settings.

Also make the formatting of entries in table 9.50 more consistent.

David Wheeler (marginal additional hacking by me); review by jian he

Discussion: https://postgr.es/m/56955B33-6959-4FDA-A459-F00363ECDFEE@justatheory.com
This commit is contained in:
Tom Lane 2024-09-10 14:48:13 -04:00
parent 861086493f
commit ed055d249d
5 changed files with 137 additions and 21 deletions

View File

@ -18016,7 +18016,9 @@ ERROR: jsonpath member accessor can only be applied to an object
<returnvalue><replaceable>string</replaceable></returnvalue>
</para>
<para>
String value converted from a JSON boolean, number, string, or datetime
String value converted from a JSON boolean, number, string, or
datetime (the output format for datetimes is determined by
the <xref linkend="guc-datestyle"/> parameter)
</para>
<para>
<literal>jsonb_path_query_array('[1.23, "xyz", false]', '$[*].string()')</literal>
@ -18105,7 +18107,9 @@ ERROR: jsonpath member accessor can only be applied to an object
<returnvalue><replaceable>decimal</replaceable></returnvalue>
</para>
<para>
Rounded decimal value converted from a JSON number or string. <literal>precision</literal> and <literal>scale</literal> must be integer values.
Rounded decimal value converted from a JSON number or string
(<literal>precision</literal> and <literal>scale</literal> must be
integer values)
</para>
<para>
<literal>jsonb_path_query('1234.5678', '$.decimal(6, 2)')</literal>
@ -18207,7 +18211,7 @@ ERROR: jsonpath member accessor can only be applied to an object
</para>
<para>
Time without time zone value converted from a string, with fractional
seconds adjusted to the given precision.
seconds adjusted to the given precision
</para>
<para>
<literal>jsonb_path_query('"12:34:56.789"', '$.time(2)')</literal>
@ -18236,7 +18240,7 @@ ERROR: jsonpath member accessor can only be applied to an object
</para>
<para>
Time with time zone value converted from a string, with fractional
seconds adjusted to the given precision.
seconds adjusted to the given precision
</para>
<para>
<literal>jsonb_path_query('"12:34:56.789 +05:30"', '$.time_tz(2)')</literal>
@ -18265,7 +18269,7 @@ ERROR: jsonpath member accessor can only be applied to an object
</para>
<para>
Timestamp without time zone value converted from a string, with
fractional seconds adjusted to the given precision.
fractional seconds adjusted to the given precision
</para>
<para>
<literal>jsonb_path_query('"2023-08-15 12:34:56.789"', '$.timestamp(2)')</literal>
@ -18294,7 +18298,7 @@ ERROR: jsonpath member accessor can only be applied to an object
</para>
<para>
Timestamp with time zone value converted from a string, with fractional
seconds adjusted to the given precision.
seconds adjusted to the given precision
</para>
<para>
<literal>jsonb_path_query('"2023-08-15 12:34:56.789 +05:30"', '$.timestamp_tz(2)')</literal>

View File

@ -1,13 +1,18 @@
--
-- HOROLOGY
--
SET DateStyle = 'Postgres, MDY';
SHOW TimeZone; -- Many of these tests depend on the prevailing setting
SHOW TimeZone; -- Many of these tests depend on the prevailing settings
TimeZone
----------
PST8PDT
(1 row)
SHOW DateStyle;
DateStyle
---------------
Postgres, MDY
(1 row)
--
-- Test various input formats
--

View File

@ -2636,15 +2636,6 @@ select jsonb_path_query('[2, true]', '$.string()');
"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.
select jsonb_path_query_tz('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()'); -- should work
jsonb_path_query_tz
----------------------------
"Tue Aug 15 00:04:56 2023"
(1 row)
select jsonb_path_query_array('[1.23, "yes", false]', '$[*].string()');
jsonb_path_query_array
--------------------------
@ -2657,6 +2648,104 @@ select jsonb_path_query_array('[1.23, "yes", false]', '$[*].string().type()');
["string", "string", "string"]
(1 row)
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.
select jsonb_path_query_tz('"2023-08-15 12:34:56 +5:30"', '$.timestamp().string()'); -- should work
jsonb_path_query_tz
----------------------------
"Tue Aug 15 00:04:56 2023"
(1 row)
select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp_tz().string()');
ERROR: cannot convert value from timestamp to timestamptz without time zone usage
HINT: Use *_tz() function for time zone support.
select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz().string()'); -- should work
jsonb_path_query_tz
--------------------------------
"Tue Aug 15 12:34:56 2023 PDT"
(1 row)
select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp_tz().string()');
jsonb_path_query
--------------------------------
"Tue Aug 15 00:04:56 2023 PDT"
(1 row)
select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()');
jsonb_path_query
----------------------------
"Tue Aug 15 12:34:56 2023"
(1 row)
select jsonb_path_query('"12:34:56 +5:30"', '$.time_tz().string()');
jsonb_path_query
------------------
"12:34:56+05:30"
(1 row)
select jsonb_path_query_tz('"12:34:56"', '$.time_tz().string()');
jsonb_path_query_tz
---------------------
"12:34:56-07"
(1 row)
select jsonb_path_query('"12:34:56"', '$.time().string()');
jsonb_path_query
------------------
"12:34:56"
(1 row)
select jsonb_path_query('"2023-08-15"', '$.date().string()');
jsonb_path_query
------------------
"08-15-2023"
(1 row)
set datestyle = 'ISO';
select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz().string()');
jsonb_path_query_tz
--------------------------
"2023-08-15 12:34:56-07"
(1 row)
select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp_tz().string()');
jsonb_path_query
--------------------------
"2023-08-15 00:04:56-07"
(1 row)
select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()');
jsonb_path_query
-----------------------
"2023-08-15 12:34:56"
(1 row)
select jsonb_path_query('"12:34:56 +5:30"', '$.time_tz().string()');
jsonb_path_query
------------------
"12:34:56+05:30"
(1 row)
select jsonb_path_query_tz('"12:34:56"', '$.time_tz().string()');
jsonb_path_query_tz
---------------------
"12:34:56-07"
(1 row)
select jsonb_path_query('"12:34:56"', '$.time().string()');
jsonb_path_query
------------------
"12:34:56"
(1 row)
select jsonb_path_query('"2023-08-15"', '$.date().string()');
jsonb_path_query
------------------
"2023-08-15"
(1 row)
reset datestyle;
-- Test .time()
select jsonb_path_query('null', '$.time()');
ERROR: jsonpath item method .time() can only be applied to a string

View File

@ -1,9 +1,9 @@
--
-- HOROLOGY
--
SET DateStyle = 'Postgres, MDY';
SHOW TimeZone; -- Many of these tests depend on the prevailing setting
SHOW TimeZone; -- Many of these tests depend on the prevailing settings
SHOW DateStyle;
--
-- Test various input formats

View File

@ -598,10 +598,28 @@ 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()');
select jsonb_path_query_array('[1.23, "yes", false]', '$[*].string().type()');
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('"2023-08-15 12:34:56"', '$.timestamp_tz().string()');
select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz().string()'); -- should work
select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp_tz().string()');
select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()');
select jsonb_path_query('"12:34:56 +5:30"', '$.time_tz().string()');
select jsonb_path_query_tz('"12:34:56"', '$.time_tz().string()');
select jsonb_path_query('"12:34:56"', '$.time().string()');
select jsonb_path_query('"2023-08-15"', '$.date().string()');
set datestyle = 'ISO';
select jsonb_path_query_tz('"2023-08-15 12:34:56"', '$.timestamp_tz().string()');
select jsonb_path_query('"2023-08-15 12:34:56 +5:30"', '$.timestamp_tz().string()');
select jsonb_path_query('"2023-08-15 12:34:56"', '$.timestamp().string()');
select jsonb_path_query('"12:34:56 +5:30"', '$.time_tz().string()');
select jsonb_path_query_tz('"12:34:56"', '$.time_tz().string()');
select jsonb_path_query('"12:34:56"', '$.time().string()');
select jsonb_path_query('"2023-08-15"', '$.date().string()');
reset datestyle;
-- Test .time()
select jsonb_path_query('null', '$.time()');