@@ -1666,6 +1666,111 @@ test_sub=# SELECT * FROM t1 ORDER BY id;
1666
1666
log.
1667
1667
</para>
1668
1668
1669
+ <para>
1670
+ The log format for logical replication conflicts is as follows:
1671
+ <synopsis>
1672
+ LOG: conflict detected on relation "<replaceable>schemaname</replaceable>.<replaceable>tablename</replaceable>": conflict=<replaceable>conflict_type</replaceable>
1673
+ DETAIL: <replaceable class="parameter">detailed_explanation</replaceable>.
1674
+ {<replaceable class="parameter">detail_values</replaceable> [; ... ]}.
1675
+
1676
+ <phrase>where <replaceable class="parameter">detail_values</replaceable> is one of:</phrase>
1677
+
1678
+ <literal>Key</literal> (<replaceable>column_name</replaceable> <optional>, ...</optional>)=(<replaceable>column_value</replaceable> <optional>, ...</optional>)
1679
+ <literal>existing local tuple</literal> <optional>(<replaceable>column_name</replaceable> <optional>, ...</optional>)=</optional>(<replaceable>column_value</replaceable> <optional>, ...</optional>)
1680
+ <literal>remote tuple</literal> <optional>(<replaceable>column_name</replaceable> <optional>, ...</optional>)=</optional>(<replaceable>column_value</replaceable> <optional>, ...</optional>)
1681
+ <literal>replica identity</literal> {(<replaceable>column_name</replaceable> <optional>, ...</optional>)=(<replaceable>column_value</replaceable> <optional>, ...</optional>) | full <optional>(<replaceable>column_name</replaceable> <optional>, ...</optional>)=</optional>(<replaceable>column_value</replaceable> <optional>, ...</optional>)}
1682
+ </synopsis>
1683
+
1684
+ The log provides the following information:
1685
+ <variablelist>
1686
+ <varlistentry>
1687
+ <term><literal>LOG</literal></term>
1688
+ <listitem>
1689
+ <itemizedlist>
1690
+ <listitem>
1691
+ <para>
1692
+ <replaceable>schemaname</replaceable>.<replaceable>tablename</replaceable>
1693
+ identifies the local relation involved in the conflict.
1694
+ </para>
1695
+ </listitem>
1696
+ <listitem>
1697
+ <para>
1698
+ <replaceable>conflict_type</replaceable> is the type of conflict that occurred
1699
+ (e.g., <literal>insert_exists</literal>, <literal>update_exists</literal>).
1700
+ </para>
1701
+ </listitem>
1702
+ </itemizedlist>
1703
+ </listitem>
1704
+ </varlistentry>
1705
+
1706
+ <varlistentry>
1707
+ <term><literal>DETAIL</literal></term>
1708
+ <listitem>
1709
+ <itemizedlist>
1710
+ <listitem>
1711
+ <para>
1712
+ <replaceable class="parameter">detailed_explanation</replaceable> includes
1713
+ the origin, transaction ID, and commit timestamp of the transaction that
1714
+ modified the existing local tuple, if available.
1715
+ </para>
1716
+ </listitem>
1717
+ <listitem>
1718
+ <para>
1719
+ The <literal>Key</literal> section includes the key values of the local
1720
+ tuple that violated a unique constraint for
1721
+ <literal>insert_exists</literal> or <literal>update_exists</literal>
1722
+ conflicts.
1723
+ </para>
1724
+ </listitem>
1725
+ <listitem>
1726
+ <para>
1727
+ The <literal>existing local tuple</literal> section includes the local
1728
+ tuple if its origin differs from the remote tuple for
1729
+ <literal>update_differ</literal> or <literal>delete_differ</literal>
1730
+ conflicts, or if the key value conflicts with the remote tuple for
1731
+ <literal>insert_exists</literal> or <literal>update_exists</literal>
1732
+ conflicts.
1733
+ </para>
1734
+ </listitem>
1735
+ <listitem>
1736
+ <para>
1737
+ The <literal>remote tuple</literal> section includes the new tuple from
1738
+ the remote insert or update operation that caused the conflict. Note that
1739
+ for an update operation, the column value of the new tuple will be null
1740
+ if the value is unchanged and toasted.
1741
+ </para>
1742
+ </listitem>
1743
+ <listitem>
1744
+ <para>
1745
+ The <literal>replica identity</literal> section includes the replica
1746
+ identity key values that were used to search for the existing local
1747
+ tuple to be updated or deleted. This may include the full tuple value
1748
+ if the local relation is marked with
1749
+ <link linkend="sql-altertable-replica-identity-full"><literal>REPLICA IDENTITY FULL</literal></link>.
1750
+ </para>
1751
+ </listitem>
1752
+ <listitem>
1753
+ <para>
1754
+ <replaceable class="parameter">column_name</replaceable> is the column name.
1755
+ For <literal>existing local tuple</literal>, <literal>remote tuple</literal>,
1756
+ and <literal>replica identity full</literal> cases, column names are
1757
+ logged only if the user lacks the privilege to access all columns of
1758
+ the table. If column names are present, they appear in the same order
1759
+ as the corresponding column values.
1760
+ </para>
1761
+ </listitem>
1762
+ <listitem>
1763
+ <para>
1764
+ <replaceable class="parameter">column_value</replaceable> is the column value.
1765
+ The large column values are truncated to 64 bytes.
1766
+ </para>
1767
+ </listitem>
1768
+ </itemizedlist>
1769
+ </listitem>
1770
+ </varlistentry>
1771
+ </variablelist>
1772
+ </para>
1773
+
1669
1774
<para>
1670
1775
Logical replication operations are performed with the privileges of the role
1671
1776
which owns the subscription. Permissions failures on target tables will
0 commit comments