postgres.git / summary / log / commit / refs

commit    9915fe22969a46f9d06d6c2c53dea7269ec4cc7e
Author:   Alexander Korotkov <akorotkov@postgresql.org>
Date:     Fri Jan 29 12:27:55 2021 +0000
First released in: 14.0, 12.6, 13.2

    Document behavior of the .** jsonpath accessor in the lax mode
    
    When the .** jsonpath accessor handles the array, it selects both array and
    each of its elements.  When using lax mode, subsequent accessors automatically
    unwrap arrays.  So, the content of each array element may be selected twice.
    
    Even though this behavior is counterintuitive, it's correct because everything
    works as designed.  This commit documents it.
    
    Backpatch to 12 where the jsonpath language was introduced.
    
    Reported-by: Thomas Kellerer
    Bug: #16828
    Discussion: https://postgr.es/m/16828-2b0229babfad2d8c%40postgresql.org
    Discussion: https://postgr.es/m/CAPpHfdtS-nNidT%3DEqZbAYOPcnNOWh_sd6skVdu2CAQUGdvpT8Q%40mail.gmail.com
    Author: Alexandex Korotkov, revised by Tom Lane
    Reviewed-by: Alvaro Herrera, Thomas Kellerer, Tom Lane
    Backpatch-through: 12


doc/src/sgml/func.sgml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index 79e97840fb8..7ba867b1b5c 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -16257,6 +16257,24 @@ strict $.track.segments[*].location </programlisting> </para> + <para> + The <literal>.**</literal> accessor can lead to surprising results + when using the lax mode. For instance, the following query selects every + <literal>HR</literal> value twice: +<programlisting> +lax $.**.HR +</programlisting> + This happens because the <literal>.**</literal> accessor selects both + the <literal>segments</literal> array and each of its elements, while + the <literal>.HR</literal> accessor automatically unwraps arrays when + using the lax mode. To avoid surprising results, we recommend using + the <literal>.**</literal> accessor only in the strict mode. The + following query selects each <literal>HR</literal> value just once: +<programlisting> +strict $.**.HR +</programlisting> + </para> + </sect3> <sect3 id="functions-sqljson-path-operators"> [parent: 4a9ce085ab30]