diff options
Diffstat (limited to 'src/backend/commands/subscriptioncmds.c')
-rw-r--r-- | src/backend/commands/subscriptioncmds.c | 73 |
1 files changed, 33 insertions, 40 deletions
diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 9427e86fee1..2b658080fee 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -95,8 +95,6 @@ static void ReportSlotConnectionError(List *rstates, Oid subid, char *slotname, * * Since not all options can be specified in both commands, this function * will report an error if mutually exclusive options are specified. - * - * Caller is expected to have cleared 'opts'. */ static void parse_subscription_options(ParseState *pstate, List *stmt_options, @@ -104,6 +102,9 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, { ListCell *lc; + /* Start out with cleared opts. */ + memset(opts, 0, sizeof(SubOpts)); + /* caller must expect some option */ Assert(supported_opts != 0); @@ -262,7 +263,6 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, { /* Check for incompatible options from the user. */ if (opts->enabled && - IsSet(supported_opts, SUBOPT_ENABLED) && IsSet(opts->specified_opts, SUBOPT_ENABLED)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -271,7 +271,6 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, "connect = false", "enabled = true"))); if (opts->create_slot && - IsSet(supported_opts, SUBOPT_CREATE_SLOT) && IsSet(opts->specified_opts, SUBOPT_CREATE_SLOT)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -279,7 +278,6 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, "connect = false", "create_slot = true"))); if (opts->copy_data && - IsSet(supported_opts, SUBOPT_COPY_DATA) && IsSet(opts->specified_opts, SUBOPT_COPY_DATA)) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), @@ -297,44 +295,39 @@ parse_subscription_options(ParseState *pstate, List *stmt_options, * was used. */ if (!opts->slot_name && - IsSet(supported_opts, SUBOPT_SLOT_NAME) && IsSet(opts->specified_opts, SUBOPT_SLOT_NAME)) { - if (opts->enabled && - IsSet(supported_opts, SUBOPT_ENABLED) && - IsSet(opts->specified_opts, SUBOPT_ENABLED)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - /*- translator: both %s are strings of the form "option = value" */ - errmsg("%s and %s are mutually exclusive options", - "slot_name = NONE", "enabled = true"))); - - if (opts->create_slot && - IsSet(supported_opts, SUBOPT_CREATE_SLOT) && - IsSet(opts->specified_opts, SUBOPT_CREATE_SLOT)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - /*- translator: both %s are strings of the form "option = value" */ - errmsg("%s and %s are mutually exclusive options", - "slot_name = NONE", "create_slot = true"))); - - if (opts->enabled && - IsSet(supported_opts, SUBOPT_ENABLED) && - !IsSet(opts->specified_opts, SUBOPT_ENABLED)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - /*- translator: both %s are strings of the form "option = value" */ - errmsg("subscription with %s must also set %s", - "slot_name = NONE", "enabled = false"))); + if (opts->enabled) + { + if (IsSet(opts->specified_opts, SUBOPT_ENABLED)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: both %s are strings of the form "option = value" */ + errmsg("%s and %s are mutually exclusive options", + "slot_name = NONE", "enabled = true"))); + else + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: both %s are strings of the form "option = value" */ + errmsg("subscription with %s must also set %s", + "slot_name = NONE", "enabled = false"))); + } - if (opts->create_slot && - IsSet(supported_opts, SUBOPT_CREATE_SLOT) && - !IsSet(opts->specified_opts, SUBOPT_CREATE_SLOT)) - ereport(ERROR, - (errcode(ERRCODE_SYNTAX_ERROR), - /*- translator: both %s are strings of the form "option = value" */ - errmsg("subscription with %s must also set %s", - "slot_name = NONE", "create_slot = false"))); + if (opts->create_slot) + { + if (IsSet(opts->specified_opts, SUBOPT_CREATE_SLOT)) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: both %s are strings of the form "option = value" */ + errmsg("%s and %s are mutually exclusive options", + "slot_name = NONE", "create_slot = true"))); + else + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + /*- translator: both %s are strings of the form "option = value" */ + errmsg("subscription with %s must also set %s", + "slot_name = NONE", "create_slot = false"))); + } } } |