array_reverse()

Started by Craig Ringerover 16 years ago9 messagesgeneral
Jump to latest
#1Craig Ringer
craig@2ndquadrant.com

Hi all

Before I go ahead and try to write a decent quality version: is there
any chance an array_reverse() function (in C) would be accepted into Pg
mainline? If not, I probably won't bother cleaning up my current
awful-hack quality module.

It's a slow operation to perform in SQL or PL/PgSQL even with 8.4's
array_agg(...) and generate_subscripts(...) and given how many languages
seem to provide built-in support it seems to be an operation people need
quite a bit.

--
Craig Ringer

#2Merlin Moncure
mmoncure@gmail.com
In reply to: Craig Ringer (#1)
Re: array_reverse()

On Mon, Nov 2, 2009 at 1:49 AM, Craig Ringer
<craig@postnewspapers.com.au> wrote:

Hi all

Before I go ahead and try to write a decent quality version: is there
any chance an array_reverse() function (in C) would be accepted into Pg
mainline? If not, I probably won't bother cleaning up my current
awful-hack quality module.

It's a slow operation to perform in SQL or PL/PgSQL even with 8.4's
array_agg(...) and generate_subscripts(...) and given how many languages
seem to provide built-in support it seems to be an operation people need
quite a bit.

IMO, we should have both that and a string reverse() function. I just
bumped into the same problem yesterday and was surprised we didn't
have it already.

merlin

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Craig Ringer (#1)
Re: array_reverse()

Craig Ringer <craig@postnewspapers.com.au> writes:

Before I go ahead and try to write a decent quality version: is there
any chance an array_reverse() function (in C) would be accepted into Pg
mainline?

What would it mean for a multi-dimensional array?

regards, tom lane

#4Merlin Moncure
mmoncure@gmail.com
In reply to: Tom Lane (#3)
Re: array_reverse()

On Mon, Nov 2, 2009 at 9:20 AM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Craig Ringer <craig@postnewspapers.com.au> writes:

Before I go ahead and try to write a decent quality version: is there
any chance an array_reverse() function (in C) would be accepted into Pg
mainline?

What would it mean for a multi-dimensional array?

Couple of possibilities?:
*) Could raise an error for ndim != 1
*) could reverse top dimension only only (I like this the best), so that:

reverse(array[array[1,2], array[3,4]]) -> {{3,4},{1,2}};

*) maybe overload the above so that:
reverse(array[array[1,2], array[3,4]], array[1]) -> {{2,1},{3,4}};
reverse(array[array[1,2], array[3,4]], array[2]) -> {{1,2},{4,3}};

The second term would be int array of 1 to ndim -1 dimensions, so you
can re-arrange an array slice without restacking it.

merlin

#5Sam Mason
sam@samason.me.uk
In reply to: Tom Lane (#3)
Re: array_reverse()

On Mon, Nov 02, 2009 at 09:20:38AM -0500, Tom Lane wrote:

Craig Ringer <craig@postnewspapers.com.au> writes:

Before I go ahead and try to write a decent quality version: is there
any chance an array_reverse() function (in C) would be accepted into Pg
mainline?

What would it mean for a multi-dimensional array?

Rotating the array by 180 degrees in every dimension would give the same
answer for 1-dimensional arrays and give sensible answers for higher
dimensional arrays. For example:

1,2,3 == 3,2,1

[1 2 3 [9 8 7
4 5 6 == 6 5 4
7 8 9] 3 2 1]

I think higher dimensionality would work, it's just a bit fiddly to
draw.

--
Sam http://samason.me.uk/

#6Merlin Moncure
mmoncure@gmail.com
In reply to: Sam Mason (#5)
Re: array_reverse()

On Mon, Nov 2, 2009 at 9:51 AM, Sam Mason <sam@samason.me.uk> wrote:

On Mon, Nov 02, 2009 at 09:20:38AM -0500, Tom Lane wrote:

Craig Ringer <craig@postnewspapers.com.au> writes:

Before I go ahead and try to write a decent quality version: is there
any chance an array_reverse() function (in C) would be accepted into Pg
mainline?

What would it mean for a multi-dimensional array?

Rotating the array by 180 degrees in every dimension would give the same
answer for 1-dimensional arrays and give sensible answers for higher
dimensional arrays.  For example:

 1,2,3   ==  3,2,1

 [1 2 3     [9 8 7
  4 5 6  ==  6 5 4
  7 8 9]     3 2 1]

I think higher dimensionality would work, it's just a bit fiddly to
draw.

do you think that's the typical case, or is it more common to want to
reverse a particular slice? (I like your idea actually, because if
you need a slice you can slice notation one out...better than what I
posted above).

merlin

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Sam Mason (#5)
Re: array_reverse()

Sam Mason <sam@samason.me.uk> writes:

On Mon, Nov 02, 2009 at 09:20:38AM -0500, Tom Lane wrote:

What would it mean for a multi-dimensional array?

Rotating the array by 180 degrees in every dimension would give the same
answer for 1-dimensional arrays and give sensible answers for higher
dimensional arrays.

The easy implementation at the C level would be to reverse the storage
order of the elements (and then do something-or-other with the dimension
info, in case the array isn't square). Your diagram suggests that this
might be the same thing as what you suggest, but I can't work it out for
lack of caffeine.

regards, tom lane

#8Sam Mason
sam@samason.me.uk
In reply to: Merlin Moncure (#6)
Re: array_reverse()

On Mon, Nov 02, 2009 at 09:55:20AM -0500, Merlin Moncure wrote:

On Mon, Nov 2, 2009 at 9:51 AM, Sam Mason <sam@samason.me.uk> wrote:

On Mon, Nov 02, 2009 at 09:20:38AM -0500, Tom Lane wrote:

Craig Ringer <craig@postnewspapers.com.au> writes:

Before I go ahead and try to write a decent quality version: is there
any chance an array_reverse() function (in C) would be accepted into Pg
mainline?

What would it mean for a multi-dimensional array?

Rotating the array by 180 degrees in every dimension would give the same
answer for 1-dimensional arrays and give sensible answers for higher
dimensional arrays.

do you think that's the typical case, or is it more common to want to
reverse a particular slice?

I hadn't thought about that; I'm normally more concerned about making
the general case (i.e. most complicated) behave sensibly, with the
common cases being optimizations.

The problem I was solving was making 1d arrays consistent with higher
dimensional ones. As far as I can tell, if the spec is just to rotate
by 180 degrees then the implementation is pretty easy; just run through
all the elements writing them out in reverse order. Sizes and number of
dimensions can be completely ignored.

--
Sam http://samason.me.uk/

#9Sam Mason
sam@samason.me.uk
In reply to: Tom Lane (#7)
Re: array_reverse()

On Mon, Nov 02, 2009 at 10:03:49AM -0500, Tom Lane wrote:

Sam Mason <sam@samason.me.uk> writes:

Rotating the array by 180 degrees in every dimension would give the same
answer for 1-dimensional arrays and give sensible answers for higher
dimensional arrays.

The easy implementation at the C level would be to reverse the storage
order of the elements (and then do something-or-other with the dimension
info, in case the array isn't square). Your diagram suggests that this
might be the same thing as what you suggest, but I can't work it out for
lack of caffeine.

Yes, it is. I hadn't worked out the code before. Implementation should
be very easy at C level. Not sure how NULLs are implemented in arrays,
they may require a bit more care.

--
Sam http://samason.me.uk/