pgsql: Add for_each_from, to simplify loops starting from non-first lis

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Add for_each_from, to simplify loops starting from non-first lis
Date: 2020-09-29 00:33:40
Message-ID: E1kN3aO-00077c-1j@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

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

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/56fe008996bc1a547ce60c8dddd2ca821cac163e

Modified Files
--------------
src/backend/commands/tablecmds.c | 2 +-
src/backend/nodes/nodeFuncs.c | 4 +--
src/backend/optimizer/plan/createplan.c | 2 +-
src/backend/optimizer/plan/planner.c | 4 +--
src/backend/parser/parse_agg.c | 4 +--
src/backend/utils/adt/jsonpath_gram.y | 2 +-
src/backend/utils/adt/ruleutils.c | 8 ++---
src/backend/utils/adt/selfuncs.c | 2 +-
src/include/nodes/pg_list.h | 52 ++++++++++++++++++---------------
9 files changed, 42 insertions(+), 38 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Michael Paquier 2020-09-29 02:03:12 Re: __pg_log_level in anonynous enum should be initialized? (Was: pgsql: Change SHA2 implementation based on OpenSSL to use EVP digest ro)
Previous Message Michael Paquier 2020-09-29 00:26:23 pgsql: Revert "Change SHA2 implementation based on OpenSSL to use EVP d