Re: [PATCH] Logical decoding of TRUNCATE
От | Alvaro Herrera |
---|---|
Тема | Re: [PATCH] Logical decoding of TRUNCATE |
Дата | |
Msg-id | 20180405170712.av633jvnnizmd5sn@alvherre.pgsql обсуждение исходный текст |
Ответ на | Re: [PATCH] Logical decoding of TRUNCATE (Peter Eisentraut <peter.eisentraut@2ndquadrant.com>) |
Ответы |
Re: [PATCH] Logical decoding of TRUNCATE
|
Список | pgsql-hackers |
This sounds like a good approach. > +static void > +pg_decode_truncate(LogicalDecodingContext *ctx, ReorderBufferTXN *txn, > + int nrelations, Relation relations[], ReorderBufferChange *change) > +{ > + for (i = 0; i < nrelations; i++) > + { > + Oid relid = RelationGetRelid(relations[i]); > + > + if (i > 0) > + appendStringInfoString(ctx->out, ", "); > + > + appendStringInfoString(ctx->out, > + quote_qualified_identifier( > + get_namespace_name(get_rel_namespace(relid)), > + get_rel_name(relid))); Note that you start the loop having the Relation; yet you go extra length to grab the relnamespace and relname from syscache instead of just relations[i]->rd_rel->relname etc. pgoutput doesn't do it that way, so it doesn't affect logical replication, but I think it's best not to create awkward code in test_decoding, since it's so widely copied. > + else if (info == XLOG_HEAP_TRUNCATE) > + { > + xl_heap_truncate *xlrec = (xl_heap_truncate *) rec; > + > + if (xlrec->flags & XLH_TRUNCATE_CASCADE) > + appendStringInfo(buf, "cascade "); > + if (xlrec->flags & XLH_TRUNCATE_RESTART_SEQS) > + appendStringInfo(buf, "restart_seqs "); > + appendStringInfo(buf, "nrelids %u", xlrec->nrelids); > + /* skip the list of relids */ > + } Maybe not a big deal, but for future pg_waldump users I'm sure it'll be nice to have the OIDs here. > +void > +ExecuteTruncateGuts(List *explicit_rels, List *relids, List *relids_logged, > + DropBehavior behavior, bool restart_seqs) > +{ Please add a comment atop this function. > + /* > + * Write a WAL record to allow this set of actions to be logically decoded. > + * > + * Assemble an array of relids so we can write a single WAL record for the > + * whole action. > + */ > + if (list_length(relids_logged) > 0) > + { > + xl_heap_truncate xlrec; > + int i = 0; I wonder if this should happen only if logical decoding? (Maybe it already occurs because relids_logged would be empty? Worth a comment in that case) -- Álvaro Herrera https://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
В списке pgsql-hackers по дате отправления: