Re: Thread-safe stringToNode() / pg_strtok()

From: Michael Paquier <michael(at)paquier(dot)xyz>
To: Matthias van de Meent <boekewurm+postgres(at)gmail(dot)com>
Cc: Peter Eisentraut <peter(at)eisentraut(dot)org>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, Heikki Linnakangas <hlinnaka(at)iki(dot)fi>, 邱宇航 <iamqyh(at)gmail(dot)com>
Subject: Re: Thread-safe stringToNode() / pg_strtok()
Date: 2026-08-21 23:47:30
Message-ID: aojjkj79x5lmcm_Q@paquier.xyz
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Fri, Aug 21, 2026 at 05:36:23PM +0200, Matthias van de Meent wrote:
> On Fri, 21 Aug 2026 at 06:41, Michael Paquier <michael(at)paquier(dot)xyz> wrote:
>> Hmm. There is something that smells structurally wrong to me here.
>> Historically, readBitmapset() exists for out-of-core code, but I think
>> that based on what we are dealing with we should remove it and
>> encourage the use of readNode() instead.
>
> I'm ambivalent about that. A direct call into the Bitmapset
> (de)serializer avoids the overhead for dispatching to _readBitmapset()
> in readNode().
>
> Of all nodes, Bitmapset is the only special_read_write node type that
> an ExtensibleNode implementation could reasonably want to serialize.
> The other special_read_write node types (String, Integer, Float,
> Boolean, Bitstring) are all parse node types, which I think are more
> properly replaced with either an A_Const or the parsed primitive
> values in custom planner/executor nodes.

Are you aware of code that relies on these specific calls? I have
poked as well at github, but could not find even one hit that refers
to non-forked code. I have seen traces of copies of this code, for
backward-compatibility purposes only (citus is one, due to its
branching model).

>> My point is to get rid of the forward declaration of
>> ReadNodeContext in nodes.h, and do that as a preliminary patch.
>
> ReadNodeContext is invented in this patchset with just a single patch.
> What preliminary patch could be added that gets rid of something
> introduced in later patches?

I just mean to create a first patch to not publish anymore the
readBitmapset() & friends set of functions, make them static inside
readfuncs.c. This results in a simplification of your patch by not
requiring the knowledge of ReadNodeContext anymore in nodes.h and this
forward declaration. Sounds like a win to me based on my arguments of
the first paragraph, because it leads to a cleaner result.

> If you refer to the read*Cols functions and/or readDatum, then your
> conclusion is not accurate: The read*Cols functions don't operate on
> Nodes, but on dense arrays of their respective non-node types. They
> exist to help deserialize the various arrays or Datum values in a
> node's fields.
>
> A user could implement these functions by themselves, but exposing
> these procedures helps avoid developers having to re-invent the wheel.
> It's a simple wheel, sure, but a wheel it is regardless.

Argument that could also apply to a bunch of these. I am OK if
someone can point me out to some code out there where these are
relevants. In terms of in-core code and after searches in the open, I
just see no evidence that points to this direction..

> I'm happy to move the read*Cols, readBitmapset, and readDatum
> declarations to readfuncs.h instead, if that's OK with you? I'd like
> to keep them public for the reasons above - it's not like it costs us
> a lot to maintain these.

I'd still make the internals of node code leaner, I guess.. That
leads to a simpler result.
--
Michael

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Michael Paquier 2026-08-21 23:52:46 Re: [PATCH] Several refactorings for pg_dump
Previous Message David Rowley 2026-08-21 23:39:37 Re: Reduce memory overheads for storing a Memoize tuple