pg.ddx.io pgsql-hackers@postgresql.org mailing list archive
help / color / mirror / Atom feed From: Tom Lane <tgl@sss.pgh.pa.us>
To: jesper.pedersen@redhat.com
Cc: David Rowley <david.rowley@2ndquadrant.com>
Cc: Andres Freund <andres@anarazel.de>
Cc: Robert Haas <robertmhaas@gmail.com>
Cc: PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Subject: Re: POC: converting Lists into arrays
Date: Mon, 01 Jul 2019 19:27:21 -0400
Message-ID: <25258.1562023641@sss.pgh.pa.us> (raw )
In-Reply-To: <25178.1562006685@sss.pgh.pa.us >
References: <481.1551390571@sss.pgh.pa.us >
<24783.1551568303@sss.pgh.pa.us >
<20190303043424.itzy3ge52xrkpmpr@alap3.anarazel.de >
<437.1551637744@sss.pgh.pa.us >
<CA+TgmoZM4c=v0ifR++i09JFtNtnqTq_HkFmbFjwWqbUJffOLmA@mail.gmail.com >
<12684.1551723095@sss.pgh.pa.us >
<20190304190612.vgqqsowzkrh22623@alap3.anarazel.de >
<26464.1551734920@sss.pgh.pa.us >
<20190304221101.hdg4vj5fo4eewh3b@alap3.anarazel.de >
<CAKJS1f-pNfoUJrmU8vgD1WrKLqs9WxOVLQ0RpSWu9h6W9RnypA@mail.gmail.com >
<20190304235402.nod3gbotk2qtd4nh@alap3.anarazel.de >
<CAKJS1f-yS201hAAmnxcLb2aeTYNZ_A9R1JNXF6hTVXjhHYN7rQ@mail.gmail.com >
<1131.1551746172@sss.pgh.pa.us >
<14626.1558745627@sss.pgh.pa.us >
<29297.1558799327@sss.pgh.pa.us >
<f078ce63-9e04-0f3e-d200-d7ee66279abe@redhat.com >
<25178.1562006685@sss.pgh.pa.us >
I spent some time experimenting with the idea mentioned upthread of
adding a macro to support deletion of a foreach loop's current element
(adjusting the loop's state behind the scenes). This turns out to work
really well: it reduces the complexity of fixing existing loops around
element deletions quite a bit. Whereas in existing code you have to not
use foreach() at all, and you have to track both the next list element and
the previous undeleted element, now you can use foreach() and you don't
have to mess with extra variables at all.
A good example appears in the trgm_regexp.c changes below. Typically
we've coded such loops with a handmade expansion of foreach, like
prev = NULL;
cell = list_head(state->enterKeys);
while (cell)
{
TrgmStateKey *existingKey = (TrgmStateKey *) lfirst(cell);
next = lnext(cell);
if (need to delete)
state->enterKeys = list_delete_cell(state->enterKeys,
cell, prev);
else
prev = cell;
cell = next;
}
My previous patch would have had you replace this with a loop using
an integer list-position index. You can still do that if you like,
but it's less change to convert the loop to a foreach(), drop the
prev/next variables, and replace the list_delete_cell call with
foreach_delete_current:
foreach(cell, state->enterKeys)
{
TrgmStateKey *existingKey = (TrgmStateKey *) lfirst(cell);
if (need to delete)
state->enterKeys = foreach_delete_current(state->enterKeys,
cell);
}
So I think this is a win, and attached is v7.
regards, tom lane
Attachments:
[application/x-gzip] reimplement-List-as-array-7.patch.gz (44.8K, ../25258.1562023641@sss.pgh.pa.us/2-reimplement-List-as-array-7.patch.gz)
download
view thread (130+ messages) latest in thread
Message-ID: <25258.1562023641@sss.pgh.pa.us>
Permalink: ../25258.1562023641@sss.pgh.pa.us/
Also on: postgresql.org/message-id/25258.1562023641@sss.pgh.pa.us
copy link · copy postgr.es
reply Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-hackers@postgresql.org
Cc: tgl@sss.pgh.pa.us, jesper.pedersen@redhat.com, david.rowley@2ndquadrant.com, andres@anarazel.de, robertmhaas@gmail.com, pgsql-hackers@lists.postgresql.org
Subject: Re: POC: converting Lists into arrays
In-Reply-To: <25258.1562023641@sss.pgh.pa.us>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox