pg_rational

使用BIGINT表示的有理数数据类型

概览

扩展包名版本分类许可证语言
pg_rational0.0.3TYPEMITC
ID扩展名BinLibLoadCreateTrustReloc模式
3720pg_rational-

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED0.0.31817161514pg_rational-
RPMPIGSTY0.0.31817161514pg_rational_$v-
DEBPGDG0.0.31817161514postgresql-$v-rational-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
d12.aarch64
d13.x86_64
d13.aarch64
u22.x86_64
u22.aarch64
u24.x86_64
u24.aarch64
u26.x86_64
u26.aarch64

构建

您可以使用 pig build 命令构建 pg_rational 扩展的 RPM 包:

BASH
pig build pkg pg_rational         # 构建 RPM 包

安装

您可以直接安装 pg_rational 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

BASH
pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

安装
BASH
pig install pg_rational;          # 当前活跃 PG 版本安装
pig
BASH
pig ext install -y pg_rational -v 18  # PG 18
pig ext install -y pg_rational -v 17  # PG 17
pig ext install -y pg_rational -v 16  # PG 16
pig ext install -y pg_rational -v 15  # PG 15
pig ext install -y pg_rational -v 14  # PG 14
dnf
BASH
dnf install -y pg_rational_18       # PG 18
dnf install -y pg_rational_17       # PG 17
dnf install -y pg_rational_16       # PG 16
dnf install -y pg_rational_15       # PG 15
dnf install -y pg_rational_14       # PG 14
apt
BASH
apt install -y postgresql-18-rational   # PG 18
apt install -y postgresql-17-rational   # PG 17
apt install -y postgresql-16-rational   # PG 16
apt install -y postgresql-15-rational   # PG 15
apt install -y postgresql-14-rational   # PG 14

创建扩展

SQL
CREATE EXTENSION pg_rational;

用法

来源:

pg_rational 通过固定的 64 位 PostgreSQL 类型提供精确分数运算。对于必须保持精确的数值,以及需要在现有位置之间插入新位置而无需重新编号整张表的用户自定义行排序,可以使用 rational

精确运算

SQL
CREATE EXTENSION pg_rational;

SELECT 1::rational / 3 * 3 = 1;
SELECT '1/3'::rational + '2/7'::rational;
SELECT rational_simplify('36/12');

扩展会检测算术溢出,而不是静默回绕。ratt 是用于元组强制转换的辅助类型:

SQL
SELECT 1 + (i, i + 1)::ratt
FROM generate_series(1, 5) AS i;

整数值、浮点值与有理数之间可以相互转换。浮点数转换会寻找有理数近似值;将有理数转换成浮点数则会失去精确性。

稳定的用户自定义排序

SQL
CREATE SEQUENCE todos_seq AS integer;

CREATE TABLE todos (
  prio rational UNIQUE DEFAULT nextval('todos_seq')::integer,
  what text NOT NULL
);

INSERT INTO todos (what)
VALUES ('install extension'), ('read about it'), ('try it');

UPDATE todos
SET prio = rational_intermediate(1, 2)
WHERE what = 'try it';

SELECT * FROM todos ORDER BY prio;

请使用 integer 序列,并显式转换 nextval()。该扩展有意不提供从 bigintrational 的隐式转换,因为其分子受 PostgreSQL integer 范围限制。

索引、聚合与注意事项

  • rational 支持 btree 和 hash 操作符类,因此可用于排序索引和等值索引。
  • 除算术及比较操作符外,该扩展还提供 min(rational)max(rational)sum(rational) 聚合函数。
  • rational_intermediate(lower, upper) 沿 Stern-Brocot 树查找两个参数之间的分数。范围极窄时耗时会更长,而 v0.0.3 没有最大深度参数;在没有语句超时保护的情况下,不要向攻击者开放由其控制的病态边界。
  • 只有当算术运算保持在该类型的分子和分母限制内时,值才是精确的。应处理溢出错误,不要静默回退为浮点数。
  • 版本 0.0.3 主要是构建兼容性和文档发行版;面向用户的有理数运算接口保持稳定。