mirror of
https://github.com/postgres/postgres.git
synced 2025-09-06 13:46:51 +03:00
Fix ALTER SUBSCRIPTION grammar ambiguity
There was a grammar ambiguity between SET PUBLICATION name REFRESH and SET PUBLICATION SKIP REFRESH, because SKIP is not a reserved word. To resolve that, fold the refresh choice into the WITH options. Refreshing is the default now. Reported-by: tushar <tushar.ahuja@enterprisedb.com>
This commit is contained in:
@@ -64,12 +64,14 @@ static void
|
||||
parse_subscription_options(List *options, bool *connect, bool *enabled_given,
|
||||
bool *enabled, bool *create_slot,
|
||||
bool *slot_name_given, char **slot_name,
|
||||
bool *copy_data, char **synchronous_commit)
|
||||
bool *copy_data, char **synchronous_commit,
|
||||
bool *refresh)
|
||||
{
|
||||
ListCell *lc;
|
||||
bool connect_given = false;
|
||||
bool create_slot_given = false;
|
||||
bool copy_data_given = false;
|
||||
bool refresh_given = false;
|
||||
|
||||
/* If connect is specified, the others also need to be. */
|
||||
Assert(!connect || (enabled && create_slot && copy_data));
|
||||
@@ -92,6 +94,8 @@ parse_subscription_options(List *options, bool *connect, bool *enabled_given,
|
||||
*copy_data = true;
|
||||
if (synchronous_commit)
|
||||
*synchronous_commit = NULL;
|
||||
if (refresh)
|
||||
*refresh = true;
|
||||
|
||||
/* Parse options */
|
||||
foreach(lc, options)
|
||||
@@ -167,6 +171,16 @@ parse_subscription_options(List *options, bool *connect, bool *enabled_given,
|
||||
PGC_BACKEND, PGC_S_TEST, GUC_ACTION_SET,
|
||||
false, 0, false);
|
||||
}
|
||||
else if (strcmp(defel->defname, "refresh") == 0 && refresh)
|
||||
{
|
||||
if (refresh_given)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("conflicting or redundant options")));
|
||||
|
||||
refresh_given = true;
|
||||
*refresh = defGetBoolean(defel);
|
||||
}
|
||||
else
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
@@ -315,7 +329,8 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel)
|
||||
*/
|
||||
parse_subscription_options(stmt->options, &connect, &enabled_given,
|
||||
&enabled, &create_slot, &slotname_given,
|
||||
&slotname, ©_data, &synchronous_commit);
|
||||
&slotname, ©_data, &synchronous_commit,
|
||||
NULL);
|
||||
|
||||
/*
|
||||
* Since creating a replication slot is not transactional, rolling back
|
||||
@@ -645,7 +660,7 @@ AlterSubscription(AlterSubscriptionStmt *stmt)
|
||||
|
||||
parse_subscription_options(stmt->options, NULL, NULL, NULL,
|
||||
NULL, &slotname_given, &slotname,
|
||||
NULL, &synchronous_commit);
|
||||
NULL, &synchronous_commit, NULL);
|
||||
|
||||
if (slotname_given)
|
||||
{
|
||||
@@ -680,7 +695,7 @@ AlterSubscription(AlterSubscriptionStmt *stmt)
|
||||
|
||||
parse_subscription_options(stmt->options, NULL,
|
||||
&enabled_given, &enabled, NULL,
|
||||
NULL, NULL, NULL, NULL);
|
||||
NULL, NULL, NULL, NULL, NULL);
|
||||
Assert(enabled_given);
|
||||
|
||||
if (!sub->slotname && enabled)
|
||||
@@ -712,13 +727,13 @@ AlterSubscription(AlterSubscriptionStmt *stmt)
|
||||
break;
|
||||
|
||||
case ALTER_SUBSCRIPTION_PUBLICATION:
|
||||
case ALTER_SUBSCRIPTION_PUBLICATION_REFRESH:
|
||||
{
|
||||
bool copy_data;
|
||||
bool refresh;
|
||||
|
||||
parse_subscription_options(stmt->options, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, ©_data,
|
||||
NULL);
|
||||
NULL, &refresh);
|
||||
|
||||
values[Anum_pg_subscription_subpublications - 1] =
|
||||
publicationListToArray(stmt->publication);
|
||||
@@ -727,12 +742,13 @@ AlterSubscription(AlterSubscriptionStmt *stmt)
|
||||
update_tuple = true;
|
||||
|
||||
/* Refresh if user asked us to. */
|
||||
if (stmt->kind == ALTER_SUBSCRIPTION_PUBLICATION_REFRESH)
|
||||
if (refresh)
|
||||
{
|
||||
if (!sub->enabled)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_SYNTAX_ERROR),
|
||||
errmsg("ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions")));
|
||||
errmsg("ALTER SUBSCRIPTION with refresh is not allowed for disabled subscriptions"),
|
||||
errhint("Use ALTER SUBSCRIPTION ... SET PUBLICATION ... WITH (refresh = false).")));
|
||||
|
||||
/* Make sure refresh sees the new list of publications. */
|
||||
sub->publications = stmt->publication;
|
||||
@@ -754,7 +770,7 @@ AlterSubscription(AlterSubscriptionStmt *stmt)
|
||||
|
||||
parse_subscription_options(stmt->options, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, ©_data,
|
||||
NULL);
|
||||
NULL, NULL);
|
||||
|
||||
AlterSubscription_refresh(sub, copy_data);
|
||||
|
||||
|
Reference in New Issue
Block a user