1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-07 00:36:50 +03:00

Add for_each_from, to simplify loops starting from non-first list cells.

We have a dozen or so places that need to iterate over all but the
first cell of a List.  Prior to v13 this was typically written as
	for_each_cell(lc, lnext(list_head(list)))
Commit 1cff1b95a changed these to
	for_each_cell(lc, list, list_second_cell(list))
This patch introduces a new macro for_each_from() which expresses
the start point as a list index, allowing these to be written as
	for_each_from(lc, list, 1)
This is marginally more efficient, since ForEachState.i can be
initialized directly instead of backing into it from a ListCell
address.  It also seems clearer and less typo-prone.

Some of the remaining uses of for_each_cell() look like they could
profitably be changed to for_each_from(), but here I confined myself
to changing uses of list_second_cell().

Also, fix for_each_cell_setup() and for_both_cell_setup() to
const-ify their arguments; that's a simple oversight in 1cff1b95a.

Back-patch into v13, on the grounds that (1) the const-ification
is a minor bug fix, and (2) it's better for back-patching purposes
if we only have two ways to write these loops rather than three.

In HEAD, also remove list_third_cell() and list_fourth_cell(),
which were also introduced in 1cff1b95a, and are unused as of
cc99baa43.  It seems unlikely that any third-party code would
have started to use them already; anyone who has can be directed
to list_nth_cell instead.

Discussion: https://postgr.es/m/CAApHDvpo1zj9KhEpU2cCRZfSM3Q6XGdhzuAS2v79PH7WJBkYVA@mail.gmail.com
This commit is contained in:
Tom Lane
2020-09-28 20:32:53 -04:00
parent fe0a1dc52c
commit 56fe008996
9 changed files with 42 additions and 38 deletions

View File

@ -2261,7 +2261,7 @@ create_groupingsets_plan(PlannerInfo *root, GroupingSetsPath *best_path)
{
bool is_first_sort = ((RollupData *) linitial(rollups))->is_hashed;
for_each_cell(lc, rollups, list_second_cell(rollups))
for_each_from(lc, rollups, 1)
{
RollupData *rollup = lfirst(lc);
AttrNumber *new_grpColIdx;

View File

@ -4430,7 +4430,7 @@ consider_groupingsets_paths(PlannerInfo *root,
* below, must use the same condition.
*/
i = 0;
for_each_cell(lc, gd->rollups, list_second_cell(gd->rollups))
for_each_from(lc, gd->rollups, 1)
{
RollupData *rollup = lfirst_node(RollupData, lc);
@ -4464,7 +4464,7 @@ consider_groupingsets_paths(PlannerInfo *root,
rollups = list_make1(linitial(gd->rollups));
i = 0;
for_each_cell(lc, gd->rollups, list_second_cell(gd->rollups))
for_each_from(lc, gd->rollups, 1)
{
RollupData *rollup = lfirst_node(RollupData, lc);