diff options
author | Peter Eisentraut <peter_e@gmx.net> | 2018-03-21 09:13:24 -0400 |
---|---|---|
committer | Peter Eisentraut <peter_e@gmx.net> | 2018-03-21 09:15:04 -0400 |
commit | 325f2ec5557fd1c9156c910102522e04cb42d99c (patch) | |
tree | d41044a9ebc9beec2809fe61289467b107802c25 /doc/src | |
parent | be8a7a6866276b228b4ffaa3003e1dc2dd1d140a (diff) |
Handle heap rewrites even better in logical decoding
Logical decoding should not publish anything about tables created as
part of a heap rewrite during DDL. Those tables don't exist externally,
so consumers of logical decoding cannot do anything sensible with that
information. In ab28feae2bd3d4629bd73ae3548e671c57d785f0, we worked
around this for built-in logical replication, but that was hack.
This is a more proper fix: We mark such transient heaps using the new
field pg_class.relwrite, linking to the original relation OID. By
default, we ignore them in logical decoding before they get to the
output plugin. Optionally, a plugin can register their interest in
getting such changes, if they handle DDL specially, in which case the
new field will help them get information about the actual table.
Reviewed-by: Craig Ringer <craig@2ndquadrant.com>
Diffstat (limited to 'doc/src')
-rw-r--r-- | doc/src/sgml/catalogs.sgml | 12 | ||||
-rw-r--r-- | doc/src/sgml/logicaldecoding.sgml | 5 |
2 files changed, 17 insertions, 0 deletions
diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 30e67413050..fc81133f07d 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -1924,6 +1924,18 @@ SCRAM-SHA-256$<replaceable><iteration count></replaceable>:<replaceable>&l </row> <row> + <entry><structfield>relrewrite</structfield></entry> + <entry><type>oid</type></entry> + <entry><literal><link linkend="catalog-pg-class"><structname>pg_class</structname></link>.oid</literal></entry> + <entry> + For new relations being written during a DDL operation that requires a + table rewrite, this contains the OID of the original relation; + otherwise 0. That state is only visible internally; this field should + never contain anything other than 0 for a user-visible relation. + </entry> + </row> + + <row> <entry><structfield>relfrozenxid</structfield></entry> <entry><type>xid</type></entry> <entry></entry> diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index 5501eed1086..f6b14dccb09 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -486,12 +486,17 @@ typedef void (*LogicalDecodeStartupCB) (struct LogicalDecodingContext *ctx, typedef struct OutputPluginOptions { OutputPluginOutputType output_type; + bool receive_rewrites; } OutputPluginOptions; </programlisting> <literal>output_type</literal> has to either be set to <literal>OUTPUT_PLUGIN_TEXTUAL_OUTPUT</literal> or <literal>OUTPUT_PLUGIN_BINARY_OUTPUT</literal>. See also <xref linkend="logicaldecoding-output-mode"/>. + If <literal>receive_rewrites</literal> is true, the output plugin will + also be called for changes made by heap rewrites during certain DDL + operations. These are of interest to plugins that handle DDL + replication, but they require special handling. </para> <para> |