@ -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 , & copy_data , & synchronous_commit ) ;
& slotname , & copy_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 , & copy_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 , & copy_data ,
NULL ) ;
NULL , NULL ) ;
AlterSubscription_refresh ( sub , copy_data ) ;