PostgreSQL码农集散地

PostgreSQL 19 魔法字符将被抛弃

PostgreSQL 19 preview - 协议扩展: 新增宏替代魔法字符

https://github.com/postgres/postgres/commit/9ea3b6f751abd7701f3f32d9df26d66410754c94

该提交(9ea3b6f751abd7701f3f32d9df26d66410754c94)的主要内容和意义如下:

变更解读

标题: Expand usage of macros for protocol characters
作者: Nathan Bossart
提交时间: 2025-08-06
链接: https://github.com/postgres/postgres/commit/9ea3b6f751abd7701f3f32d9df26d66410754c94

主要内容

  • 本次提交将协议消息中的“魔法字符(protocol characters)”硬编码,替换为了统一的宏定义(macro)。
  • 新增了多个宏,如 PqReplMsg_* 和 PqBackupMsg_*,分别用于复制、备份相关的特殊消息。
  • 在多处代码(如流复制、逻辑复制、BaseBackup、pg_basebackup工具等)用宏替换了原本的字符字面量,如 'w'、'k'、'r'、'm'等。
  • 在 src/include/libpq/protocol.h 头文件中集中定义了这些宏,提升了可维护性和可读性,降低了出错风险。

影响范围

  • 逻辑和物理复制协议
  • BaseBackup 相关备份协议
  • 客户端工具(如pg_basebackup、pg_recvlogical等)
  • 代码中所有涉及协议符号的地方均由宏定义统一

使用示例

以物理复制和 BaseBackup 协议为例:

1. 后端发送 WAL 数据

原代码(伪代码):

pq_sendbyte(ctx->out, 'w'); // 发送WAL数据  

新代码:

pq_sendbyte(ctx->out, PqReplMsg_WALData);  

2. 客户端接收消息类型

原代码:

if (copybuf[0] == 'k') { ... } // 保活消息  

新代码:

if (copybuf[0] == PqReplMsg_Keepalive) { ... }  

3. 备份流程中处理新归档文件

原代码:

switch (GetCopyDataByte(...)) {  
case'n': // 新归档  
    ...  
}  

新代码:

switch (GetCopyDataByte(...)) {  
case PqBackupMsg_NewArchive:  
    ...  
}  

4. 定义宏(src/include/libpq/protocol.h)

#define PqReplMsg_Keepalive         'k'
#define PqReplMsg_WALData           'w'
#define PqReplMsg_StandbyStatusUpdate 'r'
#define PqBackupMsg_NewArchive      'n'
#define PqBackupMsg_ProgressReport  'p'
#define PqBackupMsg_Manifest        'm'

总结

此次提交将协议相关的关键字母全部用宏封装,便于后续协议拓展和维护,也减少了开发者“魔法字符”误用、出错的可能性。所有涉及协议通信的地方都推荐采用这些宏。


参考链接

  • 该提交详情
  • protocol.h 新增宏定义

如需进一步了解如何在自己的代码中应用这些宏,请告知具体使用场景。