Skip to content
pg_durable

pg_durable

pg_durable : Durable SQL functions for PostgreSQL

Overview

ID Extension Package Version Category License Language
2870
pg_durable
pg_durable
0.2.3
FEAT
PostgreSQL
Rust
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--sLd--
No
Yes
Yes
Yes
no
no
Relationships
Schemas df duroxide

Requires shared_preload_libraries=pg_durable and a superuser worker role.

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PIGSTY
0.2.3
18
17
16
15
14
pg_durable -
RPM
PIGSTY
0.2.3
18
17
16
15
14
pg_durable_$v -
DEB
PIGSTY
0.2.3
18
17
16
15
14
postgresql-$v-pg-durable -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
el8.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
el9.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
el9.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
el10.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
el10.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
d12.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
d12.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
d13.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
d13.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u22.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u22.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u24.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u24.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u26.x86_64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
u26.aarch64
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
PIGSTY 0.2.3
Package Version OS ORG SIZE File URL
pg_durable_18 0.2.3 el8.x86_64 pigsty 4.7 MiB pg_durable_18-0.2.3-1PIGSTY.el8.x86_64.rpm
pg_durable_18 0.2.3 el8.aarch64 pigsty 4.3 MiB pg_durable_18-0.2.3-1PIGSTY.el8.aarch64.rpm
pg_durable_18 0.2.3 el9.x86_64 pigsty 4.5 MiB pg_durable_18-0.2.3-1PIGSTY.el9.x86_64.rpm
pg_durable_18 0.2.3 el9.aarch64 pigsty 4.4 MiB pg_durable_18-0.2.3-1PIGSTY.el9.aarch64.rpm
pg_durable_18 0.2.3 el10.x86_64 pigsty 4.5 MiB pg_durable_18-0.2.3-1PIGSTY.el10.x86_64.rpm
pg_durable_18 0.2.3 el10.aarch64 pigsty 4.5 MiB pg_durable_18-0.2.3-1PIGSTY.el10.aarch64.rpm
postgresql-18-pg-durable 0.2.3 d12.x86_64 pigsty 3.7 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~bookworm_amd64.deb
postgresql-18-pg-durable 0.2.3 d12.aarch64 pigsty 3.2 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~bookworm_arm64.deb
postgresql-18-pg-durable 0.2.3 d13.x86_64 pigsty 3.7 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~trixie_amd64.deb
postgresql-18-pg-durable 0.2.3 d13.aarch64 pigsty 3.2 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~trixie_arm64.deb
postgresql-18-pg-durable 0.2.3 u22.x86_64 pigsty 4.0 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~jammy_amd64.deb
postgresql-18-pg-durable 0.2.3 u22.aarch64 pigsty 3.7 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~jammy_arm64.deb
postgresql-18-pg-durable 0.2.3 u24.x86_64 pigsty 4.0 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~noble_amd64.deb
postgresql-18-pg-durable 0.2.3 u24.aarch64 pigsty 3.8 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~noble_arm64.deb
postgresql-18-pg-durable 0.2.3 u26.x86_64 pigsty 4.0 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~resolute_amd64.deb
postgresql-18-pg-durable 0.2.3 u26.aarch64 pigsty 3.7 MiB postgresql-18-pg-durable_0.2.3-1PIGSTY~resolute_arm64.deb

Source

pig build pkg pg_durable;		# build rpm/deb

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_durable;		# install via package name, for the active PG version

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

Config this extension to shared_preload_libraries:

shared_preload_libraries = 'pg_durable';

Create this extension with:

CREATE EXTENSION pg_durable;

Usage

Sources:

pg_durable runs durable, fault-tolerant SQL workflows inside PostgreSQL. A workflow is a graph of SQL steps, timers, signals, conditions, and parallel branches submitted with df.start(). Execution state is checkpointed in PostgreSQL so completed steps are not repeated after a crash, restart, or retry.

Enable and Grant Access

Preload the worker, select its database and superuser role if the defaults are unsuitable, then restart PostgreSQL:

shared_preload_libraries = 'pg_durable'
pg_durable.database = 'postgres'
pg_durable.worker_role = 'postgres'

Create the extension in pg_durable.database and grant an application login role access:

CREATE EXTENSION pg_durable;
SELECT df.grant_usage('app_role');

The worker role must be a superuser because it manages all users’ instances while bypassing row-level security. The role that calls df.start() must have LOGIN, because workflow SQL is executed through a connection authenticated as that captured role.

Build and Run a Workflow

SELECT df.start(
    'SELECT 100 AS amount' |=> 'total'
    ~> 'SELECT $total.amount * 2 AS doubled',
    'double-total'
);

df.start() returns an instance ID. Use it to monitor or control the run:

SELECT df.status('a1b2c3d4');
SELECT df.result('a1b2c3d4');
SELECT * FROM df.instance_nodes('a1b2c3d4');
SELECT * FROM df.instance_executions('a1b2c3d4', 20);
SELECT df.cancel('a1b2c3d4', 'No longer needed');

DSL Index

  • ~> sequences steps; |=> names a result for $name, $name.column, or $name.* substitution.
  • & / df.join() waits for parallel branches; | / df.race() keeps the first result.
  • ?> and !> / df.if() select conditional branches; @> / df.loop() repeats a graph.
  • df.sleep(), df.wait_for_schedule(), and df.wait_for_signal() make waits durable.
  • df.signal(), df.wait_for_completion(), df.explain(), and the instance-inspection functions operate on running or stored instances.
  • df.setvar(), df.getvar(), df.unsetvar(), and df.clearvars() manage per-user variables captured when df.start() is called.

Version 0.2.3 Boundaries

  • Fresh v0.2.3 installs place provider objects in _duroxide; installations upgraded from 0.2.2 or earlier keep duroxide. df.duroxide_schema() reports the active schema.
  • Graphs deeper than 256 levels or larger than 10,000 nodes are rejected. A condition query returning no rows evaluates as false.
  • Re-run df.grant_usage() after ALTER EXTENSION ... UPDATE, because grants on all functions do not automatically include functions added later.
  • Variable {name} substitution is raw SQL text substitution; never place untrusted input in such variables. Named step-result substitution through $name performs SQL escaping.
  • df.http() availability and egress policy are compile-time features. Its restrictions do not sandbox arbitrary SQL or other installed extensions.
  • Upstream labels the project preview, and the published v0.2.3 Docker images are for evaluation and learning rather than production.
Last updated on