Here are some review comments for v14-0001. This is a WIP, but here are my comments for all the SGML parts.
(There will be some overlap here with comments already posted by Shveta) ====== 1. file modes after applying the patch mode change 100644 => 100755 doc/src/sgml/ref/alter_subscription.sgml mode change 100644 => 100755 doc/src/sgml/ref/create_subscription.sgml What's going on here? Why are those SGMLs changed to executable? ====== Commit message 2. nit - a missing period in the first sentence nit - typo /reseting/resetting/ ====== doc/src/sgml/logical-replication.sgml 3. - <title>Conflicts</title> + <title>Conflicts and conflict resolution</title> nit - change the capitalisation to "and Conflict Resolution" to match other titles. ~~~ 4. + Additional logging is triggered in various conflict scenarios, each identified as a + conflict type, and the conflict statistics are collected (displayed in the + <link linkend="monitoring-pg-stat-subscription-stats"><structname>pg_stat_subscription_stats</structname></link> view). + Users have the option to configure a <literal>conflict_resolver</literal> for each + <literal>conflict_type</literal> when creating a subscription. + For more information on the supported <literal>conflict_types</literal> detected and + <literal>conflict_resolvers</literal>, refer to section + <link linkend="sql-createsubscription-params-with-conflict-resolver"><literal>CONFLICT RESOLVERS</literal></link>. + nit - "Additional logging is triggered" sounds strange. I reworded this in the nits attachment. Please see if you approve. nit - The "conflict_type" and "conflict_resolver" you are referring to here are syntax elements of the CREATE SUBSCRIPTION, so here I think they should just be called (without the underscores) "conflict type" and "conflict resolver". nit - IMO this would be better split into multiple paragraphs. nit - There is no such section called "CONFLICT RESOLVERS". I reworded this link text. ====== doc/src/sgml/monitoring.sgml 5. The changes here all render with the link including the type "(enum)" displayed, which I thought it unnecessary/strange. For example: See insert_exists (enum) for details about this conflict. IIUC there is no problem here, but maybe the other end of the link needed to define xreflabels. I have made the necessary modifications in the create_subscription.sgml. ====== doc/src/sgml/ref/alter_subscription.sgml 6. +ALTER SUBSCRIPTION <replaceable class="parameter">name</replaceable> CONFLICT RESOLVER ( <replaceable class="parameter">conflict_type</replaceable> [= <replaceable class="parameter">conflict_resolver</replaceable>] [, ...] ) This syntax seems wrong to me. Currently, it says: ALTER SUBSCRIPTION name CONFLICT RESOLVER ( conflict_type [= conflict_resolver] [, ...] ) But, shouldn't that say: ALTER SUBSCRIPTION name CONFLICT RESOLVER ( conflict_type = conflict_resolver [, ...] ) ~~~ 7. +ALTER SUBSCRIPTION <replaceable class="parameter">name</replaceable> RESET CONFLICT RESOLVER FOR (<replaceable class="parameter">conflict_type</replaceable>) I can see that this matches the implementation, but I was wondering why don't you permit resetting multiple conflict_types at the same time. e.g. what if I want to reset some but not ALL? ~~~ nit - there are some minor whitespace indent problems in the SGML ~~~ 8. + <varlistentry id="sql-altersubscription-params-conflict-resolver"> + <term><literal>CONFLICT RESOLVER ( <replaceable class="parameter">conflict_type</replaceable> [= <replaceable class="parameter">conflict_resolver</replaceable>] [, ... ] )</literal></term> + <listitem> + <para> + This clause alters either the default conflict resolvers or those set by <xref linkend="sql-createsubscription"/>. + Refer to section <link linkend="sql-createsubscription-params-with-conflict-resolver"><literal>CONFLICT RESOLVERS</literal></link> + for the details on supported <literal>conflict_types</literal> and <literal>conflict_resolvers</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-altersubscription-params-conflict-type"> + <term><replaceable class="parameter">conflict_type</replaceable></term> + <listitem> + <para> + The conflict type being reset to its default resolver setting. + For details on conflict types and their default resolvers, refer to section <link linkend="sql-createsubscription-params-with-conflict-resolver"><literal>CONFLICT RESOLVERS</literal></link> + </para> + </listitem> + </varlistentry> + </variablelist> This section seems problematic: e.g the syntax seems wrong same as before. ~ There are other nits. (I've given a rough fix in the nits attachment. Please see it and make it better). nit - why do you care if it is "either the default conflict resolvers or those set...". Why not just say "current resolver" nit - it does not mention 'conflict_resolver' type in the normal way nit - there is no actual section called "CONFLICT RESOLVERS" nit - the part that says "The conflict type being reset to its default resolver setting." is bogus for this form of the ALTER statement. ~~~ 9. There is no description for the "RESET CONFLICT RESOLVER ALL" ~~~ 10. There is no description for the "RESET CONFLICT RESOLVER FOR (conflict_type)" ====== doc/src/sgml/ref/create_subscription.sgml 11. General - Order + <varlistentry id="sql-createsubscription-params-with-conflict-resolver"> + <term><literal>CONFLICT RESOLVER ( <replaceable class="parameter">conflict_type</replaceable> = <replaceable nit - IMO this entire new entry about "CONFLICT RESOLVER" should appear on the page *above* the "WITH" section, because that is the order that it is defined in the CREATE SUBSCRIPTION syntax. ~~~ 12. General - whitespace nit - Much of this new section seems to have a slightly wrong indentation in the SGML. Mostly it is out by 1 or 2 spaces. ~~~ 13. General - ordering of conflict_type. nit - Instead of just some apparent random order, let's put each insert/update/delete conflict type in alphabetical order, so at least users can find them where they would expect to find them. ~~~ 14. 99. General - ordering of conflict_resolver nit - ditto. Let's name these in alphabetical order. IMO it makes more sense than the current random ordering. ~~~ 15. + <para> + This optional clause specifies options for conflict resolvers for different conflict_types. + </para> nit - IMO we don't need the words "options for" here. ~~~ 16. + <para> + The <replaceable class="parameter">conflict_type</replaceable> and their default behaviour are listed below. nit - sounded strange to me. reworded it slightly. ~~~ 17. + <varlistentry id="sql-createsubscription-params-with-conflict_type-insert-exists"> nit - Here, and for all other conflict types, add "xreflabel". See my review comment #5 for the reason why. ~~~ 18. + <para> + The <replaceable class="parameter">conflict_resolver</replaceable> and their behaviour + are listed below. Users can use any of the following resolvers for automatic conflict + resolution. + <variablelist> nit - reworded this too, to be like the previous review comment. ~~~ 19. General - readability. 19a. IMO the information about what are the default resolvers for each conflict type, and what resolvers are allowed for each conflict type should ideally be documented in a tabular form. Maybe all information is already present in the current document, but it is certainly hard to easily see it. As an example, I have added a table in this section. Maybe it is the best placement for this table, but I gave it mostly how you can present the same information so it is easier to read. ~ 19b. Bug. In doing this exercise I discovered there are 2 resolvers ("error" and "apply_remote") that both claim to be defaults for the same conflict types. They both say: + It is the default resolver for <literal>insert_exists</literal> and + <literal>update_exists</literal>. Anyway, this demonstrates that the current information was hard to read. I can tell from the code implementation what the document was supposed to say, but I will leave it to the patch authors to fix this one. (e.g. "apply_remote" says the wrong defaults) ====== Kind Regards, Peter Smith. Fujitsu Australia
diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index f82adfc..2077c6a 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -1568,7 +1568,7 @@ test_sub=# SELECT * FROM t1 ORDER BY id; </sect1> <sect1 id="logical-replication-conflicts"> - <title>Conflicts and conflict resolution</title> + <title>Conflicts and Conflict Resolution</title> <para> Logical replication behaves similarly to normal DML operations in that @@ -1582,18 +1582,19 @@ test_sub=# SELECT * FROM t1 ORDER BY id; </para> <para> - Additional logging is triggered in various conflict scenarios, each identified as a - conflict type, and the conflict statistics are collected (displayed in the - <link linkend="monitoring-pg-stat-subscription-stats"><structname>pg_stat_subscription_stats</structname></link> view). - Users have the option to configure a <literal>conflict_resolver</literal> for each - <literal>conflict_type</literal> when creating a subscription. - For more information on the supported <literal>conflict_types</literal> detected and - <literal>conflict_resolvers</literal>, refer to section - <link linkend="sql-createsubscription-params-with-conflict-resolver"><literal>CONFLICT RESOLVERS</literal></link>. - - Note that there are other conflict scenarios, such as exclusion constraint - violations. Currently, we do not provide additional details for them in the - log. + There are various conflict scenarios, each identified as a <firstterm>conflict type</firstterm>. + Users can configure a <firstterm>conflict resolver</firstterm> for each + conflict type when creating a subscription. For more information, refer to + <link linkend="sql-createsubscription-params-with-conflict-resolver"> + <command>CREATE SUBSCRIPTION ... CONFLICT RESOLVER</command></link>. + </para> + <para> + When a conflict occurs the details about it are logged, and the conflict + statistics are recorded in the <link linkend="monitoring-pg-stat-subscription-stats"> + <structname>pg_stat_subscription_stats</structname></link> view. + Note that there are other conflict scenarios, such as exclusion constraint + violations. Currently, we do not provide additional details for them in the + log. </para> <para> diff --git a/doc/src/sgml/ref/alter_subscription.sgml b/doc/src/sgml/ref/alter_subscription.sgml index 55eae8b..1982130 100755 --- a/doc/src/sgml/ref/alter_subscription.sgml +++ b/doc/src/sgml/ref/alter_subscription.sgml @@ -353,22 +353,32 @@ ALTER SUBSCRIPTION <replaceable class="parameter">name</replaceable> RESET CONFL <term><literal>CONFLICT RESOLVER ( <replaceable class="parameter">conflict_type</replaceable> [= <replaceable class="parameter">conflict_resolver</replaceable>] [, ... ] )</literal></term> <listitem> <para> - This clause alters either the default conflict resolvers or those set by <xref linkend="sql-createsubscription"/>. - Refer to section <link linkend="sql-createsubscription-params-with-conflict-resolver"><literal>CONFLICT RESOLVERS</literal></link> - for the details on supported <literal>conflict_types</literal> and <literal>conflict_resolvers</literal>. + This clause alters the current conflict resolver for the specified conflict types. + Refer to <link linkend="sql-createsubscription-params-with-conflict-resolver"> + <command>CREATE SUBSCRIBER ... CONFLICT RESOLVER</command></link> + for details about different <literal>conflict_type</literal> and what + kind of <literal>conflict_resolver</literal> can be assigned to them. </para> + <variablelist> + <varlistentry id="sql-altersubscription-params-conflict-resolver-type"> + <term><replaceable class="parameter">conflict_type</replaceable></term> + <listitem> + <para> + The conflict type. + </para> + </listitem> + </varlistentry> + <varlistentry id="sql-altersubscription-params-conflict-resolver-resolver"> + <term><replaceable class="parameter">conflict_resolver</replaceable></term> + <listitem> + <para> + The conflict resolver to use for this conflict type. + </para> + </listitem> + </varlistentry> + </variablelist> </listitem> </varlistentry> - - <varlistentry id="sql-altersubscription-params-conflict-type"> - <term><replaceable class="parameter">conflict_type</replaceable></term> - <listitem> - <para> - The conflict type being reset to its default resolver setting. - For details on conflict types and their default resolvers, refer to section <link linkend="sql-createsubscription-params-with-conflict-resolver"><literal>CONFLICT RESOLVERS</literal></link> - </para> - </listitem> - </varlistentry> </variablelist> <para> diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml index 25d4c0b..e3d435a 100755 --- a/doc/src/sgml/ref/create_subscription.sgml +++ b/doc/src/sgml/ref/create_subscription.sgml @@ -98,6 +98,202 @@ CREATE SUBSCRIPTION <replaceable class="parameter">subscription_name</replaceabl </listitem> </varlistentry> + <varlistentry id="sql-createsubscription-params-with-conflict-resolver"> + <term><literal>CONFLICT RESOLVER ( <replaceable class="parameter">conflict_type</replaceable> = <replaceable class="parameter">conflict_resolver</replaceable> [, ... ] )</literal></term> + <listitem> + <para> + This optional clause specifies conflict resolvers for different conflict_types. + </para> + + <para> + The default behavior for each <replaceable class="parameter">conflict_type</replaceable> is listed below. + <variablelist> + <varlistentry id="sql-createsubscription-params-with-conflict_type-insert-exists" xreflabel="insert_exists"> + <term><literal>insert_exists</literal> (<type>enum</type>)</term> + <listitem> + <para> + This conflict occurs when inserting a row that violates a + <literal>NOT DEFERRABLE</literal> unique constraint. + To log the origin and commit timestamp details of the conflicting key, + <link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link> + should be enabled on the subscriber. In this case, an error will be + raised until the conflict is resolved manually or the resolver is configured to a + non-default value that can automatically resolve the conflict. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_type-update-exists" xreflabel="update_exists"> + <term><literal>update_exists</literal> (<type>enum</type>)</term> + <listitem> + <para> + This conflict occurs when the updated value of a row violates + a <literal>NOT DEFERRABLE</literal> + unique constraint. To log the origin and commit + timestamp details of the conflicting key, + <link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link> + should be enabled on the subscriber. In this case, an error will be + raised until the conflict is resolved manually or the resolver is configured to a + non-default value that can automatically resolve the conflict. + Note that when updating a partitioned table, if the updated row + value satisfies another partition constraint resulting in the + row being inserted into a new partition, the <literal>insert_exists</literal> + conflict may arise if the new row violates a <literal>NOT DEFERRABLE</literal> + unique constraint. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_type-update-missing" xreflabel="update_missing"> + <term><literal>update_missing</literal> (<type>enum</type>)</term> + <listitem> + <para> + This conflict occurs when the tuple to be updated was not found. + The update will simply be skipped in this scenario. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_type-update-origin-differs" xreflabel="update_origin_differs"> + <term><literal>update_origin_differs</literal> (<type>enum</type>)</term> + <listitem> + <para> + This conflict occurs when updating a row that was previously + modified by another origin. + Note that this conflict can only be detected when + <link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link> + is enabled on the subscriber. Currently, the update is always applied + regardless of the origin of the local row. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_type-delete-missing" xreflabel="delete_missing"> + <term><literal>delete_missing</literal> (<type>enum</type>)</term> + <listitem> + <para> + This conflict occurs when the tuple to be deleted was not found. + The delete will simply be skipped in this scenario. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_type-delete-origin-differs" xreflabel="delete_origin_differs"> + <term><literal>delete_origin_differs</literal> (<type>enum</type>)</term> + <listitem> + <para> + This conflict occurs when deleting a row that was previously modified + by another origin. Note that this conflict can only be detected when + <link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link> + is enabled on the subscriber. Currently, the delete is always applied + regardless of the origin of the local row. + </para> + </listitem> + </varlistentry> + + </variablelist> + </para> + + <para> + The behavior of each <replaceable class="parameter">conflict_resolver</replaceable> + is described below. Users can choose from the following resolvers for automatic conflict + resolution. + <variablelist> + + <varlistentry id="sql-createsubscription-params-with-conflict_resolver-apply-or-error"> + <term><literal>apply_or_error</literal> (<type>enum</type>)</term> + <listitem> + <para> + This resolver is only used for <literal>update_missing</literal>. + An attempt is made to convert the update into an insert; if this cannot + be done due to missing information, then an error is thrown, and replication + is stopped. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_resolver-apply-or-skip"> + <term><literal>apply_or_skip</literal> (<type>enum</type>)</term> + <listitem> + <para> + This resolver is only used for <literal>update_missing</literal>. + An attempt is made to convert the update into an insert; if this + cannot be done due to missing information, then the change is skipped. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_resolver-apply-remote"> + <term><literal>apply_remote</literal> (<type>enum</type>)</term> + <listitem> + <para> + This resolver applies the remote change. It can be used for + <literal>insert_exists</literal>, <literal>update_exists</literal>, + <literal>update_origin_differs</literal> and <literal>delete_origin_differs</literal>. + It is the default resolver for <literal>insert_exists</literal> and + <literal>update_exists</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_resolver-error"> + <term><literal>error</literal> (<type>enum</type>)</term> + <listitem> + <para> + This resolver throws an error and stops replication. It can be used for + any conflict type. + It is the default resolver for <literal>insert_exists</literal> and + <literal>update_exists</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_resolver-keep-local"> + <term><literal>keep_local</literal> (<type>enum</type>)</term> + <listitem> + <para> + With this resolver, the remote change is not applied and the local tuple is maintained. + It can be used for <literal>insert_exists</literal>, <literal>update_exists</literal>, + <literal>update_origin_differs</literal> and <literal>delete_origin_differs</literal>. + </para> + </listitem> + </varlistentry> + + <varlistentry id="sql-createsubscription-params-with-conflict_resolver-skip"> + <term><literal>skip</literal> (<type>enum</type>)</term> + <listitem> + <para> + This resolver skips processing the remote change and continue replication + with the next change. + It can be used for <literal>update_missing</literal> and + <literal>delete_missing</literal> and is the default resolver for these types. + </para> + </listitem> + </varlistentry> + + </variablelist> + </para> + + <table id="sql-createsubscription-params-conflict-type-resolver-summary"> + <title>Conflict type/resolver Summary</title> + <tgroup cols="3"> + <thead> + <row><entry>Conflict type</entry> <entry>Default resolver</entry> <entry>Possible resolvers</entry></row> + </thead> + <tbody> + <row><entry>insert_exists</entry> <entry>error</entry> <entry>apply_remote, error, keep_local</entry></row> + <row><entry>update_exists</entry> <entry>error</entry> <entry>apply_remote, error, keep_local</entry></row> + <row><entry>update_missing</entry> <entry>skip</entry> <entry>apply_or_error, apply_or_skip, error, skip</entry></row> + <row><entry>update_origin_differs</entry><entry>apply_remote</entry> <entry>apply_remote, error, keep_local</entry></row> + <row><entry>delete_missing</entry> <entry>skip</entry> <entry>error, skip</entry></row> + <row><entry>delete_origin_differs</entry><entry>apply_remote</entry> <entry>apply_remote, error, keep_local</entry></row> + </tbody> + </tgroup> + </table> + + </listitem> + </varlistentry> + <varlistentry id="sql-createsubscription-params-with"> <term><literal>WITH ( <replaceable class="parameter">subscription_parameter</replaceable> [= <replaceable class="parameter">value</replaceable>] [, ... ] )</literal></term> <listitem> @@ -433,183 +629,6 @@ CREATE SUBSCRIPTION <replaceable class="parameter">subscription_name</replaceabl </listitem> </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict-resolver"> - <term><literal>CONFLICT RESOLVER ( <replaceable class="parameter">conflict_type</replaceable> = <replaceable class="parameter">conflict_resolver</replaceable> [, ... ] )</literal></term> - <listitem> - <para> - This optional clause specifies options for conflict resolvers for different conflict_types. - </para> - - <para> - The <replaceable class="parameter">conflict_type</replaceable> and their default behaviour are listed below. - <variablelist> - <varlistentry id="sql-createsubscription-params-with-conflict_type-insert-exists"> - <term><literal>insert_exists</literal> (<type>enum</type>)</term> - <listitem> - <para> - This conflict occurs when inserting a row that violates a - <literal>NOT DEFERRABLE</literal> unique constraint. - To log the origin and commit timestamp details of the conflicting key, - <link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link> - should be enabled on the subscriber. In this case, an error will be - raised until the conflict is resolved manually or the resolver is configured to a - non-default value that can automatically resolve the conflict. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_type-update-origin-differs"> - <term><literal>update_origin_differs</literal> (<type>enum</type>)</term> - <listitem> - <para> - This conflict occurs when updating a row that was previously - modified by another origin. - Note that this conflict can only be detected when - <link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link> - is enabled on the subscriber. Currently, the update is always applied - regardless of the origin of the local row. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_type-update-exists"> - <term><literal>update_exists</literal> (<type>enum</type>)</term> - <listitem> - <para> - This conflict occurs when the updated value of a row violates - a <literal>NOT DEFERRABLE</literal> - unique constraint. To log the origin and commit - timestamp details of the conflicting key, - <link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link> - should be enabled on the subscriber. In this case, an error will be - raised until the conflict is resolved manually or the resolver is configured to a - non-default value that can automatically resolve the conflict. - Note that when updating a partitioned table, if the updated row - value satisfies another partition constraint resulting in the - row being inserted into a new partition, the <literal>insert_exists</literal> - conflict may arise if the new row violates a <literal>NOT DEFERRABLE</literal> - unique constraint. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_type-update-missing"> - <term><literal>update_missing</literal> (<type>enum</type>)</term> - <listitem> - <para> - This conflict occurs when the tuple to be updated was not found. - The update will simply be skipped in this scenario. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_type-delete-origin-differs"> - <term><literal>delete_origin_differs</literal> (<type>enum</type>)</term> - <listitem> - <para> - This conflict occurs when deleting a row that was previously modified - by another origin. Note that this conflict can only be detected when - <link linkend="guc-track-commit-timestamp"><varname>track_commit_timestamp</varname></link> - is enabled on the subscriber. Currently, the delete is always applied - regardless of the origin of the local row. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_type-delete-missing"> - <term><literal>delete_missing</literal> (<type>enum</type>)</term> - <listitem> - <para> - This conflict occurs when the tuple to be deleted was not found. - The delete will simply be skipped in this scenario. - </para> - </listitem> - </varlistentry> - - </variablelist></para> - - <para> - The <replaceable class="parameter">conflict_resolver</replaceable> and their behaviour - are listed below. Users can use any of the following resolvers for automatic conflict - resolution. - <variablelist> - - <varlistentry id="sql-createsubscription-params-with-conflict_resolver-error"> - <term><literal>error</literal> (<type>enum</type>)</term> - <listitem> - <para> - This resolver throws an error and stops replication. It can be used for - any conflict type. - It is the default resolver for <literal>insert_exists</literal> and - <literal>update_exists</literal>. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_resolver-skip"> - <term><literal>skip</literal> (<type>enum</type>)</term> - <listitem> - <para> - This resolver skips processing the remote change and continue replication - with the next change. - It can be used for <literal>update_missing</literal> and - <literal>delete_missing</literal> and is the default resolver for these types. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_resolver-apply-remote"> - <term><literal>apply_remote</literal> (<type>enum</type>)</term> - <listitem> - <para> - This resolver applies the remote change. It can be used for - <literal>insert_exists</literal>, <literal>update_exists</literal>, - <literal>update_origin_differs</literal> and <literal>delete_origin_differs</literal>. - - It is the default resolver for <literal>insert_exists</literal> and - <literal>update_exists</literal>. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_resolver-keep-local"> - <term><literal>keep_local</literal> (<type>enum</type>)</term> - <listitem> - <para> - With this resolver, the remote change is not applied and the local tuple is maintained. - It can be used for <literal>insert_exists</literal>, <literal>update_exists</literal>, - <literal>update_origin_differs</literal> and <literal>delete_origin_differs</literal>. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_resolver-apply-or-skip"> - <term><literal>apply_or_skip</literal> (<type>enum</type>)</term> - <listitem> - <para> - This resolver is only used for <literal>update_missing</literal>. - An attempt is made to convert the update into an insert; if this - cannot be done due to missing information, then the change is skipped. - </para> - </listitem> - </varlistentry> - - <varlistentry id="sql-createsubscription-params-with-conflict_resolver-apply-or-error"> - <term><literal>apply_or_error</literal> (<type>enum</type>)</term> - <listitem> - <para> - This resolver is only used for <literal>update_missing</literal>. - An attempt is made to convert the update into an insert; if this cannot - be done due to missing information, then an error is thrown, and replication - is stopped. - </para> - </listitem> - </varlistentry> - </variablelist></para> - - </listitem> - </varlistentry> </variablelist> <para>