bug_related_to_atomic_function.txt
text/plain
Filename: bug_related_to_atomic_function.txt
Type: text/plain
Part: 2
diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c
index 813eda3e739..314736d989b 100644
--- a/src/backend/nodes/read.c
+++ b/src/backend/nodes/read.c
@@ -514,3 +514,23 @@ nodeRead(const char *token, int tok_len)
return (void *) result;
}
+
+/*
+ * pg_strtok_save_context -
+ * Save context initialized by stringToNode.
+ */
+void
+pg_strtok_save_context(const char **pcontext)
+{
+ *pcontext = pg_strtok_ptr;
+}
+
+/*
+ * pg_strtok_restore_context -
+ * Resore saved context.
+ */
+void
+pg_strtok_restore_context(const char *context)
+{
+ pg_strtok_ptr = context;
+}
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index cc2021c1f7b..9a7b4e9be58 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -191,6 +191,26 @@ nullable_string(const char *token, int length)
return debackslash(token, length);
}
+/* Read an equivalence field (anything written as ":fldname %u") and check it */
+#define READ_EQ_BITMAPSET_FIELD_CHECK(fldname) \
+{ \
+ int save_length = length; \
+ const char *context; \
+ pg_strtok_save_context(&context); \
+ token = pg_strtok(&length); \
+ if (length > 0 && strncmp(token, ":"#fldname, strlen(":"#fldname))) \
+ { \
+ /* "fldname" field was not found - fill it and restore context. */ \
+ local_node->fldname = NULL; \
+ pg_strtok_restore_context(context); \
+ length = save_length; \
+ } \
+ else \
+ { \
+ local_node->fldname = _readBitmapset(); \
+ } \
+}
+
/*
* _readBitmapset
@@ -574,6 +594,9 @@ _readRangeTblEntry(void)
READ_BOOL_FIELD(inh);
READ_BOOL_FIELD(inFromCl);
READ_NODE_FIELD(securityQuals);
+ READ_EQ_BITMAPSET_FIELD_CHECK(eclass_source_indexes);
+ READ_EQ_BITMAPSET_FIELD_CHECK(eclass_derive_indexes);
READ_DONE();
}
diff --git a/src/include/nodes/readfuncs.h b/src/include/nodes/readfuncs.h
index cba6f0be75a..2fa68e59cdf 100644
--- a/src/include/nodes/readfuncs.h
+++ b/src/include/nodes/readfuncs.h
@@ -29,6 +29,8 @@ extern PGDLLIMPORT bool restore_location_fields;
extern const char *pg_strtok(int *length);
extern char *debackslash(const char *token, int length);
extern void *nodeRead(const char *token, int tok_len);
+extern void pg_strtok_save_context(const char **pcontext);
+extern void pg_strtok_restore_context(const char *context);
/*
* prototypes for functions in readfuncs.c