On 12/19/13, 12:01 AM, David Johnston wrote:
Marko Tiikkaja-4 wrote
On 2013-12-18 22:32, Andrew Dunstan wrote:
You're not really free to assume it - you'll need an exception handler
for the other-than-1 case, or your code might blow up.
This seems to be codifying a bad pattern, which should be using
array_lower() and array_upper() instead.
That's the entire point -- I *want* my code to blow up. If someone
passes a multi-dimensional array to a function that assumes its input is
one-dimensional and its indexes start from 1, I want it to be obvious
that the caller did something wrong. Now I either copy-paste lines and
lines of codes to always test for the weird cases or my code breaks in
This is no different from an Assert() somewhere -- if the caller breaks
the documented interface, it's his problem, not mine. And I don't want
to waste my time coding around the fact that this simple thing is so
hard to do in PG.
1) Why cannot we just make the second argument of the current function
optional and default to 1?
That still does the wrong thing for the empty array, multidimensional
arrays and arrays that don't start from index 1.
2) How about providing a function that returns the "1-dim/lower=1" input
array or raise/exception if the input array does not conform?
CREATE FUNCTION array_normal(arr anyarray) RETURNS anyarray
if (empty(arr)) return arr;
if (ndim(arr) > 1) raise exception;
if (array_lower() <> 1) raise exception
With this, I would still have to do
COALESCE(array_length(array_normal($1), 1), 0). That's pretty stupid
for the most common use case of arrays, don't you think?
I can also see wanting 1-dimensional enforced without having to require the
lower-bound to be 1 so maybe a separate function for that.
I really don't see the point. How often have you ever created a
function that doesn't have a lower bound of 1 on purpose? What good did
it serve you?
I could see this being especially useful for a domain and/or column
constraint definition and also allowing for a textbook case of separation of
What would array_length() in this case be? With what you suggested
above, you would still get NULL for an empty array.
I am torn, but mostly opposed, to making an array_length(anyarray) function
with these limitations enforced - especially if other similar functions are
not created at the same time. I fully agree that array_length(anyarray)
should be a valid call without requiring the user to specify ", 1" by rote.
I'm specifically asking for something that is different from
array_length(anyarray, int), because I personally think it's too full of
Sent via pgsql-hackers mailing list (email@example.com)
To make changes to your subscription: