Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit00029de

Browse files
committed
Improve parsing of options of CREATE/ALTER SUBSCRIPTION
This simplifies the code so as it is not necessary anymore for thecaller of parse_subscription_options() to zero SubOpts, holding abitmaps of the provided options as well as the default/parsed optionvalues. This also simplifies some checks related to the optionssupported by a command when checking for incompatibilities.While on it, the errors generated for unsupported combinations with"slot_name = NONE" are reordered. This may generate a different errorscompared to the previous major versions, but users have to go throughall those errors to get a correct command in this case when usingincorrect values for options "enabled" and "create\slot", so at the endthe resulting command would remain the same.Author: Peter SmithReviewed-by: Nathan BossartDiscussion:https://postgr.es/m/CAHut+PtXHfLgLHDDJ8ZN5f5Be_37mJoxpEsRg8LNmm4XCr06Rw@mail.gmail.com
1 parentf99870d commit00029de

File tree

3 files changed

+35
-42
lines changed

3 files changed

+35
-42
lines changed

‎src/backend/commands/subscriptioncmds.c

Lines changed: 33 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,16 @@ static void ReportSlotConnectionError(List *rstates, Oid subid, char *slotname,
9595
*
9696
* Since not all options can be specified in both commands, this function
9797
* will report an error if mutually exclusive options are specified.
98-
*
99-
* Caller is expected to have cleared 'opts'.
10098
*/
10199
staticvoid
102100
parse_subscription_options(ParseState*pstate,List*stmt_options,
103101
bits32supported_opts,SubOpts*opts)
104102
{
105103
ListCell*lc;
106104

105+
/* Start out with cleared opts. */
106+
memset(opts,0,sizeof(SubOpts));
107+
107108
/* caller must expect some option */
108109
Assert(supported_opts!=0);
109110

@@ -262,7 +263,6 @@ parse_subscription_options(ParseState *pstate, List *stmt_options,
262263
{
263264
/* Check for incompatible options from the user. */
264265
if (opts->enabled&&
265-
IsSet(supported_opts,SUBOPT_ENABLED)&&
266266
IsSet(opts->specified_opts,SUBOPT_ENABLED))
267267
ereport(ERROR,
268268
(errcode(ERRCODE_SYNTAX_ERROR),
@@ -271,15 +271,13 @@ parse_subscription_options(ParseState *pstate, List *stmt_options,
271271
"connect = false","enabled = true")));
272272

273273
if (opts->create_slot&&
274-
IsSet(supported_opts,SUBOPT_CREATE_SLOT)&&
275274
IsSet(opts->specified_opts,SUBOPT_CREATE_SLOT))
276275
ereport(ERROR,
277276
(errcode(ERRCODE_SYNTAX_ERROR),
278277
errmsg("%s and %s are mutually exclusive options",
279278
"connect = false","create_slot = true")));
280279

281280
if (opts->copy_data&&
282-
IsSet(supported_opts,SUBOPT_COPY_DATA)&&
283281
IsSet(opts->specified_opts,SUBOPT_COPY_DATA))
284282
ereport(ERROR,
285283
(errcode(ERRCODE_SYNTAX_ERROR),
@@ -297,44 +295,39 @@ parse_subscription_options(ParseState *pstate, List *stmt_options,
297295
* was used.
298296
*/
299297
if (!opts->slot_name&&
300-
IsSet(supported_opts,SUBOPT_SLOT_NAME)&&
301298
IsSet(opts->specified_opts,SUBOPT_SLOT_NAME))
302299
{
303-
if (opts->enabled&&
304-
IsSet(supported_opts,SUBOPT_ENABLED)&&
305-
IsSet(opts->specified_opts,SUBOPT_ENABLED))
306-
ereport(ERROR,
307-
(errcode(ERRCODE_SYNTAX_ERROR),
308-
/*- translator: both %s are strings of the form "option = value" */
309-
errmsg("%s and %s are mutually exclusive options",
310-
"slot_name = NONE","enabled = true")));
311-
312-
if (opts->create_slot&&
313-
IsSet(supported_opts,SUBOPT_CREATE_SLOT)&&
314-
IsSet(opts->specified_opts,SUBOPT_CREATE_SLOT))
315-
ereport(ERROR,
316-
(errcode(ERRCODE_SYNTAX_ERROR),
317-
/*- translator: both %s are strings of the form "option = value" */
318-
errmsg("%s and %s are mutually exclusive options",
319-
"slot_name = NONE","create_slot = true")));
320-
321-
if (opts->enabled&&
322-
IsSet(supported_opts,SUBOPT_ENABLED)&&
323-
!IsSet(opts->specified_opts,SUBOPT_ENABLED))
324-
ereport(ERROR,
325-
(errcode(ERRCODE_SYNTAX_ERROR),
326-
/*- translator: both %s are strings of the form "option = value" */
327-
errmsg("subscription with %s must also set %s",
328-
"slot_name = NONE","enabled = false")));
300+
if (opts->enabled)
301+
{
302+
if (IsSet(opts->specified_opts,SUBOPT_ENABLED))
303+
ereport(ERROR,
304+
(errcode(ERRCODE_SYNTAX_ERROR),
305+
/*- translator: both %s are strings of the form "option = value" */
306+
errmsg("%s and %s are mutually exclusive options",
307+
"slot_name = NONE","enabled = true")));
308+
else
309+
ereport(ERROR,
310+
(errcode(ERRCODE_SYNTAX_ERROR),
311+
/*- translator: both %s are strings of the form "option = value" */
312+
errmsg("subscription with %s must also set %s",
313+
"slot_name = NONE","enabled = false")));
314+
}
329315

330-
if (opts->create_slot&&
331-
IsSet(supported_opts,SUBOPT_CREATE_SLOT)&&
332-
!IsSet(opts->specified_opts,SUBOPT_CREATE_SLOT))
333-
ereport(ERROR,
334-
(errcode(ERRCODE_SYNTAX_ERROR),
335-
/*- translator: both %s are strings of the form "option = value" */
336-
errmsg("subscription with %s must also set %s",
337-
"slot_name = NONE","create_slot = false")));
316+
if (opts->create_slot)
317+
{
318+
if (IsSet(opts->specified_opts,SUBOPT_CREATE_SLOT))
319+
ereport(ERROR,
320+
(errcode(ERRCODE_SYNTAX_ERROR),
321+
/*- translator: both %s are strings of the form "option = value" */
322+
errmsg("%s and %s are mutually exclusive options",
323+
"slot_name = NONE","create_slot = true")));
324+
else
325+
ereport(ERROR,
326+
(errcode(ERRCODE_SYNTAX_ERROR),
327+
/*- translator: both %s are strings of the form "option = value" */
328+
errmsg("subscription with %s must also set %s",
329+
"slot_name = NONE","create_slot = false")));
330+
}
338331
}
339332
}
340333

‎src/test/regress/expected/subscription.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PU
5454
ERROR: connect = false and create_slot = true are mutually exclusive options
5555
CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, enabled = true);
5656
ERROR: slot_name = NONE and enabled = true are mutually exclusive options
57-
CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE, create_slot = true);
57+
CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE,enabled = false,create_slot = true);
5858
ERROR: slot_name = NONE and create_slot = true are mutually exclusive options
5959
CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name = NONE);
6060
ERROR: subscription with slot_name = NONE must also set enabled = false

‎src/test/regress/sql/subscription.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ CREATE SUBSCRIPTION regress_testsub2 CONNECTION 'dbname=regress_doesnotexist' PU
4343
CREATE SUBSCRIPTION regress_testsub2 CONNECTION'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect= false, enabled= true);
4444
CREATE SUBSCRIPTION regress_testsub2 CONNECTION'dbname=regress_doesnotexist' PUBLICATION testpub WITH (connect= false, create_slot= true);
4545
CREATE SUBSCRIPTION regress_testsub2 CONNECTION'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name= NONE, enabled= true);
46-
CREATE SUBSCRIPTION regress_testsub2 CONNECTION'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name= NONE, create_slot= true);
46+
CREATE SUBSCRIPTION regress_testsub2 CONNECTION'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name= NONE,enabled= false,create_slot= true);
4747
CREATE SUBSCRIPTION regress_testsub2 CONNECTION'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name= NONE);
4848
CREATE SUBSCRIPTION regress_testsub2 CONNECTION'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name= NONE, enabled= false);
4949
CREATE SUBSCRIPTION regress_testsub2 CONNECTION'dbname=regress_doesnotexist' PUBLICATION testpub WITH (slot_name= NONE, create_slot= false);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp