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