Skip to content
pg_rational

pg_rational

pg_rational : bigint fractions

Overview

ID Extension Package Version Category License Language
3720
pg_rational
pg_rational
0.0.3
TYPE
MIT
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--s-d--
No
Yes
No
Yes
no
no
Relationships
See Also
unit
pgmp
numeral
uint
uint128
seg
cube

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
MIXED
0.0.3
18
17
16
15
14
pg_rational -
RPM
PIGSTY
0.0.3
18
17
16
15
14
pg_rational_$v -
DEB
PGDG
0.0.3
18
17
16
15
14
postgresql-$v-rational -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el8.aarch64
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el9.x86_64
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el9.aarch64
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el10.x86_64
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
el10.aarch64
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
PIGSTY 0.0.3
d12.x86_64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
d12.aarch64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
d13.x86_64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
d13.aarch64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
u22.x86_64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
u22.aarch64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
u24.x86_64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
u24.aarch64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
u26.x86_64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
u26.aarch64
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
PGDG 0.0.3
Package Version OS ORG SIZE File URL
pg_rational_18 0.0.3 el8.x86_64 pigsty 20.5 KiB pg_rational_18-0.0.3-1PIGSTY.el8.x86_64.rpm
pg_rational_18 0.0.3 el8.aarch64 pigsty 20.0 KiB pg_rational_18-0.0.3-1PIGSTY.el8.aarch64.rpm
pg_rational_18 0.0.3 el9.x86_64 pigsty 19.6 KiB pg_rational_18-0.0.3-1PIGSTY.el9.x86_64.rpm
pg_rational_18 0.0.3 el9.aarch64 pigsty 19.4 KiB pg_rational_18-0.0.3-1PIGSTY.el9.aarch64.rpm
pg_rational_18 0.0.3 el10.x86_64 pigsty 19.7 KiB pg_rational_18-0.0.3-1PIGSTY.el10.x86_64.rpm
pg_rational_18 0.0.3 el10.aarch64 pigsty 19.8 KiB pg_rational_18-0.0.3-1PIGSTY.el10.aarch64.rpm
postgresql-18-rational 0.0.3 d12.x86_64 pgdg 24.9 KiB postgresql-18-rational_0.0.3-1.pgdg12+1_amd64.deb
postgresql-18-rational 0.0.2 d12.x86_64 pgdg 24.2 KiB postgresql-18-rational_0.0.2-8.pgdg12+1_amd64.deb
postgresql-18-rational 0.0.3 d12.aarch64 pgdg 24.8 KiB postgresql-18-rational_0.0.3-1.pgdg12+1_arm64.deb
postgresql-18-rational 0.0.2 d12.aarch64 pgdg 24.0 KiB postgresql-18-rational_0.0.2-8.pgdg12+1_arm64.deb
postgresql-18-rational 0.0.3 d13.x86_64 pgdg 24.9 KiB postgresql-18-rational_0.0.3-1.pgdg13+1_amd64.deb
postgresql-18-rational 0.0.2 d13.x86_64 pgdg 24.2 KiB postgresql-18-rational_0.0.2-8.pgdg13+1_amd64.deb
postgresql-18-rational 0.0.3 d13.aarch64 pgdg 25.1 KiB postgresql-18-rational_0.0.3-1.pgdg13+1_arm64.deb
postgresql-18-rational 0.0.2 d13.aarch64 pgdg 24.3 KiB postgresql-18-rational_0.0.2-8.pgdg13+1_arm64.deb
postgresql-18-rational 0.0.3 u22.x86_64 pgdg 25.0 KiB postgresql-18-rational_0.0.3-1.pgdg22.04+1_amd64.deb
postgresql-18-rational 0.0.2 u22.x86_64 pgdg 24.2 KiB postgresql-18-rational_0.0.2-8.pgdg22.04+1_amd64.deb
postgresql-18-rational 0.0.3 u22.aarch64 pgdg 24.6 KiB postgresql-18-rational_0.0.3-1.pgdg22.04+1_arm64.deb
postgresql-18-rational 0.0.2 u22.aarch64 pgdg 23.8 KiB postgresql-18-rational_0.0.2-8.pgdg22.04+1_arm64.deb
postgresql-18-rational 0.0.3 u24.x86_64 pgdg 25.0 KiB postgresql-18-rational_0.0.3-1.pgdg24.04+1_amd64.deb
postgresql-18-rational 0.0.2 u24.x86_64 pgdg 24.2 KiB postgresql-18-rational_0.0.2-8.pgdg24.04+1_amd64.deb
postgresql-18-rational 0.0.3 u24.aarch64 pgdg 25.1 KiB postgresql-18-rational_0.0.3-1.pgdg24.04+1_arm64.deb
postgresql-18-rational 0.0.2 u24.aarch64 pgdg 24.3 KiB postgresql-18-rational_0.0.2-8.pgdg24.04+1_arm64.deb
postgresql-18-rational 0.0.3 u26.x86_64 pgdg 24.6 KiB postgresql-18-rational_0.0.3-1.pgdg26.04+1_amd64.deb
postgresql-18-rational 0.0.2 u26.x86_64 pgdg 24.0 KiB postgresql-18-rational_0.0.2-8.pgdg26.04+1_amd64.deb
postgresql-18-rational 0.0.3 u26.aarch64 pgdg 24.6 KiB postgresql-18-rational_0.0.3-1.pgdg26.04+1_arm64.deb
postgresql-18-rational 0.0.2 u26.aarch64 pgdg 24.1 KiB postgresql-18-rational_0.0.2-8.pgdg26.04+1_arm64.deb

Source

pig build pkg pg_rational;		# build rpm

Install

Make sure PGDG and PIGSTY repo available:

pig repo add pgsql -u   # add both repo and update cache

Install this extension with pig:

pig install pg_rational;		# install via package name, for the active PG version

pig install pg_rational -v 18;   # install for PG 18
pig install pg_rational -v 17;   # install for PG 17
pig install pg_rational -v 16;   # install for PG 16
pig install pg_rational -v 15;   # install for PG 15
pig install pg_rational -v 14;   # install for PG 14

Create this extension with:

CREATE EXTENSION pg_rational;

Usage

Sources:

pg_rational provides exact fractional arithmetic in a fixed 64-bit PostgreSQL type. Use rational for values that must remain exact and for user-defined row ordering where new positions need to be inserted between existing positions without renumbering the table.

Exact Arithmetic

CREATE EXTENSION pg_rational;

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

The extension detects arithmetic overflow instead of silently wrapping. ratt is a helper type for tuple coercion:

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

Conversions are available between integer values, floating-point values, and rationals. Converting a float finds a rational approximation; converting a rational to float loses exactness.

Stable User-Defined Ordering

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;

Use an integer sequence and cast nextval() explicitly. The extension intentionally has no implicit bigint-to-rational conversion because its numerator is limited to the PostgreSQL integer range.

Indexes, Aggregates, and Caveats

  • rational supports btree and hash operator classes, so it can be used in ordered and equality indexes.
  • The extension supplies min(rational), max(rational), and sum(rational) aggregates in addition to arithmetic and comparison operators.
  • rational_intermediate(lower, upper) walks a Stern-Brocot tree to find a fraction between its arguments. Extremely narrow ranges take longer, and v0.0.3 has no maximum-depth parameter; do not expose attacker-controlled pathological bounds without a statement timeout.
  • Values are exact only while arithmetic stays within the type’s numerator and denominator limits. Handle overflow errors rather than falling back silently to floating point.
  • Version 0.0.3 is primarily a build-compatibility and documentation release; the user-facing rational arithmetic surface remains stable.
Last updated on