From 488859351c27a57e749b1cd67dd2d28b174644e7 Mon Sep 17 00:00:00 2001 From: amitlan Date: Thu, 6 Oct 2022 17:31:37 +0900 Subject: [PATCH v22 3/4] 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 b91e235423..d3beb907ea 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 75bf11c741..e5c993c90d 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