pg.ddx.io  pgsql-docs@postgresql.org mailing list archive  
help / color / mirror / Atom feed
From: Andreas Bergmaier <ab@principiamentis.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-docs@lists.postgresql.org <pgsql-docs@lists.postgresql.org>
Cc: pgsql-bugs@lists.postgresql.org <pgsql-bugs@lists.postgresql.org>
Subject: Re: BUG #16022: to_json on arrays with unusual lower bound is not intuitive
Date: Thu, 26 Sep 2019 13:09:03 +0000
Message-ID: <f5446e31-4e39-3c90-7bf9-3805fe9f282c@principiamentis.com> (raw)
In-Reply-To: <23022.1569422056@sss.pgh.pa.us>
References: <16022-5c864f8a572d5b5b@postgresql.org>
	<23022.1569422056@sss.pgh.pa.us>

Hi!

On 25.09.19 16:34, Tom Lane wrote:
> PG Bug reporting form <noreply@postgresql.org> writes:
>> I would expect the array indices of a JSON array to match with the
>> subscripts of a postgres array when converting them back and forth.
>> However, Postgres lets the JSON array begin at the `lower_bound` of the
>> array, not at subscript 1 (= index 0).
>> For example, `to_json('[-2:5]={-2,-1,0,1,2,3,4,5}'::int[])` results in
>> `[-2,-1,0,1,2,3,4,5]` where I would have expected `[1,2,3,4,5]` (or an
>> error, since JSON arrays must not have negative indices).
> 
> I can see no reason whatever for either of those definitions to be
> better than the established one.  If you want some other conversion
> rule, write your own function that behaves the way you want.

OK, I agree it's kinda unreasonable to change this.

However, I would like to see this behaviour documented at 
https://www.postgresql.org/docs/current/functions-json.html, so FUP'd to 
pgsql-docs.

I propose to add the following description to Table 9.45:

| The resulting JSON array starts at the lower bound of the PostgreSQL 
array, regardless whether that is 1 or not.

Maybe also add `to_json('[3:8]={3,4,5,6,7,8}'::int[])` becoming 
`[3,4,5,6,7,8]` to the examples.

While we're at it, I would also like to see the documentation of 
`array_lower` and `array_upper` to be improved in 
https://www.postgresql.org/docs/current/functions-array.html. I was a 
bit surprised that when passing an empty array, they did return `NULL` 
instead of the "default" value `1`. Can you add that as an example to 
the two table rows, or just add a simple "(NULL if empty)" parenthetical 
to their descriptions?
Alternatively, document it after the table:

| In `array_lower` and `array_upper`, `NULL` is returned if the array 
dimension does not exist or is empty.

kind regards,
  Andreas Bergmaier


view thread (3+ messages)

Message-ID: <f5446e31-4e39-3c90-7bf9-3805fe9f282c@principiamentis.com>
Permalink:  ../f5446e31-4e39-3c90-7bf9-3805fe9f282c@principiamentis.com/
Also on:    postgresql.org/message-id/f5446e31-4e39-3c90-7bf9-3805fe9f282c@principiamentis.com

 · 

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-docs@postgresql.org
  Cc: ab@principiamentis.com, tgl@sss.pgh.pa.us, pgsql-docs@lists.postgresql.org, pgsql-bugs@lists.postgresql.org
  Subject: Re: BUG #16022: to_json on arrays with unusual lower bound is not intuitive
  In-Reply-To: <f5446e31-4e39-3c90-7bf9-3805fe9f282c@principiamentis.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox