2
0

logicalproto.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /*-------------------------------------------------------------------------
  2. *
  3. * logicalproto.h
  4. * logical replication protocol
  5. *
  6. * Copyright (c) 2015-2022, PostgreSQL Global Development Group
  7. *
  8. * IDENTIFICATION
  9. * src/include/replication/logicalproto.h
  10. *
  11. *-------------------------------------------------------------------------
  12. */
  13. #ifndef LOGICAL_PROTO_H
  14. #define LOGICAL_PROTO_H
  15. #include "access/xact.h"
  16. #include "executor/tuptable.h"
  17. #include "replication/reorderbuffer.h"
  18. #include "utils/rel.h"
  19. /*
  20. * Protocol capabilities
  21. *
  22. * LOGICALREP_PROTO_VERSION_NUM is our native protocol.
  23. * LOGICALREP_PROTO_MAX_VERSION_NUM is the greatest version we can support.
  24. * LOGICALREP_PROTO_MIN_VERSION_NUM is the oldest version we
  25. * have backwards compatibility for. The client requests protocol version at
  26. * connect time.
  27. *
  28. * LOGICALREP_PROTO_STREAM_VERSION_NUM is the minimum protocol version with
  29. * support for streaming large transactions. Introduced in PG14.
  30. *
  31. * LOGICALREP_PROTO_TWOPHASE_VERSION_NUM is the minimum protocol version with
  32. * support for two-phase commit decoding (at prepare time). Introduced in PG15.
  33. */
  34. #define LOGICALREP_PROTO_MIN_VERSION_NUM 1
  35. #define LOGICALREP_PROTO_VERSION_NUM 1
  36. #define LOGICALREP_PROTO_STREAM_VERSION_NUM 2
  37. #define LOGICALREP_PROTO_TWOPHASE_VERSION_NUM 3
  38. #define LOGICALREP_PROTO_MAX_VERSION_NUM LOGICALREP_PROTO_TWOPHASE_VERSION_NUM
  39. /*
  40. * Logical message types
  41. *
  42. * Used by logical replication wire protocol.
  43. *
  44. * Note: though this is an enum, the values are used to identify message types
  45. * in logical replication protocol, which uses a single byte to identify a
  46. * message type. Hence the values should be single-byte wide and preferably
  47. * human-readable characters.
  48. */
  49. typedef enum LogicalRepMsgType
  50. {
  51. LOGICAL_REP_MSG_BEGIN = 'B',
  52. LOGICAL_REP_MSG_COMMIT = 'C',
  53. LOGICAL_REP_MSG_ORIGIN = 'O',
  54. LOGICAL_REP_MSG_INSERT = 'I',
  55. LOGICAL_REP_MSG_UPDATE = 'U',
  56. LOGICAL_REP_MSG_DELETE = 'D',
  57. LOGICAL_REP_MSG_TRUNCATE = 'T',
  58. LOGICAL_REP_MSG_RELATION = 'R',
  59. LOGICAL_REP_MSG_TYPE = 'Y',
  60. LOGICAL_REP_MSG_MESSAGE = 'M',
  61. LOGICAL_REP_MSG_BEGIN_PREPARE = 'b',
  62. LOGICAL_REP_MSG_PREPARE = 'P',
  63. LOGICAL_REP_MSG_COMMIT_PREPARED = 'K',
  64. LOGICAL_REP_MSG_ROLLBACK_PREPARED = 'r',
  65. LOGICAL_REP_MSG_STREAM_START = 'S',
  66. LOGICAL_REP_MSG_STREAM_STOP = 'E',
  67. LOGICAL_REP_MSG_STREAM_COMMIT = 'c',
  68. LOGICAL_REP_MSG_STREAM_ABORT = 'A',
  69. LOGICAL_REP_MSG_STREAM_PREPARE = 'p'
  70. } LogicalRepMsgType;
  71. /*
  72. * This struct stores a tuple received via logical replication.
  73. * Keep in mind that the columns correspond to the *remote* table.
  74. */
  75. typedef struct LogicalRepTupleData
  76. {
  77. /* Array of StringInfos, one per column; some may be unused */
  78. StringInfoData *colvalues;
  79. /* Array of markers for null/unchanged/text/binary, one per column */
  80. char *colstatus;
  81. /* Length of above arrays */
  82. int ncols;
  83. } LogicalRepTupleData;
  84. /* Possible values for LogicalRepTupleData.colstatus[colnum] */
  85. /* These values are also used in the on-the-wire protocol */
  86. #define LOGICALREP_COLUMN_NULL 'n'
  87. #define LOGICALREP_COLUMN_UNCHANGED 'u'
  88. #define LOGICALREP_COLUMN_TEXT 't'
  89. #define LOGICALREP_COLUMN_BINARY 'b' /* added in PG14 */
  90. typedef uint32 LogicalRepRelId;
  91. /* Relation information */
  92. typedef struct LogicalRepRelation
  93. {
  94. /* Info coming from the remote side. */
  95. LogicalRepRelId remoteid; /* unique id of the relation */
  96. char *nspname; /* schema name */
  97. char *relname; /* relation name */
  98. int natts; /* number of columns */
  99. char **attnames; /* column names */
  100. Oid *atttyps; /* column types */
  101. char replident; /* replica identity */
  102. char relkind; /* remote relation kind */
  103. Bitmapset *attkeys; /* Bitmap of key columns */
  104. } LogicalRepRelation;
  105. /* Type mapping info */
  106. typedef struct LogicalRepTyp
  107. {
  108. Oid remoteid; /* unique id of the remote type */
  109. char *nspname; /* schema name of remote type */
  110. char *typname; /* name of the remote type */
  111. } LogicalRepTyp;
  112. /* Transaction info */
  113. typedef struct LogicalRepBeginData
  114. {
  115. XLogRecPtr final_lsn;
  116. TimestampTz committime;
  117. TransactionId xid;
  118. } LogicalRepBeginData;
  119. typedef struct LogicalRepCommitData
  120. {
  121. XLogRecPtr commit_lsn;
  122. XLogRecPtr end_lsn;
  123. TimestampTz committime;
  124. } LogicalRepCommitData;
  125. /*
  126. * Prepared transaction protocol information for begin_prepare, and prepare.
  127. */
  128. typedef struct LogicalRepPreparedTxnData
  129. {
  130. XLogRecPtr prepare_lsn;
  131. XLogRecPtr end_lsn;
  132. TimestampTz prepare_time;
  133. TransactionId xid;
  134. char gid[GIDSIZE];
  135. } LogicalRepPreparedTxnData;
  136. /*
  137. * Prepared transaction protocol information for commit prepared.
  138. */
  139. typedef struct LogicalRepCommitPreparedTxnData
  140. {
  141. XLogRecPtr commit_lsn;
  142. XLogRecPtr end_lsn;
  143. TimestampTz commit_time;
  144. TransactionId xid;
  145. char gid[GIDSIZE];
  146. } LogicalRepCommitPreparedTxnData;
  147. /*
  148. * Rollback Prepared transaction protocol information. The prepare information
  149. * prepare_end_lsn and prepare_time are used to check if the downstream has
  150. * received this prepared transaction in which case it can apply the rollback,
  151. * otherwise, it can skip the rollback operation. The gid alone is not
  152. * sufficient because the downstream node can have a prepared transaction with
  153. * same identifier.
  154. */
  155. typedef struct LogicalRepRollbackPreparedTxnData
  156. {
  157. XLogRecPtr prepare_end_lsn;
  158. XLogRecPtr rollback_end_lsn;
  159. TimestampTz prepare_time;
  160. TimestampTz rollback_time;
  161. TransactionId xid;
  162. char gid[GIDSIZE];
  163. } LogicalRepRollbackPreparedTxnData;
  164. extern void logicalrep_write_begin(StringInfo out, ReorderBufferTXN *txn);
  165. extern void logicalrep_read_begin(StringInfo in,
  166. LogicalRepBeginData *begin_data);
  167. extern void logicalrep_write_commit(StringInfo out, ReorderBufferTXN *txn,
  168. XLogRecPtr commit_lsn);
  169. extern void logicalrep_read_commit(StringInfo in,
  170. LogicalRepCommitData *commit_data);
  171. extern void logicalrep_write_begin_prepare(StringInfo out, ReorderBufferTXN *txn);
  172. extern void logicalrep_read_begin_prepare(StringInfo in,
  173. LogicalRepPreparedTxnData *begin_data);
  174. extern void logicalrep_write_prepare(StringInfo out, ReorderBufferTXN *txn,
  175. XLogRecPtr prepare_lsn);
  176. extern void logicalrep_read_prepare(StringInfo in,
  177. LogicalRepPreparedTxnData *prepare_data);
  178. extern void logicalrep_write_commit_prepared(StringInfo out, ReorderBufferTXN *txn,
  179. XLogRecPtr commit_lsn);
  180. extern void logicalrep_read_commit_prepared(StringInfo in,
  181. LogicalRepCommitPreparedTxnData *prepare_data);
  182. extern void logicalrep_write_rollback_prepared(StringInfo out, ReorderBufferTXN *txn,
  183. XLogRecPtr prepare_end_lsn,
  184. TimestampTz prepare_time);
  185. extern void logicalrep_read_rollback_prepared(StringInfo in,
  186. LogicalRepRollbackPreparedTxnData *rollback_data);
  187. extern void logicalrep_write_stream_prepare(StringInfo out, ReorderBufferTXN *txn,
  188. XLogRecPtr prepare_lsn);
  189. extern void logicalrep_read_stream_prepare(StringInfo in,
  190. LogicalRepPreparedTxnData *prepare_data);
  191. extern void logicalrep_write_origin(StringInfo out, const char *origin,
  192. XLogRecPtr origin_lsn);
  193. extern char *logicalrep_read_origin(StringInfo in, XLogRecPtr *origin_lsn);
  194. extern void logicalrep_write_insert(StringInfo out, TransactionId xid,
  195. Relation rel,
  196. TupleTableSlot *newslot,
  197. bool binary, Bitmapset *columns);
  198. extern LogicalRepRelId logicalrep_read_insert(StringInfo in, LogicalRepTupleData *newtup);
  199. extern void logicalrep_write_update(StringInfo out, TransactionId xid,
  200. Relation rel,
  201. TupleTableSlot *oldslot,
  202. TupleTableSlot *newslot, bool binary, Bitmapset *columns);
  203. extern LogicalRepRelId logicalrep_read_update(StringInfo in,
  204. bool *has_oldtuple, LogicalRepTupleData *oldtup,
  205. LogicalRepTupleData *newtup);
  206. extern void logicalrep_write_delete(StringInfo out, TransactionId xid,
  207. Relation rel, TupleTableSlot *oldtuple,
  208. bool binary, Bitmapset *columns);
  209. extern LogicalRepRelId logicalrep_read_delete(StringInfo in,
  210. LogicalRepTupleData *oldtup);
  211. extern void logicalrep_write_truncate(StringInfo out, TransactionId xid,
  212. int nrelids, Oid relids[],
  213. bool cascade, bool restart_seqs);
  214. extern List *logicalrep_read_truncate(StringInfo in,
  215. bool *cascade, bool *restart_seqs);
  216. extern void logicalrep_write_message(StringInfo out, TransactionId xid, XLogRecPtr lsn,
  217. bool transactional, const char *prefix, Size sz, const char *message);
  218. extern void logicalrep_write_rel(StringInfo out, TransactionId xid,
  219. Relation rel, Bitmapset *columns);
  220. extern LogicalRepRelation *logicalrep_read_rel(StringInfo in);
  221. extern void logicalrep_write_typ(StringInfo out, TransactionId xid,
  222. Oid typoid);
  223. extern void logicalrep_read_typ(StringInfo out, LogicalRepTyp *ltyp);
  224. extern void logicalrep_write_stream_start(StringInfo out, TransactionId xid,
  225. bool first_segment);
  226. extern TransactionId logicalrep_read_stream_start(StringInfo in,
  227. bool *first_segment);
  228. extern void logicalrep_write_stream_stop(StringInfo out);
  229. extern void logicalrep_write_stream_commit(StringInfo out, ReorderBufferTXN *txn,
  230. XLogRecPtr commit_lsn);
  231. extern TransactionId logicalrep_read_stream_commit(StringInfo out,
  232. LogicalRepCommitData *commit_data);
  233. extern void logicalrep_write_stream_abort(StringInfo out, TransactionId xid,
  234. TransactionId subxid);
  235. extern void logicalrep_read_stream_abort(StringInfo in, TransactionId *xid,
  236. TransactionId *subxid);
  237. extern const char *logicalrep_message_type(LogicalRepMsgType action);
  238. #endif /* LOGICAL_PROTO_H */