From 0990f940533da31ce0267f9b78697cc2767ec80f Mon Sep 17 00:00:00 2001 From: Vignesh C Date: Tue, 3 Nov 2026 07:12:58 +0530 Subject: [PATCH v91 3/3] Add conflict log table information to describe subscription output Display the associated conflict log table as a footer in \dRs+ output when conflict logging to table/all is enabled for a subscription. Previously, subscriptions were displayed using a single tabular output format. Since the conflict log table information is specific to each subscription and is better suited as auxiliary information, change the output to display each subscription individually in a row-wise table format and show the conflict log table as a footer when applicable. This approach was chosen based on suggestions at: https://www.postgresql.org/message-id/CAA4eK1KdKqKkaTqcj3in6ehD_hg6oOaCF_-JsVfd8N6nS8oV9g%40mail.gmail.com --- src/bin/psql/command.c | 5 +- src/bin/psql/describe.c | 410 +++++++++++++++++---- src/bin/psql/describe.h | 5 +- src/test/regress/expected/subscription.out | 176 ++++----- 4 files changed, 429 insertions(+), 167 deletions(-) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index e0c4d7a3562..11290329b89 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -1219,7 +1219,10 @@ exec_command_d(PsqlScanState scan_state, bool active_branch, const char *cmd) success = listPublications(pattern); break; case 's': - success = describeSubscriptions(pattern, show_verbose); + if (show_verbose) + success = describeSubscriptions(pattern); + else + success = listSubscriptions(pattern); break; default: status = PSQL_CMD_UNKNOWN; diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index e4a4ba47280..489910d9d2a 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -23,6 +23,7 @@ #include "catalog/pg_collation_d.h" #include "catalog/pg_constraint_d.h" #include "catalog/pg_default_acl_d.h" +#include "catalog/pg_namespace_d.h" #include "catalog/pg_proc_d.h" #include "catalog/pg_publication_d.h" #include "catalog/pg_statistic_ext_d.h" @@ -6762,118 +6763,250 @@ error_return: /* * \dRs - * Describes subscriptions. + * Lists subscriptions. * * Takes an optional regexp to select particular subscriptions */ bool -describeSubscriptions(const char *pattern, bool verbose) +listSubscriptions(const char *pattern) { PQExpBufferData buf; PGresult *res; printQueryOpt myopt = pset.popt; - static const bool translate_columns[] = {false, false, false, false, - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false}; + static const bool translate_columns[] = {false, false, false, false}; initPQExpBuffer(&buf); addQueryComment(&buf, "Get matching subscriptions"); + + /* Only display subscriptions in current database. */ appendPQExpBuffer(&buf, "SELECT subname AS \"%s\"\n" ", pg_catalog.pg_get_userbyid(subowner) AS \"%s\"\n" ", subenabled AS \"%s\"\n" - ", subpublications AS \"%s\"\n", + ", subpublications AS \"%s\"\n" + "FROM pg_catalog.pg_subscription\n" + "WHERE subdbid = (SELECT oid\n" + " FROM pg_catalog.pg_database\n" + " WHERE datname = pg_catalog.current_database())", gettext_noop("Name"), gettext_noop("Owner"), gettext_noop("Enabled"), gettext_noop("Publication")); - if (verbose) + if (!validateSQLNamePattern(&buf, pattern, true, false, + NULL, "subname", NULL, + NULL, + NULL, 1)) { - /* Binary mode and streaming are only supported in v14 and higher */ - if (pset.sversion >= 140000) + termPQExpBuffer(&buf); + return false; + } + + appendPQExpBufferStr(&buf, "ORDER BY 1;"); + + res = PSQLexec(buf.data); + termPQExpBuffer(&buf); + if (!res) + return false; + + myopt.title = _("List of subscriptions"); + myopt.translate_header = true; + myopt.translate_columns = translate_columns; + myopt.n_translate_columns = lengthof(translate_columns); + + printQuery(res, &myopt, pset.queryFout, false, pset.logfile); + + PQclear(res); + + return true; +} + +/* + * Add footer to subscription description. + */ +static void +addFooterToSubscriptionDesc(char *logdest, char *conflict_schema, Oid subid, + printTableContent *const cont) +{ + if (pset.sversion >= 200000) + { + if (strcmp(logdest, "table") == 0 || strcmp(logdest, "all") == 0) { - appendPQExpBuffer(&buf, - ", subbinary AS \"%s\"\n", - gettext_noop("Binary")); + /* + * The size accounts for schema name (NAMEDATALEN), relation + * name (NAMEDATALEN), separator '.' and null terminator. + */ + char conflictlogtable[NAMEDATALEN + NAMEDATALEN + 2]; - if (pset.sversion >= 160000) - appendPQExpBuffer(&buf, - ", (CASE substream\n" - " WHEN " CppAsString2(LOGICALREP_STREAM_OFF) " THEN 'off'\n" - " WHEN " CppAsString2(LOGICALREP_STREAM_ON) " THEN 'on'\n" - " WHEN " CppAsString2(LOGICALREP_STREAM_PARALLEL) " THEN 'parallel'\n" - " END) AS \"%s\"\n", - gettext_noop("Streaming")); - else - appendPQExpBuffer(&buf, - ", substream AS \"%s\"\n", - gettext_noop("Streaming")); + snprintf(conflictlogtable, + sizeof(conflictlogtable), + "%s." CONFLICT_LOG_RELATION_NAME_FMT, + conflict_schema, subid); + + printTableAddFooter(cont, _("Conflict log table:")); + printTableAddFooter(cont, + psprintf(" \"%s\"", conflictlogtable)); } + } +} - /* Two_phase and disable_on_error are only supported in v15 and higher */ - if (pset.sversion >= 150000) - appendPQExpBuffer(&buf, - ", subtwophasestate AS \"%s\"\n" - ", subdisableonerr AS \"%s\"\n", - gettext_noop("Two-phase commit"), - gettext_noop("Disable on error")); +/* + * \dRs+ + * Describes subscriptions. + * + * Takes an optional regexp to select particular subscriptions + */ +bool +describeSubscriptions(const char *pattern) +{ + PQExpBufferData buf; + int i; + PGresult *res; + int ncols; + int nrows = 1; - if (pset.sversion >= 160000) - appendPQExpBuffer(&buf, - ", suborigin AS \"%s\"\n" - ", subpasswordrequired AS \"%s\"\n" - ", subrunasowner AS \"%s\"\n", - gettext_noop("Origin"), - gettext_noop("Password required"), - gettext_noop("Run as owner?")); + PQExpBufferData title; + printTableContent cont; - if (pset.sversion >= 170000) + if (pset.sversion < 100000) + { + char sverbuf[32]; + + pg_log_error("The server (version %s) does not support subscriptions.", + formatPGVersionNumber(pset.sversion, false, + sverbuf, sizeof(sverbuf))); + return true; + } + + initPQExpBuffer(&buf); + + addQueryComment(&buf, "Get matching subscriptions"); + appendPQExpBuffer(&buf, + "SELECT oid, subname AS \"%s\"\n" + ", (SELECT nspname FROM pg_namespace WHERE oid = " CppAsString2(PG_CONFLICT_NAMESPACE) ") AS \"%s\"\n" + ", pg_catalog.pg_get_userbyid(subowner) AS \"%s\"\n" + ", subenabled AS \"%s\"\n" + ", subpublications AS \"%s\"\n", + gettext_noop("Name"), + gettext_noop("Conflict_schema"), + gettext_noop("Owner"), + gettext_noop("Enabled"), + gettext_noop("Publication")); + + /* + * oid, subname and conflict_schema columns are internal and not displayed, + * so only 3 visible columns. + */ + ncols = 3; + + /* Binary mode and streaming are only supported in v14 and higher */ + if (pset.sversion >= 140000) + { + appendPQExpBuffer(&buf, + ", subbinary AS \"%s\"\n", + gettext_noop("Binary")); + ncols++; + + if (pset.sversion >= 160000) appendPQExpBuffer(&buf, - ", subfailover AS \"%s\"\n", - gettext_noop("Failover")); - if (pset.sversion >= 190000) - { + ", (CASE substream\n" + " WHEN " CppAsString2(LOGICALREP_STREAM_OFF) " THEN 'off'\n" + " WHEN " CppAsString2(LOGICALREP_STREAM_ON) " THEN 'on'\n" + " WHEN " CppAsString2(LOGICALREP_STREAM_PARALLEL) " THEN 'parallel'\n" + " END) AS \"%s\"\n", + gettext_noop("Streaming")); + else appendPQExpBuffer(&buf, - ", (select srvname from pg_catalog.pg_foreign_server where oid=subserver) AS \"%s\"\n", - gettext_noop("Server")); + ", substream AS \"%s\"\n", + gettext_noop("Streaming")); - appendPQExpBuffer(&buf, - ", subretaindeadtuples AS \"%s\"\n", - gettext_noop("Retain dead tuples")); + ncols++; + } - appendPQExpBuffer(&buf, - ", submaxretention AS \"%s\"\n", - gettext_noop("Max retention duration")); + /* Two_phase and disable_on_error are only supported in v15 and higher */ + if (pset.sversion >= 150000) + { + appendPQExpBuffer(&buf, + ", subtwophasestate AS \"%s\"\n" + ", subdisableonerr AS \"%s\"\n", + gettext_noop("Two-phase commit"), + gettext_noop("Disable on error")); + ncols += 2; + } - appendPQExpBuffer(&buf, - ", subretentionactive AS \"%s\"\n", - gettext_noop("Retention active")); - } + if (pset.sversion >= 160000) + { + appendPQExpBuffer(&buf, + ", suborigin AS \"%s\"\n" + ", subpasswordrequired AS \"%s\"\n" + ", subrunasowner AS \"%s\"\n", + gettext_noop("Origin"), + gettext_noop("Password required"), + gettext_noop("Run as owner?")); + ncols += 3; + } + if (pset.sversion >= 170000) + { appendPQExpBuffer(&buf, - ", subsynccommit AS \"%s\"\n" - ", subconninfo AS \"%s\"\n", - gettext_noop("Synchronous commit"), - gettext_noop("Conninfo")); + ", subfailover AS \"%s\"\n", + gettext_noop("Failover")); + ncols++; + } - if (pset.sversion >= 190000) - appendPQExpBuffer(&buf, - ", subwalrcvtimeout AS \"%s\"\n", - gettext_noop("Receiver timeout")); + if (pset.sversion >= 190000) + { + appendPQExpBuffer(&buf, + ", (select srvname from pg_catalog.pg_foreign_server where oid=subserver) AS \"%s\"\n" + ", subretaindeadtuples AS \"%s\"\n" + ", submaxretention AS \"%s\"\n" + ", subretentionactive AS \"%s\"\n", + gettext_noop("Server"), + gettext_noop("Retain dead tuples"), + gettext_noop("Max retention duration"), + gettext_noop("Retention active")); + ncols += 4; + } - /* Skip LSN is only supported in v15 and higher */ - if (pset.sversion >= 150000) - appendPQExpBuffer(&buf, - ", subskiplsn AS \"%s\"\n", - gettext_noop("Skip LSN")); + appendPQExpBuffer(&buf, + ", subsynccommit AS \"%s\"\n" + ", subconninfo AS \"%s\"\n", + gettext_noop("Synchronous commit"), + gettext_noop("Conninfo")); + ncols += 2; + + if (pset.sversion >= 190000) + { + appendPQExpBuffer(&buf, + ", subwalrcvtimeout AS \"%s\"\n", + gettext_noop("Receiver timeout")); + ncols++; + } + + /* Skip LSN is only supported in v15 and higher */ + if (pset.sversion >= 150000) + { + appendPQExpBuffer(&buf, + ", subskiplsn AS \"%s\"\n", + gettext_noop("Skip LSN")); + ncols++; + } + /* Conflict log destination is supported in v19 and higher */ + if (pset.sversion >= 200000) + { appendPQExpBuffer(&buf, - ", pg_catalog.obj_description(oid, 'pg_subscription') AS \"%s\"\n", - gettext_noop("Description")); + ", subconflictlogdest AS \"%s\"\n", + gettext_noop("Conflict log destination")); + ncols++; } + appendPQExpBuffer(&buf, + ", pg_catalog.obj_description(oid, 'pg_subscription') AS \"%s\"\n", + gettext_noop("Description")); + ncols++; + /* Only display subscriptions in current database. */ appendPQExpBufferStr(&buf, "FROM pg_catalog.pg_subscription\n" @@ -6890,20 +7023,143 @@ describeSubscriptions(const char *pattern, bool verbose) return false; } - appendPQExpBufferStr(&buf, "ORDER BY 1;"); + appendPQExpBufferStr(&buf, "ORDER BY subname;"); res = PSQLexec(buf.data); termPQExpBuffer(&buf); if (!res) return false; - myopt.title = _("List of subscriptions"); - myopt.translate_header = true; - myopt.translate_columns = translate_columns; - myopt.n_translate_columns = lengthof(translate_columns); + if (PQntuples(res) == 0) + { + if (!pset.quiet) + { + if (pattern) + pg_log_error("Did not find any subscription named \"%s\".", + pattern); + else + pg_log_error("Did not find any subscriptions."); + } - printQuery(res, &myopt, pset.queryFout, false, pset.logfile); + termPQExpBuffer(&buf); + PQclear(res); + return false; + } + + for (i = 0; i < PQntuples(res); i++) + { + const char align = 'l'; + Oid subid = atooid(PQgetvalue(res, i, 0)); + char *subname = PQgetvalue(res, i, 1); + char *conflict_schema = PQgetvalue(res, i, 2); + int current_col = 3; + char *logdest = "log"; + printTableOpt myopt = pset.popt.topt; + + initPQExpBuffer(&title); + printfPQExpBuffer(&title, _("Subscription %s"), subname); + printTableInit(&cont, &myopt, title.data, ncols, nrows); + + printTableAddHeader(&cont, gettext_noop("Owner"), true, align); + printTableAddHeader(&cont, gettext_noop("Enabled"), true, align); + printTableAddHeader(&cont, gettext_noop("Publication"), true, align); + + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + if (pset.sversion >= 140000) + { + printTableAddHeader(&cont, gettext_noop("Binary"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + printTableAddHeader(&cont, gettext_noop("Streaming"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + } + + if (pset.sversion >= 150000) + { + printTableAddHeader(&cont, gettext_noop("Two-phase commit"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + printTableAddHeader(&cont, gettext_noop("Disable on error"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + } + + if (pset.sversion >= 160000) + { + printTableAddHeader(&cont, gettext_noop("Origin"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + printTableAddHeader(&cont, gettext_noop("Password required"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + printTableAddHeader(&cont, gettext_noop("Run as owner?"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + } + + if (pset.sversion >= 170000) + { + printTableAddHeader(&cont, gettext_noop("Failover"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + } + + if (pset.sversion >= 190000) + { + printTableAddHeader(&cont, gettext_noop("Server"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + printTableAddHeader(&cont, gettext_noop("Retain dead tuples"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + printTableAddHeader(&cont, gettext_noop("Max retention duration"), + true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + printTableAddHeader(&cont, gettext_noop("Retention active"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + } + + printTableAddHeader(&cont, gettext_noop("Synchronous commit"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + printTableAddHeader(&cont, gettext_noop("Conninfo"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + if (pset.sversion >= 190000) + { + printTableAddHeader(&cont, gettext_noop("Receiver timeout"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + } + + if (pset.sversion >= 150000) + { + printTableAddHeader(&cont, gettext_noop("Skip LSN"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + } + + if (pset.sversion >= 200000) + { + printTableAddHeader(&cont, gettext_noop("Conflict log destination"), + true, align); + + logdest = PQgetvalue(res, i, current_col++); + + printTableAddCell(&cont, logdest, false, false); + } + + printTableAddHeader(&cont, gettext_noop("Description"), true, align); + printTableAddCell(&cont, PQgetvalue(res, i, current_col++), false, false); + + addFooterToSubscriptionDesc(logdest, conflict_schema, subid, &cont); + + printTable(&cont, pset.queryFout, false, pset.logfile); + printTableCleanup(&cont); + + termPQExpBuffer(&title); + } + + termPQExpBuffer(&buf); PQclear(res); return true; } diff --git a/src/bin/psql/describe.h b/src/bin/psql/describe.h index 47fae5ceafb..15c6c685323 100644 --- a/src/bin/psql/describe.h +++ b/src/bin/psql/describe.h @@ -126,7 +126,10 @@ bool listPublications(const char *pattern); bool describePublications(const char *pattern); /* \dRs */ -bool describeSubscriptions(const char *pattern, bool verbose); +bool listSubscriptions(const char *pattern); + +/* \dRs+ */ +bool describeSubscriptions(const char *pattern); /* \dAc */ extern bool listOperatorClasses(const char *access_method_pattern, diff --git a/src/test/regress/expected/subscription.out b/src/test/regress/expected/subscription.out index fed9c4a89b0..dec731aedfc 100644 --- a/src/test/regress/expected/subscription.out +++ b/src/test/regress/expected/subscription.out @@ -139,18 +139,18 @@ CREATE SUBSCRIPTION regress_testsub4 CONNECTION 'dbname=regress_doesnotexist' PU WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and alter the subscription to refresh publications. \dRs+ regress_testsub4 - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description -------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub4 | regress_subscription_user | f | {testpub} | f | parallel | d | f | none | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub4 + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | none | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub4 SET (origin = any); \dRs+ regress_testsub4 - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description -------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub4 | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub4 + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) DROP SUBSCRIPTION regress_testsub3; @@ -255,10 +255,10 @@ ALTER SUBSCRIPTION regress_testsub CONNECTION 'foobar'; ERROR: invalid connection string syntax: missing "=" after "foobar" in connection info string \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | test subscription + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | test subscription (1 row) ALTER SUBSCRIPTION regress_testsub SET PUBLICATION testpub2, testpub3 WITH (refresh = false); @@ -267,10 +267,10 @@ ALTER SUBSCRIPTION regress_testsub SET (slot_name = 'newname'); ALTER SUBSCRIPTION regress_testsub SET (password_required = false); ALTER SUBSCRIPTION regress_testsub SET (run_as_owner = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+------------------------------+------------------+------------+------------------- - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | parallel | d | f | any | f | t | f | | f | 0 | f | off | dbname=regress_doesnotexist2 | -1 | 0/00000000 | test subscription + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+------------------------------+------------------+------------+--------------------------+------------------- + regress_subscription_user | f | {testpub2,testpub3} | f | parallel | d | f | any | f | t | f | | f | 0 | f | off | dbname=regress_doesnotexist2 | -1 | 0/00000000 | log | test subscription (1 row) ALTER SUBSCRIPTION regress_testsub SET (password_required = true); @@ -286,10 +286,10 @@ ERROR: unrecognized subscription parameter: "create_slot" -- ok ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/12345'); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+------------------------------+------------------+------------+------------------- - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist2 | -1 | 0/00012345 | test subscription + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+------------------------------+------------------+------------+--------------------------+------------------- + regress_subscription_user | f | {testpub2,testpub3} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist2 | -1 | 0/00012345 | log | test subscription (1 row) -- ok - with lsn = NONE @@ -298,10 +298,10 @@ ALTER SUBSCRIPTION regress_testsub SKIP (lsn = NONE); ALTER SUBSCRIPTION regress_testsub SKIP (lsn = '0/0'); ERROR: invalid WAL location (LSN): 0/0 \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+------------------------------+------------------+------------+------------------- - regress_testsub | regress_subscription_user | f | {testpub2,testpub3} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist2 | -1 | 0/00000000 | test subscription + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+------------------------------+------------------+------------+--------------------------+------------------- + regress_subscription_user | f | {testpub2,testpub3} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist2 | -1 | 0/00000000 | log | test subscription (1 row) BEGIN; @@ -337,10 +337,10 @@ ALTER SUBSCRIPTION regress_testsub_foo SET (wal_receiver_timeout = '80s'); ALTER SUBSCRIPTION regress_testsub_foo SET (wal_receiver_timeout = 'foobar'); ERROR: invalid value for parameter "wal_receiver_timeout": "foobar" \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ----------------------+---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+------------------------------+------------------+------------+------------------- - regress_testsub_foo | regress_subscription_user | f | {testpub2,testpub3} | f | parallel | d | f | any | t | f | f | | f | 0 | f | local | dbname=regress_doesnotexist2 | 80s | 0/00000000 | test subscription + Subscription regress_testsub_foo + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+---------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+------------------------------+------------------+------------+--------------------------+------------------- + regress_subscription_user | f | {testpub2,testpub3} | f | parallel | d | f | any | t | f | f | | f | 0 | f | local | dbname=regress_doesnotexist2 | 80s | 0/00000000 | log | test subscription (1 row) -- rename back to keep the rest simple @@ -369,19 +369,19 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and alter the subscription to refresh publications. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | t | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | t | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (binary = false); ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) DROP SUBSCRIPTION regress_testsub; @@ -393,27 +393,27 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and alter the subscription to refresh publications. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | on | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | on | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (streaming = parallel); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (streaming = false); ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) -- fail - publication already exists @@ -428,10 +428,10 @@ ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refr ALTER SUBSCRIPTION regress_testsub ADD PUBLICATION testpub1, testpub2 WITH (refresh = false); ERROR: publication "testpub1" is already in subscription "regress_testsub" \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub,testpub1,testpub2} | f | off | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-----------------------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub,testpub1,testpub2} | f | off | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) -- fail - publication used more than once @@ -446,10 +446,10 @@ ERROR: publication "testpub3" is not in subscription "regress_testsub" -- ok - delete publications ALTER SUBSCRIPTION regress_testsub DROP PUBLICATION testpub1, testpub2 WITH (refresh = false); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | off | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) DROP SUBSCRIPTION regress_testsub; @@ -485,19 +485,19 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and alter the subscription to refresh publications. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | p | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | p | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) -- we can alter streaming when two_phase enabled ALTER SUBSCRIPTION regress_testsub SET (streaming = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | on | p | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | on | p | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -507,10 +507,10 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and alter the subscription to refresh publications. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | on | p | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | on | p | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -523,18 +523,18 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and alter the subscription to refresh publications. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (disable_on_error = true); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | t | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | t | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -547,10 +547,10 @@ CREATE SUBSCRIPTION regress_testsub CONNECTION 'dbname=regress_doesnotexist' PUB WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and alter the subscription to refresh publications. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); @@ -567,10 +567,10 @@ NOTICE: max_retention_duration is ineffective when retain_dead_tuples is disabl WARNING: subscription was created, but is not connected HINT: To initiate replication, you must manually create the replication slot, enable the subscription, and alter the subscription to refresh publications. \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 1000 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 1000 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) -- fail - max_retention_duration must be non-negative @@ -579,10 +579,10 @@ ERROR: option "max_retention_duration" cannot be negative -- ok ALTER SUBSCRIPTION regress_testsub SET (max_retention_duration = 0); \dRs+ - List of subscriptions - Name | Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Description ------------------+---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+------------- - regress_testsub | regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | + Subscription regress_testsub + Owner | Enabled | Publication | Binary | Streaming | Two-phase commit | Disable on error | Origin | Password required | Run as owner? | Failover | Server | Retain dead tuples | Max retention duration | Retention active | Synchronous commit | Conninfo | Receiver timeout | Skip LSN | Conflict log destination | Description +---------------------------+---------+-------------+--------+-----------+------------------+------------------+--------+-------------------+---------------+----------+--------+--------------------+------------------------+------------------+--------------------+-----------------------------+------------------+------------+--------------------------+------------- + regress_subscription_user | f | {testpub} | f | parallel | d | f | any | t | f | f | | f | 0 | f | off | dbname=regress_doesnotexist | -1 | 0/00000000 | log | (1 row) ALTER SUBSCRIPTION regress_testsub SET (slot_name = NONE); -- 2.54.0 (Apple Git-157)