diff options
author | Alexander Korotkov <akorotkov@postgresql.org> | 2019-09-25 21:54:14 +0300 |
---|---|---|
committer | Alexander Korotkov <akorotkov@postgresql.org> | 2019-09-25 22:51:51 +0300 |
commit | bffe1bd68457e43925c362d8728ce3b25bdf1c94 (patch) | |
tree | d4de7be9e4e227a170a8852ab64ff2b610ec5195 /doc/src | |
parent | 6dda292d4df82a9158d1acc93feecf3b84637b59 (diff) | |
download | postgresql-bffe1bd68457e43925c362d8728ce3b25bdf1c94.tar.gz postgresql-bffe1bd68457e43925c362d8728ce3b25bdf1c94.zip |
Implement jsonpath .datetime() method
This commit implements jsonpath .datetime() method as it's specified in
SQL/JSON standard. There are no-argument and single-argument versions of
this method. No-argument version selects first of ISO datetime formats
matching input string. Single-argument version accepts template string as
its argument.
Additionally to .datetime() method itself this commit also implements
comparison ability of resulting date and time values. There is some difficulty
because exising jsonb_path_*() functions are immutable, while comparison of
timezoned and non-timezoned types involves current timezone. At first, current
timezone could be changes in session. Moreover, timezones themselves are not
immutable and could be updated. This is why we let existing immutable functions
throw errors on such non-immutable comparison. In the same time this commit
provides jsonb_path_*_tz() functions which are stable and support operations
involving timezones. As new functions are added to the system catalog,
catversion is bumped.
Support of .datetime() method was the only blocker prevents T832 from being
marked as supported. sql_features.txt is updated correspondingly.
Extracted from original patch by Nikita Glukhov, Teodor Sigaev, Oleg Bartunov.
Heavily revised by me. Comments were adjusted by Liudmila Mantrova.
Discussion: https://postgr.es/m/fcc6fc6a-b497-f39a-923d-aa34d0c588e8%402ndQuadrant.com
Discussion: https://postgr.es/m/CAPpHfdsZgYEra_PeCLGNoXOWYx6iU-S3wF8aX0ObQUcZU%2B4XTw%40mail.gmail.com
Author: Alexander Korotkov, Nikita Glukhov, Teodor Sigaev, Oleg Bartunov, Liudmila Mantrova
Reviewed-by: Anastasia Lubennikova, Peter Eisentraut
Diffstat (limited to 'doc/src')
-rw-r--r-- | doc/src/sgml/func.sgml | 117 |
1 files changed, 101 insertions, 16 deletions
diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 3d3d9d91836..67f1a828a89 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -11912,16 +11912,6 @@ table2-mapping <itemizedlist> <listitem> <para> - <literal>.datetime()</literal> item method is not implemented yet - mainly because immutable <type>jsonpath</type> functions and operators - cannot reference session timezone, which is used in some datetime - operations. Datetime support will be added to <type>jsonpath</type> - in future versions of <productname>PostgreSQL</productname>. - </para> - </listitem> - - <listitem> - <para> A path expression can be a Boolean predicate, although the SQL/JSON standard allows predicates only in filters. This is necessary for implementation of the <literal>@@</literal> operator. For example, @@ -12191,6 +12181,20 @@ table2-mapping <entry><literal>0.3</literal></entry> </row> <row> + <entry><literal>datetime()</literal></entry> + <entry>Date/time value converted from a string</entry> + <entry><literal>["2015-8-1", "2015-08-12"]</literal></entry> + <entry><literal>$[*] ? (@.datetime() < "2015-08-2". datetime())</literal></entry> + <entry><literal>2015-8-1</literal></entry> + </row> + <row> + <entry><literal>datetime(<replaceable>template</replaceable>)</literal></entry> + <entry>Date/time value converted from a string using the specified template</entry> + <entry><literal>["12:30", "18:40"]</literal></entry> + <entry><literal>$[*].datetime("HH24:MI")</literal></entry> + <entry><literal>"12:30:00", "18:40:00"</literal></entry> + </row> + <row> <entry><literal>keyvalue()</literal></entry> <entry> Sequence of object's key-value pairs represented as array of items @@ -12207,6 +12211,37 @@ table2-mapping </tgroup> </table> + <note> + <para> + The result type of <literal>datetime()</literal> and + <literal>datetime(<replaceable>template</replaceable>)</literal> + methods can be <type>date</type>, <type>timetz</type>, <type>time</type>, + <type>timestamptz</type>, or <type>timestamp</type>. + Both methods determine the result type dynamically. + </para> + <para> + The <literal>datetime()</literal> method sequentially tries ISO formats + for <type>date</type>, <type>timetz</type>, <type>time</type>, + <type>timestamptz</type>, and <type>timestamp</type>. It stops on + the first matching format and the corresponding data type. + </para> + <para> + The <literal>datetime(<replaceable>template</replaceable>)</literal> + method determines the result type by the provided template string. + </para> + <para> + The <literal>datetime()</literal> and + <literal>datetime(<replaceable>template</replaceable>)</literal> methods + use the same parsing rules as <literal>to_timestamp</literal> SQL + function does (see <xref linkend="functions-formatting"/>) with three + exceptions. At first, these methods doesn't allow unmatched template + patterns. At second, only following separators are allowed in the + template string: minus sign, period, solidus, comma, apostrophe, + semicolon, colon and space. At third, separators in the template string + must exactly match the input string. + </para> + </note> + <table id="functions-sqljson-filter-ex-table"> <title><type>jsonpath</type> Filter Expression Elements</title> <tgroup cols="5"> @@ -12350,6 +12385,15 @@ table2-mapping </tbody> </tgroup> </table> + + <note> + <para> + When different date/time values are compared, an implicit cast is + applied. A <type>date</type> value can be cast to <type>timestamp</type> + or <type>timestamptz</type>, <type>timestamp</type> can be cast to + <type>timestamptz</type>, and <type>time</type> — to <type>timetz</type>. + </para> + </note> </sect3> </sect2> @@ -12582,7 +12626,7 @@ table2-mapping <para> The <literal>@?</literal> and <literal>@@</literal> operators suppress the following errors: lacking object field or array element, unexpected - JSON item type, and numeric errors. + JSON item type, datetime and numeric errors. This behavior might be helpful while searching over JSON document collections of varying structure. </para> @@ -12852,17 +12896,32 @@ table2-mapping <primary>jsonb_path_exists</primary> </indexterm> <indexterm> + <primary>jsonb_path_exists_tz</primary> + </indexterm> + <indexterm> <primary>jsonb_path_match</primary> </indexterm> <indexterm> + <primary>jsonb_path_match_tz</primary> + </indexterm> + <indexterm> <primary>jsonb_path_query</primary> </indexterm> <indexterm> + <primary>jsonb_path_query_tz</primary> + </indexterm> + <indexterm> <primary>jsonb_path_query_array</primary> </indexterm> <indexterm> + <primary>jsonb_path_query_array_tz</primary> + </indexterm> + <indexterm> <primary>jsonb_path_query_first</primary> </indexterm> + <indexterm> + <primary>jsonb_path_query_first_tz</primary> + </indexterm> <table id="functions-json-processing-table"> <title>JSON Processing Functions</title> @@ -13202,6 +13261,9 @@ table2-mapping <para><literal> jsonb_path_exists(target jsonb, path jsonpath [, vars jsonb [, silent bool]]) </literal></para> + <para><literal> + jsonb_path_exists_tz(target jsonb, path jsonpath [, vars jsonb, silent bool]) + </literal></para> </entry> <entry><type>boolean</type></entry> <entry> @@ -13222,6 +13284,9 @@ table2-mapping <para><literal> jsonb_path_match(target jsonb, path jsonpath [, vars jsonb, silent bool]) </literal></para> + <para><literal> + jsonb_path_match_tz(target jsonb, path jsonpath [, vars jsonb, silent bool]) + </literal></para> </entry> <entry><type>boolean</type></entry> <entry> @@ -13243,6 +13308,9 @@ table2-mapping <para><literal> jsonb_path_query(target jsonb, path jsonpath [, vars jsonb, silent bool]) </literal></para> + <para><literal> + jsonb_path_query_tz(target jsonb, path jsonpath [, vars jsonb, silent bool]) + </literal></para> </entry> <entry><type>setof jsonb</type></entry> <entry> @@ -13271,6 +13339,9 @@ table2-mapping <para><literal> jsonb_path_query_array(target jsonb, path jsonpath [, vars jsonb, silent bool]) </literal></para> + <para><literal> + jsonb_path_query_array_tz(target jsonb, path jsonpath [, vars jsonb, silent bool]) + </literal></para> </entry> <entry><type>jsonb</type></entry> <entry> @@ -13291,6 +13362,9 @@ table2-mapping <para><literal> jsonb_path_query_first(target jsonb, path jsonpath [, vars jsonb, silent bool]) </literal></para> + <para><literal> + jsonb_path_query_first_tz(target jsonb, path jsonpath [, vars jsonb, silent bool]) + </literal></para> </entry> <entry><type>jsonb</type></entry> <entry> @@ -13433,11 +13507,8 @@ table2-mapping <note> <para> - The <literal>jsonb_path_exists</literal>, <literal>jsonb_path_match</literal>, - <literal>jsonb_path_query</literal>, <literal>jsonb_path_query_array</literal>, and - <literal>jsonb_path_query_first</literal> - functions have optional <literal>vars</literal> and <literal>silent</literal> - arguments. + The <literal>jsonb_path_*</literal> functions have optional + <literal>vars</literal> and <literal>silent</literal> arguments. </para> <para> If the <parameter>vars</parameter> argument is specified, it provides an @@ -13451,6 +13522,20 @@ table2-mapping </para> </note> + <note> + <para> + Some of the <literal>jsonb_path_*</literal> functions have the + <literal>_tz</literal> suffix. These functions have been implemented to + support comparison of date/time values that involves implicit + timezone-aware casts. Since operations with time zones are not immutable, + these functions are qualified as stable. Their counterparts without the + suffix do not support such casts, so they are immutable and can be used for + such use-cases as expression indexes + (see <xref linkend="indexes-expressional"/>). There is no difference + between these functions for other <type>jsonpath</type> operations. + </para> + </note> + <para> See also <xref linkend="functions-aggregate"/> for the aggregate function <function>json_agg</function> which aggregates record |