Re: proposal: FOREACH-IN-ARRAY (probably for 9.2?) - Mailing list pgsql-hackers

From Tom Lane
Subject Re: proposal: FOREACH-IN-ARRAY (probably for 9.2?)
Date
Msg-id 1110.1292603902@sss.pgh.pa.us
Whole thread Raw
In response to Re: proposal: FOREACH-IN-ARRAY (probably for 9.2?)  (Pavel Stehule <pavel.stehule@gmail.com>)
Responses Re: proposal: FOREACH-IN-ARRAY (probably for 9.2?)  (Merlin Moncure <mmoncure@gmail.com>)
Re: proposal: FOREACH-IN-ARRAY (probably for 9.2?)  (Pavel Stehule <pavel.stehule@gmail.com>)
List pgsql-hackers
Pavel Stehule <pavel.stehule@gmail.com> writes:
> 2010/12/17 Tom Lane <tgl@sss.pgh.pa.us>:
>> Furthermore, it's underspecified: who's to say how many dimensions of
>> the array are supposed to get sliced off?  There's no reasonable place
>> to extend this syntax to specify that.  It will also be inconsistent
>> for "foreach scalar in array" to iterate element-by-element no matter
>> how many dimensions array has, while "foreach array in array" does
>> something different from that.

> it reduce just one dimension. Now I expect, and I think so it is
> correct, so user knows a used dimension. Just doesn't know a data. So
> user can to decide and fill correct type. The design strictly remove
> any U.I. from design. So using a incorect type is bug.

In other words, your proposal is error-prone to use, restricted in what
it can do, and incapable of being extended later without breaking
things.  If there is some redeeming social value to set against those
problems, I'm not seeing it.

What I think we should have is
FOREACH scalar-variable IN ARRAY array-expression

which iterates element by element regardless of how many dimensions the
array has.  Then there should be some other syntax for iterating over
slices, and we should give some thought to being able to specify how
"deep" the slice is.  I can definitely think of use cases for pulling
off either 1 dimension at a time (so you get vectors) or N-1 dimensions
at a time, and it's not out of the realm of reason to want intermediate
cases.

Maybe
FOR_EACH scalar-variable IN ARRAY array-expression
FOR_SLICE array-variable [DEPTH n] IN ARRAY array-expression

Or I guess you could use the same leading keyword if you make the depth
specification mandatory for the slice case:
FOREACH scalar-variable IN ARRAY array-expression
FOREACH array-variable SLICE n IN ARRAY array-expression

That might be a better idea since it avoids the inevitable argument over
whether the default slice depth should be 1 dimension or N-1 dimensions.
        regards, tom lane


pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: [COMMITTERS] pgsql: Reset 'ps' display just once when resolving VXID conflicts.
Next
From: Tom Lane
Date:
Subject: Re: bug in SignalSomeChildren