summaryrefslogtreecommitdiff
path: root/src/backend/nodes/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/nodes/read.c')
-rw-r--r--src/backend/nodes/read.c30
1 files changed, 29 insertions, 1 deletions
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: