DuckDB插件让psql完美输出int128。

理解需求背景

DuckDB的PostgreSQL Wire Protocol插件(duckdb_pgwire)允许客户端通过PostgreSQL协议与DuckDB交互,但默认不支持int128类型的终端输出。psql是PostgreSQL的官方命令行工具,其输出格式对int128这类大整数类型的处理需要特殊适配。

分析技术要点

  1. DuckDB的int128支持
    DuckDB内部已支持INT128类型,但通过PostgreSQL协议传输时需映射到PgSQL的等效类型(如numeric或自定义类型)。
  2. psql的输出适配
    psql依赖PgSQL的协议数据格式,需确保int128值能正确序列化为PgSQL格式的字符串。
  3. duckdb_pgwire插件扩展
    需修改插件的类型转换逻辑,添加INT128到PgSQL类型的映射规则。

实现步骤

修改类型映射逻辑

在duckdb_pgwire插件的类型处理模块中,添加INT128到PgSQL NUMERIC的映射。示例代码:

// 在类型转换注册函数中添加以下逻辑
if (duckdb_type.id() == LogicalTypeId::INT128) {
    pg_type = PostgresType(PG_NUMERIC);
    pg_type.set_type_modifier(-1); // 无长度限制
}
实现值序列化

重载INT128的序列化逻辑,确保数值转换为字符串后符合PgSQL的NUMERIC格式:

// 在值序列化逻辑中添加分支
case LogicalTypeId::INT128: {
    auto value = duckdb_value.GetValue<hugeint_t>();
    string str = Hugeint::ToString(value); // DuckDB内置的int128转字符串
    // 格式化为PgSQL NUMERIC的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值