Skip to content
plproxy

plproxy

plproxy : Database partitioning implemented as procedural language

Overview

ID Extension Package Version Category License Language
2520
plproxy
plproxy
2.12.0
OLAP
0BSD
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--s-d--
No
Yes
No
Yes
no
no
Relationships
See Also
citus
dblink
postgres_fdw
pg_partman
odbc_fdw
jdbc_fdw
citus_columnar
columnar

PIGSTY RPM and PGDG DEB are aligned at 2.12.0.

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
MIXED
2.12.0
18
17
16
15
14
plproxy -
RPM
PIGSTY
2.12.0
18
17
16
15
14
plproxy_$v -
DEB
PGDG
2.12.0
18
17
16
15
14
postgresql-$v-plproxy -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
el8.aarch64
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
el9.x86_64
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
el9.aarch64
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
el10.x86_64
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
el10.aarch64
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
PIGSTY 2.12.0
d12.x86_64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
d12.aarch64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
d13.x86_64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
d13.aarch64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
u22.x86_64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
u22.aarch64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
u24.x86_64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
u24.aarch64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
u26.x86_64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
u26.aarch64
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
PGDG 2.12.0
Package Version OS ORG SIZE File URL
plproxy_18 2.12.0 el8.x86_64 pigsty 48.3 KiB plproxy_18-2.12.0-1PIGSTY.el8.x86_64.rpm
plproxy_18 2.12.0 el8.x86_64 pgdg 48.8 KiB plproxy_18-2.12.0-1PGDG.rhel8.10.x86_64.rpm
plproxy_18 2.11.0 el8.x86_64 pgdg 48.2 KiB plproxy_18-2.11.0-4PGDG.rhel8.x86_64.rpm
plproxy_18 2.12.0 el8.aarch64 pigsty 46.3 KiB plproxy_18-2.12.0-1PIGSTY.el8.aarch64.rpm
plproxy_18 2.12.0 el8.aarch64 pgdg 46.4 KiB plproxy_18-2.12.0-1PGDG.rhel8.10.aarch64.rpm
plproxy_18 2.11.0 el8.aarch64 pgdg 45.8 KiB plproxy_18-2.11.0-4PGDG.rhel8.aarch64.rpm
plproxy_18 2.12.0 el9.x86_64 pigsty 45.2 KiB plproxy_18-2.12.0-1PIGSTY.el9.x86_64.rpm
plproxy_18 2.12.0 el9.x86_64 pgdg 46.0 KiB plproxy_18-2.12.0-1PGDG.rhel9.8.x86_64.rpm
plproxy_18 2.11.0 el9.x86_64 pgdg 45.7 KiB plproxy_18-2.11.0-6PGDG.rhel9.8.x86_64.rpm
plproxy_18 2.11.0 el9.x86_64 pgdg 45.8 KiB plproxy_18-2.11.0-4PGDG.rhel9.x86_64.rpm
plproxy_18 2.12.0 el9.aarch64 pigsty 43.4 KiB plproxy_18-2.12.0-1PIGSTY.el9.aarch64.rpm
plproxy_18 2.12.0 el9.aarch64 pgdg 43.8 KiB plproxy_18-2.12.0-1PGDG.rhel9.8.aarch64.rpm
plproxy_18 2.11.0 el9.aarch64 pgdg 43.4 KiB plproxy_18-2.11.0-6PGDG.rhel9.8.aarch64.rpm
plproxy_18 2.11.0 el9.aarch64 pgdg 43.4 KiB plproxy_18-2.11.0-4PGDG.rhel9.aarch64.rpm
plproxy_18 2.12.0 el10.x86_64 pigsty 46.0 KiB plproxy_18-2.12.0-1PIGSTY.el10.x86_64.rpm
plproxy_18 2.12.0 el10.x86_64 pgdg 46.7 KiB plproxy_18-2.12.0-1PGDG.rhel10.2.x86_64.rpm
plproxy_18 2.11.0 el10.x86_64 pgdg 46.3 KiB plproxy_18-2.11.0-6PGDG.rhel10.2.x86_64.rpm
plproxy_18 2.11.0 el10.x86_64 pgdg 46.7 KiB plproxy_18-2.11.0-4PGDG.rhel10.x86_64.rpm
plproxy_18 2.12.0 el10.aarch64 pigsty 44.5 KiB plproxy_18-2.12.0-1PIGSTY.el10.aarch64.rpm
plproxy_18 2.12.0 el10.aarch64 pgdg 44.9 KiB plproxy_18-2.12.0-1PGDG.rhel10.2.aarch64.rpm
plproxy_18 2.11.0 el10.aarch64 pgdg 44.6 KiB plproxy_18-2.11.0-6PGDG.rhel10.2.aarch64.rpm
plproxy_18 2.11.0 el10.aarch64 pgdg 44.9 KiB plproxy_18-2.11.0-4PGDG.rhel10.aarch64.rpm
postgresql-18-plproxy 2.12.0 d12.x86_64 pgdg 134.2 KiB postgresql-18-plproxy_2.12.0-1.pgdg12+1_amd64.deb
postgresql-18-plproxy 2.11.0 d12.x86_64 pgdg 133.8 KiB postgresql-18-plproxy_2.11.0-13.pgdg12+1_amd64.deb
postgresql-18-plproxy 2.12.0 d12.aarch64 pgdg 130.5 KiB postgresql-18-plproxy_2.12.0-1.pgdg12+1_arm64.deb
postgresql-18-plproxy 2.11.0 d12.aarch64 pgdg 130.0 KiB postgresql-18-plproxy_2.11.0-13.pgdg12+1_arm64.deb
postgresql-18-plproxy 2.12.0 d13.x86_64 pgdg 134.3 KiB postgresql-18-plproxy_2.12.0-1.pgdg13+1_amd64.deb
postgresql-18-plproxy 2.11.0 d13.x86_64 pgdg 133.9 KiB postgresql-18-plproxy_2.11.0-13.pgdg13+1_amd64.deb
postgresql-18-plproxy 2.12.0 d13.aarch64 pgdg 130.8 KiB postgresql-18-plproxy_2.12.0-1.pgdg13+1_arm64.deb
postgresql-18-plproxy 2.11.0 d13.aarch64 pgdg 130.1 KiB postgresql-18-plproxy_2.11.0-13.pgdg13+1_arm64.deb
postgresql-18-plproxy 2.12.0 u22.x86_64 pgdg 138.5 KiB postgresql-18-plproxy_2.12.0-1.pgdg22.04+1_amd64.deb
postgresql-18-plproxy 2.11.0 u22.x86_64 pgdg 138.4 KiB postgresql-18-plproxy_2.11.0-13.pgdg22.04+1_amd64.deb
postgresql-18-plproxy 2.12.0 u22.aarch64 pgdg 134.2 KiB postgresql-18-plproxy_2.12.0-1.pgdg22.04+1_arm64.deb
postgresql-18-plproxy 2.11.0 u22.aarch64 pgdg 133.9 KiB postgresql-18-plproxy_2.11.0-13.pgdg22.04+1_arm64.deb
postgresql-18-plproxy 2.12.0 u24.x86_64 pgdg 132.4 KiB postgresql-18-plproxy_2.12.0-1.pgdg24.04+1_amd64.deb
postgresql-18-plproxy 2.11.0 u24.x86_64 pgdg 132.0 KiB postgresql-18-plproxy_2.11.0-13.pgdg24.04+1_amd64.deb
postgresql-18-plproxy 2.12.0 u24.aarch64 pgdg 128.9 KiB postgresql-18-plproxy_2.12.0-1.pgdg24.04+1_arm64.deb
postgresql-18-plproxy 2.11.0 u24.aarch64 pgdg 128.6 KiB postgresql-18-plproxy_2.11.0-13.pgdg24.04+1_arm64.deb
postgresql-18-plproxy 2.12.0 u26.x86_64 pgdg 130.6 KiB postgresql-18-plproxy_2.12.0-1.pgdg26.04+1_amd64.deb
postgresql-18-plproxy 2.11.0 u26.x86_64 pgdg 130.8 KiB postgresql-18-plproxy_2.11.0-13.pgdg26.04+1_amd64.deb
postgresql-18-plproxy 2.12.0 u26.aarch64 pgdg 127.3 KiB postgresql-18-plproxy_2.12.0-1.pgdg26.04+1_arm64.deb
postgresql-18-plproxy 2.11.0 u26.aarch64 pgdg 127.1 KiB postgresql-18-plproxy_2.11.0-13.pgdg26.04+1_arm64.deb

