aboutsummaryrefslogtreecommitdiff
path: root/src/backend/nodes
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/nodes')
-rw-r--r--src/backend/nodes/Makefile1
-rw-r--r--src/backend/nodes/bitmapset.c2
-rw-r--r--src/backend/nodes/copyfuncs.c6
-rw-r--r--src/backend/nodes/equalfuncs.c6
-rw-r--r--src/backend/nodes/gen_node_support.pl1
-rw-r--r--src/backend/nodes/outfuncs.c5
-rw-r--r--src/backend/nodes/read.c30
-rw-r--r--src/backend/nodes/readfuncs.c7
8 files changed, 56 insertions, 2 deletions
diff --git a/src/backend/nodes/Makefile b/src/backend/nodes/Makefile
index 7450e191ee2..d7b4261b474 100644
--- a/src/backend/nodes/Makefile
+++ b/src/backend/nodes/Makefile
@@ -52,6 +52,7 @@ node_headers = \
commands/trigger.h \
executor/tuptable.h \
foreign/fdwapi.h \
+ nodes/bitmapset.h \
nodes/extensible.h \
nodes/lockoptions.h \
nodes/replnodes.h \
diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c
index 0a6c30e4ebc..b7b274aeff3 100644
--- a/src/backend/nodes/bitmapset.c
+++ b/src/backend/nodes/bitmapset.c
@@ -194,6 +194,7 @@ bms_make_singleton(int x)
wordnum = WORDNUM(x);
bitnum = BITNUM(x);
result = (Bitmapset *) palloc0(BITMAPSET_SIZE(wordnum + 1));
+ result->type = T_Bitmapset;
result->nwords = wordnum + 1;
result->words[wordnum] = ((bitmapword) 1 << bitnum);
return result;
@@ -852,6 +853,7 @@ bms_add_range(Bitmapset *a, int lower, int upper)
if (a == NULL)
{
a = (Bitmapset *) palloc0(BITMAPSET_SIZE(uwordnum + 1));
+ a->type = T_Bitmapset;
a->nwords = uwordnum + 1;
}
else if (uwordnum >= a->nwords)
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index e76fda8eba3..84f5e2e6ad1 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -160,6 +160,12 @@ _copyExtensibleNode(const ExtensibleNode *from)
return newnode;
}
+static Bitmapset *
+_copyBitmapset(const Bitmapset *from)
+{
+ return bms_copy(from);
+}
+
/*
* copyObjectImpl -- implementation of copyObject(); see nodes/nodes.h
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 0373aa30fe9..b2f07da62e0 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -145,6 +145,12 @@ _equalA_Const(const A_Const *a, const A_Const *b)
return true;
}
+static bool
+_equalBitmapset(const Bitmapset *a, const Bitmapset *b)
+{
+ return bms_equal(a, b);
+}
+
/*
* Lists are handled specially
*/
diff --git a/src/backend/nodes/gen_node_support.pl b/src/backend/nodes/gen_node_support.pl
index 81b8c184a90..d3f25299ded 100644
--- a/src/backend/nodes/gen_node_support.pl
+++ b/src/backend/nodes/gen_node_support.pl
@@ -65,6 +65,7 @@ my @all_input_files = qw(
commands/trigger.h
executor/tuptable.h
foreign/fdwapi.h
+ nodes/bitmapset.h
nodes/extensible.h
nodes/lockoptions.h
nodes/replnodes.h
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index 64c65f060b4..f05e72f0dc3 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -314,6 +314,9 @@ _outList(StringInfo str, const List *node)
* converts a bitmap set of integers
*
* Note: the output format is "(b int int ...)", similar to an integer List.
+ *
+ * We export this function for use by extensions that define extensible nodes.
+ * That's somewhat historical, though, because calling outNode() will work.
*/
void
outBitmapset(StringInfo str, const Bitmapset *bms)
@@ -844,6 +847,8 @@ outNode(StringInfo str, const void *obj)
_outString(str, (String *) obj);
else if (IsA(obj, BitString))
_outBitString(str, (BitString *) obj);
+ else if (IsA(obj, Bitmapset))
+ outBitmapset(str, (Bitmapset *) obj);
else
{
appendStringInfoChar(str, '{');
diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c
index fe84f140eef..74d9d754d3e 100644
--- a/src/backend/nodes/read.c
+++ b/src/backend/nodes/read.c
@@ -22,6 +22,7 @@
#include <ctype.h>
#include "common/string.h"
+#include "nodes/bitmapset.h"
#include "nodes/pg_list.h"
#include "nodes/readfuncs.h"
#include "nodes/value.h"
@@ -347,6 +348,7 @@ nodeRead(const char *token, int tok_len)
* Could be an integer list: (i int int ...)
* or an OID list: (o int int ...)
* or an XID list: (x int int ...)
+ * or a bitmapset: (b int int ...)
* or a list of nodes/values: (node node ...)
*----------
*/
@@ -372,6 +374,7 @@ nodeRead(const char *token, int tok_len)
tok_len, token);
l = lappend_int(l, val);
}
+ result = (Node *) l;
}
else if (tok_len == 1 && token[0] == 'o')
{
@@ -392,6 +395,7 @@ nodeRead(const char *token, int tok_len)
tok_len, token);
l = lappend_oid(l, val);
}
+ result = (Node *) l;
}
else if (tok_len == 1 && token[0] == 'x')
{
@@ -412,6 +416,30 @@ nodeRead(const char *token, int tok_len)
tok_len, token);
l = lappend_xid(l, val);
}
+ result = (Node *) l;
+ }
+ else if (tok_len == 1 && token[0] == 'b')
+ {
+ /* Bitmapset -- see also _readBitmapset() */
+ Bitmapset *bms = NULL;
+
+ for (;;)
+ {
+ int val;
+ char *endptr;
+
+ token = pg_strtok(&tok_len);
+ if (token == NULL)
+ elog(ERROR, "unterminated Bitmapset structure");
+ if (tok_len == 1 && token[0] == ')')
+ break;
+ val = (int) strtol(token, &endptr, 10);
+ if (endptr != token + tok_len)
+ elog(ERROR, "unrecognized integer: \"%.*s\"",
+ tok_len, token);
+ bms = bms_add_member(bms, val);
+ }
+ result = (Node *) bms;
}
else
{
@@ -426,8 +454,8 @@ nodeRead(const char *token, int tok_len)
if (token == NULL)
elog(ERROR, "unterminated List structure");
}
+ result = (Node *) l;
}
- result = (Node *) l;
break;
}
case RIGHT_PAREN:
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index b4ff855f7c6..23776367c52 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -194,6 +194,10 @@ nullable_string(const char *token, int length)
/*
* _readBitmapset
+ *
+ * Note: this code is used in contexts where we know that a Bitmapset
+ * is expected. There is equivalent code in nodeRead() that can read a
+ * Bitmapset when we come across one in other contexts.
*/
static Bitmapset *
_readBitmapset(void)
@@ -234,7 +238,8 @@ _readBitmapset(void)
}
/*
- * for use by extensions which define extensible nodes
+ * We export this function for use by extensions that define extensible nodes.
+ * That's somewhat historical, though, because calling nodeRead() will work.
*/
Bitmapset *
readBitmapset(void)