From 20c75ed6a92ad7aceb7012ac94aeb0662d1a624b Mon Sep 17 00:00:00 2001 From: Hou Zhijie Date: Thu, 6 Apr 2023 20:12:20 +0800 Subject: [PATCH 4/6] DDL replication for index DDL commands --- src/backend/catalog/pg_publication.c | 1 + src/backend/commands/publicationcmds.c | 29 +- src/backend/replication/logical/ddltrigger.c | 13 +- src/backend/replication/logical/logical.c | 32 +- src/backend/replication/pgoutput/pgoutput.c | 79 +++- src/backend/utils/cache/relcache.c | 1 + src/bin/pg_dump/pg_dump.c | 36 +- src/bin/pg_dump/pg_dump.h | 1 + src/bin/psql/describe.c | 21 +- src/include/catalog/pg_publication.h | 4 + src/include/replication/ddlmessage.h | 3 +- src/test/regress/expected/psql.out | 6 +- src/test/regress/expected/publication.out | 420 +++++++++---------- 13 files changed, 397 insertions(+), 249 deletions(-) diff --git a/src/backend/catalog/pg_publication.c b/src/backend/catalog/pg_publication.c index d209602e28..1a3105e025 100644 --- a/src/backend/catalog/pg_publication.c +++ b/src/backend/catalog/pg_publication.c @@ -1029,6 +1029,7 @@ GetPublication(Oid pubid) pub->pubactions.pubdelete = pubform->pubdelete; pub->pubactions.pubtruncate = pubform->pubtruncate; pub->pubactions.pubddl_table = pubform->pubddl_table; + pub->pubactions.pubddl_index = pubform->pubddl_index; pub->pubviaroot = pubform->pubviaroot; ReleaseSysCache(tup); diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c index 64423ff35f..e3aad1c883 100644 --- a/src/backend/commands/publicationcmds.c +++ b/src/backend/commands/publicationcmds.c @@ -103,6 +103,7 @@ parse_publication_options(ParseState *pstate, pubactions->pubdelete = true; pubactions->pubtruncate = true; pubactions->pubddl_table = false; + pubactions->pubddl_index = false; *publish_via_partition_root = false; /* Parse options */ @@ -178,6 +179,7 @@ parse_publication_options(ParseState *pstate, * should be published. */ pubactions->pubddl_table = false; + pubactions->pubddl_index = false; *ddl_type_given = true; ddl_level = defGetString(defel); @@ -194,6 +196,8 @@ parse_publication_options(ParseState *pstate, if (strcmp(publish_opt, "table") == 0) pubactions->pubddl_table = true; + else if (strcmp(publish_opt, "index") == 0) + pubactions->pubddl_index = true; else ereport(ERROR, errcode(ERRCODE_SYNTAX_ERROR), @@ -856,6 +860,15 @@ CreateDDLReplicaEventTriggers(PublicationActions pubactions, Oid puboid) end_commands = lappend_int(end_commands, CMDTAG_DROP_TABLE); } + if (pubactions.pubddl_index) + { + start_commands = lappend_int(start_commands, CMDTAG_DROP_INDEX); + + end_commands = lappend_int(end_commands, CMDTAG_CREATE_INDEX); + end_commands = lappend_int(end_commands, CMDTAG_ALTER_INDEX); + end_commands = lappend_int(end_commands, CMDTAG_DROP_INDEX); + } + /* Create the ddl_command_end event trigger */ if (end_commands != NIL) CreateDDLReplicaEventTrigger(PUB_TRIG_EVENT1, end_commands, puboid); @@ -992,6 +1005,8 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) BoolGetDatum(pubactions.pubtruncate); values[Anum_pg_publication_pubddl_table - 1] = BoolGetDatum(pubactions.pubddl_table); + values[Anum_pg_publication_pubddl_index - 1] = + BoolGetDatum(pubactions.pubddl_index); values[Anum_pg_publication_pubviaroot - 1] = BoolGetDatum(publish_via_partition_root); @@ -1029,7 +1044,7 @@ CreatePublication(ParseState *pstate, CreatePublicationStmt *stmt) { List *rels; - if (pubactions.pubddl_table) + if (pubactions.pubddl_table || pubactions.pubddl_index) ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot add table to publication \"%s\" if DDL replication is enabled", @@ -1188,7 +1203,7 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, } } - if (ddl_type_given && pubactions.pubddl_table) + if (ddl_type_given && (pubactions.pubddl_table || pubactions.pubddl_index)) { if (root_relids == NIL) root_relids = GetPublicationRelations(pubform->oid, @@ -1223,7 +1238,8 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, if (ddl_type_given) { /* Recreate the event triggers if the ddl option is changed. */ - if (pubform->pubddl_table != pubactions.pubddl_table) + if (pubform->pubddl_table != pubactions.pubddl_table || + pubform->pubddl_index != pubactions.pubddl_index) { DropDDLReplicaEventTriggers(pubform->oid); CreateDDLReplicaEventTriggers(pubactions, pubform->oid); @@ -1231,6 +1247,9 @@ AlterPublicationOptions(ParseState *pstate, AlterPublicationStmt *stmt, values[Anum_pg_publication_pubddl_table - 1] = BoolGetDatum(pubactions.pubddl_table); replaces[Anum_pg_publication_pubddl_table - 1] = true; + + values[Anum_pg_publication_pubddl_index - 1] = BoolGetDatum(pubactions.pubddl_index); + replaces[Anum_pg_publication_pubddl_index - 1] = true; } if (publish_via_partition_root_given) @@ -1338,7 +1357,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, if (stmt->action == AP_AddObjects) { - if (pubform->pubddl_table) + if (pubform->pubddl_table || pubform->pubddl_index) ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot add table to publication \"%s\" if DDL replication is enabled", @@ -1362,7 +1381,7 @@ AlterPublicationTables(AlterPublicationStmt *stmt, HeapTuple tup, List *delrels = NIL; ListCell *oldlc; - if (pubform->pubddl_table) + if (pubform->pubddl_table || pubform->pubddl_index) ereport(ERROR, errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cannot add table to publication \"%s\" if DDL replication is enabled", diff --git a/src/backend/replication/logical/ddltrigger.c b/src/backend/replication/logical/ddltrigger.c index 1282340c2b..fb35cc2c7f 100644 --- a/src/backend/replication/logical/ddltrigger.c +++ b/src/backend/replication/logical/ddltrigger.c @@ -81,8 +81,17 @@ publication_deparse_ddl_command_start(PG_FUNCTION_ARGS) * new table. */ if (relpersist == RELPERSISTENCE_PERMANENT) - LogLogicalDDLMessage("deparse", address.objectId, DCT_TableDropStart, + { + DeparsedCommandType cmdtype; + + if (stmt->removeType == OBJECT_TABLE) + cmdtype = DCT_TableDropStart; + else + cmdtype = DCT_ObjectDropStart; + + LogLogicalDDLMessage("deparse", address.objectId, cmdtype, command, strlen(command) + 1); + } if (relation) table_close(relation, NoLock); @@ -225,6 +234,8 @@ publication_deparse_ddl_command_end(PG_FUNCTION_ARGS) if (strcmp(obj->objecttype, "table") == 0) cmdtype = DCT_TableDropEnd; + else if (strcmp(obj->objecttype, "index") == 0) + cmdtype = DCT_ObjectDropEnd; else continue; diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index f56a716567..533e27fb07 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -75,9 +75,9 @@ static void message_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, XLogRecPtr message_lsn, bool transactional, const char *prefix, Size message_size, const char *message); static void ddl_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, - XLogRecPtr message_lsn, const char *prefix, - Oid relid, DeparsedCommandType cmdtype, - Size message_size, const char *message); + XLogRecPtr message_lsn, const char *prefix, + Oid relid, DeparsedCommandType cmdtype, + Size message_size, const char *message); /* streaming callbacks */ static void stream_start_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, @@ -96,10 +96,10 @@ static void stream_message_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *tx XLogRecPtr message_lsn, bool transactional, const char *prefix, Size message_size, const char *message); static void stream_ddl_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, - XLogRecPtr message_lsn, - const char *prefix, - Oid relid, DeparsedCommandType cmdtype, - Size message_size, const char *message); + XLogRecPtr message_lsn, + const char *prefix, + Oid relid, DeparsedCommandType cmdtype, + Size message_size, const char *message); static void stream_truncate_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, int nrelations, Relation relations[], ReorderBufferChange *change); @@ -1248,10 +1248,10 @@ message_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, static void ddl_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, - XLogRecPtr message_lsn, - const char *prefix, Oid relid, DeparsedCommandType cmdtype, - Size message_size, - const char *message) + XLogRecPtr message_lsn, + const char *prefix, Oid relid, DeparsedCommandType cmdtype, + Size message_size, + const char *message) { LogicalDecodingContext *ctx = cache->private_data; LogicalErrorCallbackState state; @@ -1278,7 +1278,7 @@ ddl_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, /* do the actual work: call callback */ ctx->callbacks.ddl_cb(ctx, txn, message_lsn, prefix, relid, cmdtype, - message_size, message); + message_size, message); /* Pop the error context stack */ error_context_stack = errcallback.previous; @@ -1601,10 +1601,10 @@ stream_message_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, static void stream_ddl_cb_wrapper(ReorderBuffer *cache, ReorderBufferTXN *txn, - XLogRecPtr message_lsn, - const char *prefix, Oid relid, DeparsedCommandType cmdtype, - Size message_size, - const char *message) + XLogRecPtr message_lsn, + const char *prefix, Oid relid, DeparsedCommandType cmdtype, + Size message_size, + const char *message) { LogicalDecodingContext *ctx = cache->private_data; LogicalErrorCallbackState state; diff --git a/src/backend/replication/pgoutput/pgoutput.c b/src/backend/replication/pgoutput/pgoutput.c index 7ea9ff51ec..9a54cbd152 100644 --- a/src/backend/replication/pgoutput/pgoutput.c +++ b/src/backend/replication/pgoutput/pgoutput.c @@ -219,10 +219,20 @@ typedef struct PGOutputTxnData /* Map used to remember which relation schemas we sent. */ static HTAB *RelationSyncCache = NULL; +/* Struct to cache the published DDL. */ +typedef struct DDLSyncCache +{ + bool valid; + bool pubindex; +} DDLSyncCache; + +static DDLSyncCache *ddlcache = NULL; + static void init_rel_sync_cache(MemoryContext cachectx); static void cleanup_rel_sync_cache(TransactionId xid, bool is_commit); static RelationSyncEntry *get_rel_sync_entry(PGOutputData *data, Relation relation); +static void build_ddl_sync_cache(PGOutputData *data); static void rel_sync_cache_relation_cb(Datum arg, Oid relid); static void rel_sync_cache_publication_cb(Datum arg, int cacheid, uint32 hashvalue); @@ -1760,6 +1770,27 @@ is_object_published(LogicalDecodingContext *ctx, Oid objid) relentry->publish_as_relid != objid) return false; + break; + case RELKIND_INDEX: + build_ddl_sync_cache(data); + + if (!ddlcache->pubindex) + return false; + + /* Get the table OID that the index is for. */ + relation = RelationIdGetRelation(objid); + objid = relation->rd_index->indrelid; + RelationClose(relation); + + /* Filter the index DDLs if the index's table was not published. */ + relation = RelationIdGetRelation(objid); + relentry = get_rel_sync_entry(data, relation); + RelationClose(relation); + + if (!relentry->pubactions.pubddl_table || + relentry->publish_as_relid != objid) + return false; + break; default: /* unsupported objects */ @@ -1785,12 +1816,14 @@ pgoutput_ddl(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, * we cannot get the required information from the catalog, so we skip the * check for them. */ - if (cmdtype != DCT_TableDropEnd && !is_object_published(ctx, relid)) + if (cmdtype != DCT_TableDropEnd && cmdtype != DCT_ObjectDropEnd && + !is_object_published(ctx, relid)) return; switch (cmdtype) { case DCT_TableDropStart: + case DCT_ObjectDropStart: { MemoryContext old; @@ -1814,6 +1847,7 @@ pgoutput_ddl(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, return; case DCT_TableDropEnd: + case DCT_ObjectDropEnd: if (!list_member_oid(txndata->deleted_relids, relid)) return; @@ -1936,6 +1970,9 @@ publication_invalidation_cb(Datum arg, int cacheid, uint32 hashvalue) * is checked it will be updated with the new publication settings. */ rel_sync_cache_publication_cb(arg, cacheid, hashvalue); + + if (ddlcache != NULL) + ddlcache->valid = false; } /* @@ -2203,7 +2240,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->streamed_txns = NIL; entry->pubactions.pubinsert = entry->pubactions.pubupdate = entry->pubactions.pubdelete = entry->pubactions.pubtruncate = - entry->pubactions.pubddl_table = false; + entry->pubactions.pubddl_table = entry->pubactions.pubddl_index = false; entry->new_slot = NULL; entry->old_slot = NULL; memset(entry->exprstate, 0, sizeof(entry->exprstate)); @@ -2250,6 +2287,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->pubactions.pubdelete = false; entry->pubactions.pubtruncate = false; entry->pubactions.pubddl_table = false; + entry->pubactions.pubddl_index = false; /* * Tuple slots cleanups. (Will be rebuilt later if needed). @@ -2364,6 +2402,7 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) entry->pubactions.pubdelete |= pub->pubactions.pubdelete; entry->pubactions.pubtruncate |= pub->pubactions.pubtruncate; entry->pubactions.pubddl_table |= pub->pubactions.pubddl_table; + entry->pubactions.pubddl_index |= pub->pubactions.pubddl_index; /* * We want to publish the changes as the top-most ancestor @@ -2428,6 +2467,42 @@ get_rel_sync_entry(PGOutputData *data, Relation relation) return entry; } +/* + * This looks up all publications and build the cache about which DDLs to + * publish. + */ +static void +build_ddl_sync_cache(PGOutputData *data) +{ + ListCell *lc; + MemoryContext oldctx; + + if (ddlcache == NULL) + { + oldctx = MemoryContextSwitchTo(CacheMemoryContext); + ddlcache = (DDLSyncCache *) palloc0(sizeof(DDLSyncCache)); + MemoryContextSwitchTo(oldctx); + } + + if (ddlcache->valid) + return; + + ddlcache->pubindex = false; + + reload_publications(data); + + foreach(lc, data->publications) + { + Publication *pub = lfirst(lc); + + ddlcache->pubindex |= pub->pubactions.pubddl_index; + } + + ddlcache->valid = true; + + return; +} + /* * Cleanup list of streamed transactions and update the schema_sent flag. * diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 9198da2eb1..12259c9dd8 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -5721,6 +5721,7 @@ RelationBuildPublicationDesc(Relation relation, PublicationDesc *pubdesc) pubdesc->pubactions.pubdelete |= pubform->pubdelete; pubdesc->pubactions.pubtruncate |= pubform->pubtruncate; pubdesc->pubactions.pubddl_table |= pubform->pubddl_table; + pubdesc->pubactions.pubddl_index |= pubform->pubddl_index; /* * Check if all columns referenced in the filter expression are part diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 3c3a34267f..c34d33b9a1 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -4066,6 +4066,7 @@ getPublications(Archive *fout, int *numPublications) int i_pubdelete; int i_pubtruncate; int i_pubddl_table; + int i_pubddl_index; int i_pubviaroot; int i, ntups; @@ -4085,25 +4086,25 @@ getPublications(Archive *fout, int *numPublications) appendPQExpBufferStr(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubddl_table, p.pubviaroot " + "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, p.pubddl_table, p.pubddl_index, p.pubviaroot " "FROM pg_publication p"); else if (fout->remoteVersion >= 130000) appendPQExpBufferStr(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false as p.pubddl_table, p.pubviaroot " + "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false as p.pubddl_table, false as p.pubddl_index, p.pubviaroot " "FROM pg_publication p"); else if (fout->remoteVersion >= 110000) appendPQExpBufferStr(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false as p.pubddl_table, false AS pubviaroot " + "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate, false as p.pubddl_table, false as p.pubddl_index, false AS pubviaroot " "FROM pg_publication p"); else appendPQExpBufferStr(query, "SELECT p.tableoid, p.oid, p.pubname, " "p.pubowner, " - "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false as p.pubddl_table, false AS pubviaroot " + "p.puballtables, p.pubinsert, p.pubupdate, p.pubdelete, false AS pubtruncate, false as p.pubddl_table, false as p.pubddl_index, false AS pubviaroot " "FROM pg_publication p"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -4120,6 +4121,7 @@ getPublications(Archive *fout, int *numPublications) i_pubdelete = PQfnumber(res, "pubdelete"); i_pubtruncate = PQfnumber(res, "pubtruncate"); i_pubddl_table = PQfnumber(res, "pubddl_table"); + i_pubddl_index = PQfnumber(res, "pubddl_index"); i_pubviaroot = PQfnumber(res, "pubviaroot"); pubinfo = pg_malloc(ntups * sizeof(PublicationInfo)); @@ -4145,6 +4147,8 @@ getPublications(Archive *fout, int *numPublications) (strcmp(PQgetvalue(res, i, i_pubtruncate), "t") == 0); pubinfo[i].pubddl_table = (strcmp(PQgetvalue(res, i, i_pubddl_table), "t") == 0); + pubinfo[i].pubddl_index = + (strcmp(PQgetvalue(res, i, i_pubddl_index), "t") == 0); pubinfo[i].pubviaroot = (strcmp(PQgetvalue(res, i, i_pubviaroot), "t") == 0); @@ -4226,8 +4230,28 @@ dumpPublication(Archive *fout, const PublicationInfo *pubinfo) appendPQExpBufferStr(query, "'"); - if (pubinfo->pubddl_table) - appendPQExpBufferStr(query, ", ddl = 'table'"); + if (pubinfo->pubddl_table || pubinfo->pubddl_index) + { + first = true; + appendPQExpBufferStr(query, ", ddl = '"); + + if (pubinfo->pubddl_table) + { + appendPQExpBufferStr(query, "table"); + first = false; + } + + if (pubinfo->pubddl_index) + { + if (!first) + appendPQExpBufferStr(query, ", "); + + appendPQExpBufferStr(query, "index"); + first = false; + } + + appendPQExpBufferStr(query, "'"); + } if (pubinfo->pubviaroot) appendPQExpBufferStr(query, ", publish_via_partition_root = true"); diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index bd5f8fb669..9ae6a38e00 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -621,6 +621,7 @@ typedef struct _PublicationInfo bool pubdelete; bool pubtruncate; bool pubddl_table; + bool pubddl_index; bool pubviaroot; } PublicationInfo; diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index e977e6f464..7068dc0388 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -6183,7 +6183,7 @@ listPublications(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}; + static const bool translate_columns[] = {false, false, false, false, false, false, false, false, false, false, false}; if (pset.sversion < 100000) { @@ -6205,9 +6205,13 @@ listPublications(const char *pattern) gettext_noop("Owner"), gettext_noop("All tables")); if (pset.sversion >= 160000) + { appendPQExpBuffer(&buf, - ",\n pubddl_table AS \"%s\"", - gettext_noop("Table DDLs")); + ",\n pubddl_table AS \"%s\",\n" + " pubddl_index AS \"%s\"\n", + gettext_noop("Table DDLs"), + gettext_noop("Index DDLs")); + } appendPQExpBuffer(&buf, ",\n pubinsert AS \"%s\",\n" " pubupdate AS \"%s\",\n" @@ -6339,7 +6343,8 @@ describePublications(const char *pattern) " puballtables"); if (has_pubddl) appendPQExpBufferStr(&buf, - ", pubddl_table"); + ", pubddl_table, pubddl_index"); + appendPQExpBufferStr(&buf, ", pubinsert, pubupdate, pubdelete"); if (has_pubtruncate) @@ -6400,7 +6405,7 @@ describePublications(const char *pattern) if (has_pubviaroot) ncols++; if (has_pubddl) - ncols++; + ncols += 2; initPQExpBuffer(&title); printfPQExpBuffer(&title, _("Publication %s"), pubname); @@ -6409,7 +6414,10 @@ describePublications(const char *pattern) printTableAddHeader(&cont, gettext_noop("Owner"), true, align); printTableAddHeader(&cont, gettext_noop("All tables"), true, align); if (has_pubddl) + { printTableAddHeader(&cont, gettext_noop("Table DDLs"), true, align); + printTableAddHeader(&cont, gettext_noop("Index DDLs"), true, align); + } printTableAddHeader(&cont, gettext_noop("Inserts"), true, align); printTableAddHeader(&cont, gettext_noop("Updates"), true, align); printTableAddHeader(&cont, gettext_noop("Deletes"), true, align); @@ -6428,7 +6436,10 @@ describePublications(const char *pattern) if (has_pubviaroot) printTableAddCell(&cont, PQgetvalue(res, i, 8), false, false); if (has_pubddl) + { printTableAddCell(&cont, PQgetvalue(res, i, 9), false, false); + printTableAddCell(&cont, PQgetvalue(res, i, 10), false, false); + } if (!puballtables) { diff --git a/src/include/catalog/pg_publication.h b/src/include/catalog/pg_publication.h index 74b28d7350..467731c61a 100644 --- a/src/include/catalog/pg_publication.h +++ b/src/include/catalog/pg_publication.h @@ -66,6 +66,9 @@ CATALOG(pg_publication,6104,PublicationRelationId) /* true if table ddls are published */ bool pubddl_table; + + /* true if index ddls are published */ + bool pubddl_index; } FormData_pg_publication; /* ---------------- @@ -85,6 +88,7 @@ typedef struct PublicationActions bool pubdelete; bool pubtruncate; bool pubddl_table; + bool pubddl_index; } PublicationActions; typedef struct PublicationDesc diff --git a/src/include/replication/ddlmessage.h b/src/include/replication/ddlmessage.h index 77df6ea11a..1a4aca8dd5 100644 --- a/src/include/replication/ddlmessage.h +++ b/src/include/replication/ddlmessage.h @@ -26,7 +26,8 @@ typedef enum DeparsedCommandType DCT_TableDropEnd, DCT_TableAlter, DCT_ObjectCreate, - DCT_ObjectDrop + DCT_ObjectDropStart, + DCT_ObjectDropEnd } DeparsedCommandType; /* diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 1c6f33095c..3e6d2791c8 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -6223,9 +6223,9 @@ List of schemas (0 rows) \dRp "no.such.publication" - List of publications - Name | Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root -------+-------+------------+------------+---------+---------+---------+-----------+---------- + List of publications + Name | Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +------+-------+------------+------------+------------+---------+---------+---------+-----------+---------- (0 rows) \dRs "no.such.subscription" diff --git a/src/test/regress/expected/publication.out b/src/test/regress/expected/publication.out index 7d86977b29..ebcff41c0c 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -30,20 +30,20 @@ ERROR: conflicting or redundant options LINE 1: ...ub_xxx WITH (publish_via_partition_root = 'true', publish_vi... ^ \dRp - List of publications - Name | Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------+--------------------------+------------+------------+---------+---------+---------+-----------+---------- - testpib_ins_trunct | regress_publication_user | f | f | t | f | f | f | f - testpub_default | regress_publication_user | f | f | f | t | f | f | f + List of publications + Name | Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------+--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + testpib_ins_trunct | regress_publication_user | f | f | f | t | f | f | f | f + testpub_default | regress_publication_user | f | f | f | f | t | f | f | f (2 rows) ALTER PUBLICATION testpub_default SET (publish = 'insert, update, delete'); \dRp - List of publications - Name | Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------+--------------------------+------------+------------+---------+---------+---------+-----------+---------- - testpib_ins_trunct | regress_publication_user | f | f | t | f | f | f | f - testpub_default | regress_publication_user | f | f | t | t | t | f | f + List of publications + Name | Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------+--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + testpib_ins_trunct | regress_publication_user | f | f | f | t | f | f | f | f + testpub_default | regress_publication_user | f | f | f | t | t | t | f | f (2 rows) --- adding tables @@ -87,10 +87,10 @@ RESET client_min_messages; -- should be able to add schema to 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable ADD TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "public.testpub_tbl1" Tables from schemas: @@ -99,20 +99,20 @@ Tables from schemas: -- should be able to drop schema from 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable DROP TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "public.testpub_tbl1" -- should be able to set schema to 'FOR TABLE' publication ALTER PUBLICATION testpub_fortable SET TABLES IN SCHEMA pub_test; \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test" @@ -123,10 +123,10 @@ CREATE PUBLICATION testpub_forschema FOR TABLES IN SCHEMA pub_test; CREATE PUBLICATION testpub_for_tbl_schema FOR TABLES IN SCHEMA pub_test, TABLE pub_test.testpub_nopk; RESET client_min_messages; \dRp+ testpub_for_tbl_schema - Publication testpub_for_tbl_schema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_for_tbl_schema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "pub_test.testpub_nopk" Tables from schemas: @@ -135,10 +135,10 @@ Tables from schemas: -- should be able to add a table of the same schema to the schema publication ALTER PUBLICATION testpub_forschema ADD TABLE pub_test.testpub_nopk; \dRp+ testpub_forschema - Publication testpub_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "pub_test.testpub_nopk" Tables from schemas: @@ -147,10 +147,10 @@ Tables from schemas: -- should be able to drop the table ALTER PUBLICATION testpub_forschema DROP TABLE pub_test.testpub_nopk; \dRp+ testpub_forschema - Publication testpub_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test" @@ -161,10 +161,10 @@ ERROR: relation "testpub_nopk" is not part of the publication -- should be able to set table to schema publication ALTER PUBLICATION testpub_forschema SET TABLE pub_test.testpub_nopk; \dRp+ testpub_forschema - Publication testpub_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "pub_test.testpub_nopk" @@ -186,10 +186,10 @@ Publications: "testpub_foralltables" \dRp+ testpub_foralltables - Publication testpub_foralltables - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | t | f | t | t | f | f | f + Publication testpub_foralltables + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | t | f | f | t | t | f | f | f (1 row) DROP TABLE testpub_tbl2; @@ -201,19 +201,19 @@ CREATE PUBLICATION testpub3 FOR TABLE testpub_tbl3; CREATE PUBLICATION testpub4 FOR TABLE ONLY testpub_tbl3; RESET client_min_messages; \dRp+ testpub3 - Publication testpub3 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub3 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "public.testpub_tbl3" "public.testpub_tbl3a" \dRp+ testpub4 - Publication testpub4 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub4 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "public.testpub_tbl3" @@ -234,10 +234,10 @@ UPDATE testpub_parted1 SET a = 1; -- only parent is listed as being in publication, not the partition ALTER PUBLICATION testpub_forparted ADD TABLE testpub_parted; \dRp+ testpub_forparted - Publication testpub_forparted - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_forparted + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "public.testpub_parted" @@ -252,10 +252,10 @@ ALTER TABLE testpub_parted DETACH PARTITION testpub_parted1; UPDATE testpub_parted1 SET a = 1; ALTER PUBLICATION testpub_forparted SET (publish_via_partition_root = true); \dRp+ testpub_forparted - Publication testpub_forparted - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | t + Publication testpub_forparted + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | t Tables: "public.testpub_parted" @@ -284,10 +284,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub5 FOR TABLE testpub_rf_tbl1, testpub_rf_tbl2 WHERE (c <> 'test' AND d < 5) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub5 - Publication testpub5 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f + Publication testpub5 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) @@ -300,10 +300,10 @@ Tables: ALTER PUBLICATION testpub5 ADD TABLE testpub_rf_tbl3 WHERE (e > 1000 AND e < 2000); \dRp+ testpub5 - Publication testpub5 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f + Publication testpub5 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl2" WHERE ((c <> 'test'::text) AND (d < 5)) @@ -319,10 +319,10 @@ Publications: ALTER PUBLICATION testpub5 DROP TABLE testpub_rf_tbl2; \dRp+ testpub5 - Publication testpub5 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f + Publication testpub5 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl3" WHERE ((e > 1000) AND (e < 2000)) @@ -330,10 +330,10 @@ Tables: -- remove testpub_rf_tbl1 and add testpub_rf_tbl3 again (another WHERE expression) ALTER PUBLICATION testpub5 SET TABLE testpub_rf_tbl3 WHERE (e > 300 AND e < 500); \dRp+ testpub5 - Publication testpub5 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f + Publication testpub5 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | f | f | f | f Tables: "public.testpub_rf_tbl3" WHERE ((e > 300) AND (e < 500)) @@ -366,10 +366,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_syntax1 FOR TABLE testpub_rf_tbl1, ONLY testpub_rf_tbl3 WHERE (e < 999) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub_syntax1 - Publication testpub_syntax1 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f + Publication testpub_syntax1 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "public.testpub_rf_tbl3" WHERE (e < 999) @@ -379,10 +379,10 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub_syntax2 FOR TABLE testpub_rf_tbl1, testpub_rf_schema1.testpub_rf_tbl5 WHERE (h < 999) WITH (publish = 'insert'); RESET client_min_messages; \dRp+ testpub_syntax2 - Publication testpub_syntax2 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | f | f | f | f + Publication testpub_syntax2 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | f | f | f | f Tables: "public.testpub_rf_tbl1" "testpub_rf_schema1.testpub_rf_tbl5" WHERE (h < 999) @@ -497,10 +497,10 @@ CREATE PUBLICATION testpub6 FOR TABLES IN SCHEMA testpub_rf_schema2; ALTER PUBLICATION testpub6 SET TABLES IN SCHEMA testpub_rf_schema2, TABLE testpub_rf_schema2.testpub_rf_tbl6 WHERE (i < 99); RESET client_min_messages; \dRp+ testpub6 - Publication testpub6 - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub6 + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "testpub_rf_schema2.testpub_rf_tbl6" WHERE (i < 99) Tables from schemas: @@ -714,10 +714,10 @@ CREATE PUBLICATION testpub_table_ins WITH (publish = 'insert, truncate'); RESET client_min_messages; ALTER PUBLICATION testpub_table_ins ADD TABLE testpub_tbl5 (a); -- ok \dRp+ testpub_table_ins - Publication testpub_table_ins - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | f | f | t | f + Publication testpub_table_ins + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | f | f | t | f Tables: "public.testpub_tbl5" (a) @@ -891,10 +891,10 @@ CREATE TABLE testpub_tbl_both_filters (a int, b int, c int, PRIMARY KEY (a,c)); ALTER TABLE testpub_tbl_both_filters REPLICA IDENTITY USING INDEX testpub_tbl_both_filters_pkey; ALTER PUBLICATION testpub_both_filters ADD TABLE testpub_tbl_both_filters (a,c) WHERE (c != 1); \dRp+ testpub_both_filters - Publication testpub_both_filters - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_both_filters + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "public.testpub_tbl_both_filters" (a, c) WHERE (c <> 1) @@ -1099,10 +1099,10 @@ ERROR: relation "testpub_tbl1" is already member of publication "testpub_fortbl CREATE PUBLICATION testpub_fortbl FOR TABLE testpub_tbl1; ERROR: publication "testpub_fortbl" already exists \dRp+ testpub_fortbl - Publication testpub_fortbl - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_fortbl + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "pub_test.testpub_nopk" "public.testpub_tbl1" @@ -1140,10 +1140,10 @@ Publications: "testpub_fortbl" \dRp+ testpub_default - Publication testpub_default - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | f | f + Publication testpub_default + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | f | f Tables: "pub_test.testpub_nopk" "public.testpub_tbl1" @@ -1221,10 +1221,10 @@ REVOKE CREATE ON DATABASE regression FROM regress_publication_user2; DROP TABLE testpub_parted; DROP TABLE testpub_tbl1; \dRp+ testpub_default - Publication testpub_default - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | f | f + Publication testpub_default + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | f | f (1 row) -- fail - must be owner of publication @@ -1234,20 +1234,20 @@ ERROR: must be owner of publication testpub_default RESET ROLE; ALTER PUBLICATION testpub_default RENAME TO testpub_foo; \dRp testpub_foo - List of publications - Name | Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root --------------+--------------------------+------------+------------+---------+---------+---------+-----------+---------- - testpub_foo | regress_publication_user | f | f | t | t | t | f | f + List of publications + Name | Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +-------------+--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + testpub_foo | regress_publication_user | f | f | f | t | t | t | f | f (1 row) -- rename back to keep the rest simple ALTER PUBLICATION testpub_foo RENAME TO testpub_default; ALTER PUBLICATION testpub_default OWNER TO regress_publication_user2; \dRp testpub_default - List of publications - Name | Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ------------------+---------------------------+------------+------------+---------+---------+---------+-----------+---------- - testpub_default | regress_publication_user2 | f | f | t | t | t | f | f + List of publications + Name | Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +-----------------+---------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + testpub_default | regress_publication_user2 | f | f | f | t | t | t | f | f (1 row) -- adding schemas and tables @@ -1263,19 +1263,19 @@ CREATE TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"(id int); SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub1_forschema FOR TABLES IN SCHEMA pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" CREATE PUBLICATION testpub2_forschema FOR TABLES IN SCHEMA pub_test1, pub_test2, pub_test3; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1289,44 +1289,44 @@ CREATE PUBLICATION testpub6_forschema FOR TABLES IN SCHEMA "CURRENT_SCHEMA", CUR CREATE PUBLICATION testpub_fortable FOR TABLE "CURRENT_SCHEMA"."CURRENT_SCHEMA"; RESET client_min_messages; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "public" \dRp+ testpub4_forschema - Publication testpub4_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub4_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" \dRp+ testpub5_forschema - Publication testpub5_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub5_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" "public" \dRp+ testpub6_forschema - Publication testpub6_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub6_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "CURRENT_SCHEMA" "public" \dRp+ testpub_fortable - Publication testpub_fortable - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_fortable + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "CURRENT_SCHEMA.CURRENT_SCHEMA" @@ -1360,10 +1360,10 @@ ERROR: schema "testpub_view" does not exist -- dropping the schema should reflect the change in publication DROP SCHEMA pub_test3; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1371,20 +1371,20 @@ Tables from schemas: -- renaming the schema should reflect the change in publication ALTER SCHEMA pub_test1 RENAME to pub_test1_renamed; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1_renamed" "pub_test2" ALTER SCHEMA pub_test1_renamed RENAME to pub_test1; \dRp+ testpub2_forschema - Publication testpub2_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub2_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1392,10 +1392,10 @@ Tables from schemas: -- alter publication add schema ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1404,10 +1404,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1416,10 +1416,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema ADD TABLES IN SCHEMA pub_test1; ERROR: schema "pub_test1" is already member of publication "testpub1_forschema" \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1427,10 +1427,10 @@ Tables from schemas: -- alter publication drop schema ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1438,10 +1438,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA pub_test2; ERROR: tables from schema "pub_test2" are not part of the publication \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1449,29 +1449,29 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" -- drop all schemas ALTER PUBLICATION testpub1_forschema DROP TABLES IN SCHEMA pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f (1 row) -- alter publication set multiple schema ALTER PUBLICATION testpub1_forschema SET TABLES IN SCHEMA pub_test1, pub_test2; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1480,10 +1480,10 @@ Tables from schemas: ALTER PUBLICATION testpub1_forschema SET TABLES IN SCHEMA non_existent_schema; ERROR: schema "non_existent_schema" does not exist \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" "pub_test2" @@ -1492,10 +1492,10 @@ Tables from schemas: -- removing the duplicate schemas ALTER PUBLICATION testpub1_forschema SET TABLES IN SCHEMA pub_test1, pub_test1; \dRp+ testpub1_forschema - Publication testpub1_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub1_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1574,18 +1574,18 @@ SET client_min_messages = 'ERROR'; CREATE PUBLICATION testpub3_forschema; RESET client_min_messages; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f (1 row) ALTER PUBLICATION testpub3_forschema SET TABLES IN SCHEMA pub_test1; \dRp+ testpub3_forschema - Publication testpub3_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub3_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables from schemas: "pub_test1" @@ -1595,20 +1595,20 @@ CREATE PUBLICATION testpub_forschema_fortable FOR TABLES IN SCHEMA pub_test1, TA CREATE PUBLICATION testpub_fortable_forschema FOR TABLE pub_test2.tbl1, TABLES IN SCHEMA pub_test1; RESET client_min_messages; \dRp+ testpub_forschema_fortable - Publication testpub_forschema_fortable - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_forschema_fortable + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "pub_test2.tbl1" Tables from schemas: "pub_test1" \dRp+ testpub_fortable_forschema - Publication testpub_fortable_forschema - Owner | All tables | Table DDLs | Inserts | Updates | Deletes | Truncates | Via root ---------------------------+------------+------------+---------+---------+---------+-----------+---------- - regress_publication_user | f | f | t | t | t | t | f + Publication testpub_fortable_forschema + Owner | All tables | Table DDLs | Index DDLs | Inserts | Updates | Deletes | Truncates | Via root +--------------------------+------------+------------+------------+---------+---------+---------+-----------+---------- + regress_publication_user | f | f | f | t | t | t | t | f Tables: "pub_test2.tbl1" Tables from schemas: -- 2.30.0.windows.2