Source

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

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

Create this extension with:

CREATE EXTENSION plproxy;

Usage

Sources:

PL/Proxy is a PostgreSQL procedural language handler that enables remote procedure calls between PostgreSQL databases, with optional sharding.

Create the Extension

CREATE EXTENSION plproxy;

Language Statements

PL/Proxy functions use four types of statements:

Cluster selection – connect to a pre-configured cluster:

CREATE FUNCTION get_user(i_id int) RETURNS SETOF users AS $$
    CLUSTER 'mycluster';
    RUN ON i_id;
$$ LANGUAGE plproxy;

Direct connection – use a connection string:

CREATE FUNCTION get_config(key text) RETURNS text AS $$
    CONNECT 'host=remotehost dbname=config';
    SELECT val FROM config WHERE key = $1;
$$ LANGUAGE plproxy;

Execution Modes

RUN ON hash – route to a specific partition based on a hash:

CREATE FUNCTION get_user_settings(i_username text) RETURNS SETOF user_settings AS $$
    RUN ON namehash(i_username);
$$ LANGUAGE plproxy;

RUN ON ALL – execute on all databases in parallel:

CREATE FUNCTION get_all_counts() RETURNS SETOF record AS $$
    RUN ON ALL;
    SELECT count(*) FROM users;
$$ LANGUAGE plproxy;

RUN ON ANY – randomly select a server:

CREATE FUNCTION get_random_quote() RETURNS text AS $$
    RUN ON ANY;
    SELECT quote FROM quotes ORDER BY random() LIMIT 1;
$$ LANGUAGE plproxy;

Cluster Configuration

Clusters are configured using SQL/MED (Management of External Data):

CREATE SERVER mycluster FOREIGN DATA WRAPPER plproxy
    OPTIONS (
        connection_lifetime '1800',
        p0 'host=node0 dbname=mydb',
        p1 'host=node1 dbname=mydb',
        p2 'host=node2 dbname=mydb',
        p3 'host=node3 dbname=mydb'
    );

CREATE USER MAPPING FOR CURRENT_USER
    SERVER mycluster
    OPTIONS (user 'proxy_user', password 'secret');

Caveats

  • PL/Proxy routes function calls, not arbitrary cross-database transactions. Design remote functions to be retry-safe and keep transaction boundaries explicit.
  • Cluster definitions and user mappings can expose connection details; protect catalog access and prefer restricted remote roles.
  • Release 2.12.0 fixes quoted-identifier parsing in SELECT, a null-pointer issue in plproxy_fdw_validator, Windows builds, and PostgreSQL 19 compatibility. Existing SQL objects do not need a new usage pattern, but databases upgraded from an older extension version should run the matching ALTER EXTENSION plproxy UPDATE path.
Last updated on