pg_durable
pg_durable : Durable SQL functions for PostgreSQL
Overview
| ID | Extension | Package | Version | Category | License | Language |
|---|---|---|---|---|---|---|
| 2870 | pg_durable | pg_durable | 0.2.8 |
FEAT | PostgreSQL | Rust |
| Attribute | Has Binary | Has Library | Need Load | Has DDL | Relocatable | Trusted |
|---|---|---|---|---|---|---|
| --sLd-- | No | Yes | Yes | Yes | no | no |
| Relationships | |
|---|---|
| Schemas | pg_catalog df _duroxide |
| See Also | pg_task pgmq pg_background ulak pgmb pg_later pg_dispatch pg_retry fsm_core pglock |
Packages
| Type | Repo | Version | PG Major Compatibility | Package Pattern | Dependencies |
|---|---|---|---|---|---|
| EXT | PIGSTY | 0.2.8 |
18 17 16 15 14 | pg_durable |
- |
| RPM | PIGSTY | 0.2.8 |
18 17 16 15 14 | pg_durable_$v |
- |
| DEB | PIGSTY | 0.2.8 |
18 17 16 15 14 | postgresql-$v-pg-durable |
- |
| Linux / PG | PG18 | PG17 | PG16 | PG15 | PG14 |
|---|---|---|---|---|---|
| el8.x86_64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| el8.aarch64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| el9.x86_64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| el9.aarch64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| el10.x86_64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| el10.aarch64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| d12.x86_64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| d12.aarch64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| d13.x86_64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| d13.aarch64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| u22.x86_64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| u22.aarch64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| u24.x86_64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| u24.aarch64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| u26.x86_64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
| u26.aarch64 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 | PIGSTY 0.2.8 |
Source
github.com/microsoft/pg_durable
pg_durable-0.2.8.tar.gz
Install
Make sure PGDG and PIGSTY repo available:
Install this extension with pig:
Config this extension to shared_preload_libraries:
Create this extension with:
Usage
Sources:
- PGXN 0.2.6 README
- 0.2.6 user guide
- 0.2.6 changelog
- pg_durable control file
- 0.2.5 to 0.2.6 upgrade SQL
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:
Create the extension in pg_durable.database and grant an application login role access:
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
df.start() returns an instance ID. Use it to monitor or control the run:
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(), anddf.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(), anddf.clearvars()manage per-user variables captured whendf.start()is called.
Version 0.2.6 Boundaries
- Upstream source installation and published images support PostgreSQL 17 and 18 with
pgrx0.16.1. The extension still requiresshared_preload_libraries, a restart, and a superuser worker role. - Upgrades through 0.2.4 and 0.2.5 contain replay-breaking workflow changes. Drain or cancel in-flight JOIN, RACE, loop, and
df.wait_for_schedule()work before upgrading; the 0.2.4df.nodeskey migration also takes anACCESS EXCLUSIVElock. df.start(..., transaction_mode => 'new')persists an independent start outside the caller transaction. Cluster-wide admission defaults to two concurrent starts and is controlled bypg_durable.max_new_transaction_startsandpg_durable.new_transaction_start_timeout.- Variable substitution is resolved once from left to right in 0.2.6, so token-shaped text introduced by a value is not rescanned. It remains raw SQL substitution; never place untrusted input in
{name}variables. Named step-result substitution through$nameperforms SQL escaping. - The undocumented
df.ensure_durofut(text)helper was removed. Drop or rewrite customer-owned dependent objects before upgrading. - Re-run
df.grant_usage()afterALTER EXTENSION ... UPDATE, because grants on all functions do not automatically include functions added later. df.http()anddf.http_multipart()availability and egress policy are compile-time features. Their restrictions do not sandbox arbitrary SQL or other installed extensions.- The project remains pre-1.0, and upstream’s published Docker images are for evaluation and learning rather than production. Read every adjacent upgrade warning instead of assuming an untested multi-version jump is replay-safe.