52.9. Logical Replication Message Formats
This section describes the detailed format of each logical replication message. These messages are returned either by the replication slot SQL interface or are sent by a walsender. In case of a walsender they are encapsulated inside the replication protocol WAL messages as described in Section 52.4 and generally obey same message flow as physical replication.
- Begin
 - 
    
- Byte1('B')
 - 
       
Identifies the message as a begin message.
 - Int64
 - 
       
The final LSN of the transaction.
 - Int64
 - 
       
Commit timestamp of the transaction. The value is in number of microseconds since PostgreSQL epoch (2000-01-01).
 - Int32
 - 
       
Xid of the transaction.
 
 - Commit
 - 
    
- Byte1('C')
 - 
       
Identifies the message as a commit message.
 - Int8
 - 
       
Flags; currently unused (must be 0).
 - Int64
 - 
       
The LSN of the commit.
 - Int64
 - 
       
The end LSN of the transaction.
 - Int64
 - 
       
Commit timestamp of the transaction. The value is in number of microseconds since PostgreSQL epoch (2000-01-01).
 
 - Origin
 - 
    
- Byte1('O')
 - 
       
Identifies the message as an origin message.
 - Int64
 - 
       
The LSN of the commit on the origin server.
 - String
 - 
       
Name of the origin.
 
Note that there can be multiple Origin messages inside a single transaction.
 - Relation
 - 
    
- Byte1('R')
 - 
       
Identifies the message as a relation message.
 - Int32
 - 
       
ID of the relation.
 - String
 - 
       
Namespace (empty string for
pg_catalog). - String
 - 
       
Relation name.
 - Int8
 - 
       
Replica identity setting for the relation (same as
relreplidentinpg_class). - Int16
 - 
       
Number of columns.
 
Next, the following message part appears for each column (except generated columns):
- Int8
 - 
       
Flags for the column. Currently can be either 0 for no flags or 1 which marks the column as part of the key.
 - String
 - 
       
Name of the column.
 - Int32
 - 
       
ID of the column's data type.
 - Int32
 - 
       
Type modifier of the column (
atttypmod). 
 - Type
 - 
    
- Byte1('Y')
 - 
       
Identifies the message as a type message.
 - Int32
 - 
       
ID of the data type.
 - String
 - 
       
Namespace (empty string for
pg_catalog). - String
 - 
       
Name of the data type.
 
 - Insert
 - 
    
- Byte1('I')
 - 
       
Identifies the message as an insert message.
 - Int32
 - 
       
ID of the relation corresponding to the ID in the relation message.
 - Byte1('N')
 - 
       
Identifies the following TupleData message as a new tuple.
 - TupleData
 - 
       
TupleData message part representing the contents of new tuple.
 
 - Update
 - 
    
- Byte1('U')
 - 
       
Identifies the message as an update message.
 - Int32
 - 
       
ID of the relation corresponding to the ID in the relation message.
 - Byte1('K')
 - 
       
Identifies the following TupleData submessage as a key. This field is optional and is only present if the update changed data in any of the column(s) that are part of the REPLICA IDENTITY index.
 - Byte1('O')
 - 
       
Identifies the following TupleData submessage as an old tuple. This field is optional and is only present if table in which the update happened has REPLICA IDENTITY set to FULL.
 - TupleData
 - 
       
TupleData message part representing the contents of the old tuple or primary key. Only present if the previous 'O' or 'K' part is present.
 - Byte1('N')
 - 
       
Identifies the following TupleData message as a new tuple.
 - TupleData
 - 
       
TupleData message part representing the contents of a new tuple.
 
The Update message may contain either a 'K' message part or an 'O' message part or neither of them, but never both of them.
 - Delete
 - 
    
- Byte1('D')
 - 
       
Identifies the message as a delete message.
 - Int32
 - 
       
ID of the relation corresponding to the ID in the relation message.
 - Byte1('K')
 - 
       
Identifies the following TupleData submessage as a key. This field is present if the table in which the delete has happened uses an index as REPLICA IDENTITY.
 - Byte1('O')
 - 
       
Identifies the following TupleData message as an old tuple. This field is present if the table in which the delete happened has REPLICA IDENTITY set to FULL.
 - TupleData
 - 
       
TupleData message part representing the contents of the old tuple or primary key, depending on the previous field.
 
The Delete message may contain either a 'K' message part or an 'O' message part, but never both of them.
 - Truncate
 - 
    
- Byte1('T')
 - 
       
Identifies the message as a truncate message.
 - Int32
 - 
       
Number of relations
 - Int8
 - 
       
Option bits for
TRUNCATE: 1 forCASCADE, 2 forRESTART IDENTITY - Int32
 - 
       
ID of the relation corresponding to the ID in the relation message. This field is repeated for each relation.
 
 
The following message parts are shared by the above messages.
- TupleData
 - 
    
- Int16
 - 
       
Number of columns.
 
Next, one of the following submessages appears for each column (except generated columns):
- Byte1('n')
 - 
       
Identifies the data as NULL value.
 
Or
- Byte1('u')
 - 
       
Identifies unchanged TOASTed value (the actual value is not sent).
 
Or
- Byte1('t')
 - 
       
Identifies the data as text formatted value.
 - Int32
 - 
       
Length of the column value.
 - 
       
        Byte
        
         
n - 
       
The value of the column, in text format. (A future release might support additional formats.)
nis the above length.