Re: [PATCH] Exorcise "zero-dimensional" arrays (Was: Re: Should array_length() Return NULL)

From: Robert Haas <robertmhaas(at)gmail(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Brendan Jurd <direvus(at)gmail(dot)com>, Josh Berkus <josh(at)agliodbs(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: [PATCH] Exorcise "zero-dimensional" arrays (Was: Re: Should array_length() Return NULL)
Date: 2013-04-01 11:43:22
Message-ID: CA+TgmoZj0Q+bzM-T+Vg-y=Qni3M1jyV=XSmOn4mvePPydjzRFA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Tue, Mar 26, 2013 at 4:44 PM, Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> wrote:
> Robert Haas <robertmhaas(at)gmail(dot)com> writes:
>> Well, you could easily change array_ndims() to error out if ARR_NDIM()
>> is negative or more than MAXDIM and return NULL only if it's exactly
>> 0. That wouldn't break backward compatibility because it would throw
>> an error only if fed a value that shouldn't ever exist in the first
>> place, short of a corrupted database. I imagine the other functions
>> are amenable to similar treatment.
>
> I haven't looked at the patch in detail, but I thought one of the key
> changes was that '{}' would now be interpreted as a zero-length 1-D
> array rather than a zero-D array. If we do that it seems a bit moot
> to argue about whether we should exactly preserve backwards-compatible
> behavior in array_ndims(), because the input it's looking at won't be
> the same anymore anyway.
>
> In any case, the entire point of this proposal is that the current
> behavior around zero-D arrays is *broken* and we don't want to be
> backwards-compatible with it anymore. So if you wish to argue against
> that opinion, do so; but it seems a bit beside the point to simply
> complain that backwards compatibility is being lost.

I don't think the current behavior is broken. I found it
counterintuitive at first, but then I got used to it. It's reasonably
self-consistent: arrays can't have empty dimensions, therefore the
empty array is unique and dimensionless. Is that the behavior I would
have picked if I had designed the type? No, it isn't. I wouldn't
have tried to support one-dimensional arrays and multi-dimensional
arrays in the same data type either, nor would I have supported
non-default lower bounds. But all of those ships have sailed, and the
time to change them is not after people have spent 10 years building
applications that work with the current behavior. If we want to
introduce a new type with different, perhaps better, behavior, well, I
think that might be a fine idea. But I *don't* think imposing a hard
compatibility break on users of arrays is a good idea.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Robert Haas 2013-04-01 11:51:53 Re: Changing recovery.conf parameters into GUCs
Previous Message Robert Haas 2013-04-01 10:57:19 Re: [PATCH] Exorcise "zero-dimensional" arrays (Was: Re: Should array_length() Return NULL)