From 41465f94e426a0b22b070ab8034de19cfdb6daa4 Mon Sep 17 00:00:00 2001 From: amitlan Date: Thu, 6 Oct 2022 17:31:37 +0900 Subject: [PATCH v21 2/3] Allow adding Bitmapsets as Nodes into plan trees Note that this only adds some infrastructure bits and none of the existing bitmapsets that are added to plan trees have been changed to instead add the Node version. So, the plan trees, or really the bitmapsets contained in them, look the same as before as far as Node write/read functionality is concerned. This is needed, because it is not currently possible to write and then read back Bitmapsets that are not direct members of write/read capable Nodes; for example, if one needs to add a List of Bitmapsets to a plan tree. The most straightforward way to do that is to make Bitmapsets be written with outNode() and read with nodeRead(). --- src/backend/nodes/Makefile | 3 ++- src/backend/nodes/copyfuncs.c | 11 +++++++++++ src/backend/nodes/equalfuncs.c | 6 ++++++ src/backend/nodes/gen_node_support.pl | 1 + src/backend/nodes/outfuncs.c | 11 +++++++++++ src/backend/nodes/readfuncs.c | 4 ++++ src/backend/optimizer/prep/preptlist.c | 1 - src/include/nodes/bitmapset.h | 5 +++++ src/include/nodes/meson.build | 1 + 9 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/backend/nodes/Makefile b/src/backend/nodes/Makefile index 7450e191ee..da5307771b 100644 --- a/src/backend/nodes/Makefile +++ b/src/backend/nodes/Makefile @@ -57,7 +57,8 @@ node_headers = \ nodes/replnodes.h \ nodes/supportnodes.h \ nodes/value.h \ - utils/rel.h + utils/rel.h \ + nodes/bitmapset.h # see also catalog/Makefile for an explanation of these make rules diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c index e76fda8eba..1482019327 100644 --- a/src/backend/nodes/copyfuncs.c +++ b/src/backend/nodes/copyfuncs.c @@ -160,6 +160,17 @@ _copyExtensibleNode(const ExtensibleNode *from) return newnode; } +/* Custom copy routine for Node bitmapsets */ +static Bitmapset * +_copyBitmapset(const Bitmapset *from) +{ + Bitmapset *newnode = bms_copy(from); + + newnode->type = T_Bitmapset; + + return newnode; +} + /* * copyObjectImpl -- implementation of copyObject(); see nodes/nodes.h diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c index 0373aa30fe..e8706c461a 100644 --- a/src/backend/nodes/equalfuncs.c +++ b/src/backend/nodes/equalfuncs.c @@ -210,6 +210,12 @@ _equalList(const List *a, const List *b) return true; } +/* Custom equal routine for Node bitmapsets */ +static bool +_equalBitmapset(const Bitmapset *a, const Bitmapset *b) +{ + return bms_equal(a, b); +} /* * equal diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl index 81b8c184a9..ccb5aff874 100644 --- a/src/backend/nodes/gen_node_support.pl +++ b/src/backend/nodes/gen_node_support.pl @@ -71,6 +71,7 @@ my @all_input_files = qw( nodes/supportnodes.h nodes/value.h utils/rel.h + nodes/bitmapset.h ); # Nodes from these input files are automatically treated as nodetag_only. diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c index 64c65f060b..b3ffd8cec2 100644 --- a/src/backend/nodes/outfuncs.c +++ b/src/backend/nodes/outfuncs.c @@ -328,6 +328,17 @@ outBitmapset(StringInfo str, const Bitmapset *bms) appendStringInfoChar(str, ')'); } +/* Custom write routine for Node bitmapsets */ +static void +_outBitmapset(StringInfo str, const Bitmapset *bms) +{ + Assert(IsA(bms, Bitmapset)); + WRITE_NODE_TYPE("BITMAPSET"); + + outBitmapset(str, bms); +} + + /* * Print the value of a Datum given its type. */ diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c index b4ff855f7c..4d6902d3ac 100644 --- a/src/backend/nodes/readfuncs.c +++ b/src/backend/nodes/readfuncs.c @@ -230,6 +230,10 @@ _readBitmapset(void) result = bms_add_member(result, val); } + /* XXX maybe do `result = makeNode(Bitmapset);` at the top? */ + if (result) + result->type = T_Bitmapset; + return result; } diff --git a/src/backend/optimizer/prep/preptlist.c b/src/backend/optimizer/prep/preptlist.c index 137b28323d..e5c1103316 100644 --- a/src/backend/optimizer/prep/preptlist.c +++ b/src/backend/optimizer/prep/preptlist.c @@ -337,7 +337,6 @@ extract_update_targetlist_colnos(List *tlist) return update_colnos; } - /***************************************************************************** * * TARGETLIST EXPANSION diff --git a/src/include/nodes/bitmapset.h b/src/include/nodes/bitmapset.h index 75b5ce1a8e..9046ca177f 100644 --- a/src/include/nodes/bitmapset.h +++ b/src/include/nodes/bitmapset.h @@ -20,6 +20,8 @@ #ifndef BITMAPSET_H #define BITMAPSET_H +#include "nodes/nodes.h" + /* * Forward decl to save including pg_list.h */ @@ -48,6 +50,9 @@ typedef int32 signedbitmapword; /* must be the matching signed type */ typedef struct Bitmapset { + pg_node_attr(custom_copy_equal, custom_read_write) + + NodeTag type; int nwords; /* number of words in array */ bitmapword words[FLEXIBLE_ARRAY_MEMBER]; /* really [nwords] */ } Bitmapset; diff --git a/src/include/nodes/meson.build b/src/include/nodes/meson.build index b7df232081..94701af8e1 100644 --- a/src/include/nodes/meson.build +++ b/src/include/nodes/meson.build @@ -19,6 +19,7 @@ node_support_input_i = [ 'nodes/supportnodes.h', 'nodes/value.h', 'utils/rel.h', + 'nodes/bitmapset.h', ] node_support_input = [] -- 2.35.3