From e6e38cb16c793efdb17f36078a7ff9fe83610953 Mon Sep 17 00:00:00 2001 From: Yuya Watari Date: Mon, 11 Dec 2023 12:20:20 +0900 Subject: [PATCH v22 4/4] Fix a bug related to atomic function Author: Alena Rybakina https://www.postgresql.org/message-id/72d292a1-06ff-432a-a803-af5053786444%40yandex.ru --- src/backend/nodes/read.c | 20 ++++++++++++++++++++ src/backend/nodes/readfuncs.c | 24 ++++++++++++++++++++++-- src/include/nodes/readfuncs.h | 2 ++ 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/backend/nodes/read.c b/src/backend/nodes/read.c index 813eda3e73..314736d989 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 7610447ad3..0915c0e661 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,8 +594,8 @@ _readRangeTblEntry(void) READ_BOOL_FIELD(inh); READ_BOOL_FIELD(inFromCl); READ_NODE_FIELD(securityQuals); - READ_BITMAPSET_FIELD(eclass_source_indexes); - READ_BITMAPSET_FIELD(eclass_derive_indexes); + 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 cba6f0be75..2fa68e59cd 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 -- 2.42.0.windows.2