Skip to content
pg_describe

pg_describe

pg_describe : Report a query’s parameters and result columns without executing it

Overview

ID Extension Package Version Category License Language
4350
pg_describe
pg_describe
1.0.0
UTIL
MIT
C
Attribute Has Binary Has Library Need Load Has DDL Relocatable Trusted
--s-d-r
No
Yes
No
Yes
yes
no
Relationships
See Also
describe_resultset
colnames
ddlx
pg_readme
pglinter

Uses PostgreSQL parser and analyzer without invoking the executor; upstream and PIGSTY packages require PostgreSQL 17 or newer.

Packages

Type Repo Version PG Major Compatibility Package Pattern Dependencies
EXT
PIGSTY
1.0.0
18
17
16
15
14
pg_describe -
RPM
PIGSTY
1.0.0
18
17
16
15
14
pg_describe_$v -
DEB
PIGSTY
1.0.0
18
17
16
15
14
postgresql-$v-pg-describe -
Linux / PG PG18 PG17 PG16 PG15 PG14
el8.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
el8.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
el9.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
el9.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
el10.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
el10.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
d12.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
d12.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
d13.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
d13.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
u22.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
u22.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
u24.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
u24.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
u26.x86_64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
u26.aarch64
PIGSTY 1.0.0
PIGSTY 1.0.0
N/A
N/A
N/A
Package Version OS ORG SIZE File URL
pg_describe_18 1.0.0 el8.x86_64 pigsty 34.2 KiB pg_describe_18-1.0.0-1PIGSTY.el8.x86_64.rpm
pg_describe_18 1.0.0 el8.aarch64 pigsty 34.3 KiB pg_describe_18-1.0.0-1PIGSTY.el8.aarch64.rpm
pg_describe_18 1.0.0 el9.x86_64 pigsty 33.9 KiB pg_describe_18-1.0.0-1PIGSTY.el9.x86_64.rpm
pg_describe_18 1.0.0 el9.aarch64 pigsty 33.8 KiB pg_describe_18-1.0.0-1PIGSTY.el9.aarch64.rpm
pg_describe_18 1.0.0 el10.x86_64 pigsty 33.9 KiB pg_describe_18-1.0.0-1PIGSTY.el10.x86_64.rpm
pg_describe_18 1.0.0 el10.aarch64 pigsty 34.1 KiB pg_describe_18-1.0.0-1PIGSTY.el10.aarch64.rpm
postgresql-18-pg-describe 1.0.0 d12.x86_64 pigsty 35.9 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~bookworm_amd64.deb
postgresql-18-pg-describe 1.0.0 d12.aarch64 pigsty 35.8 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~bookworm_arm64.deb
postgresql-18-pg-describe 1.0.0 d13.x86_64 pigsty 35.9 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~trixie_amd64.deb
postgresql-18-pg-describe 1.0.0 d13.aarch64 pigsty 35.8 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~trixie_arm64.deb
postgresql-18-pg-describe 1.0.0 u22.x86_64 pigsty 37.8 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~jammy_amd64.deb
postgresql-18-pg-describe 1.0.0 u22.aarch64 pigsty 37.7 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~jammy_arm64.deb
postgresql-18-pg-describe 1.0.0 u24.x86_64 pigsty 37.2 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~noble_amd64.deb
postgresql-18-pg-describe 1.0.0 u24.aarch64 pigsty 36.9 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~noble_arm64.deb
postgresql-18-pg-describe 1.0.0 u26.x86_64 pigsty 37.1 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~resolute_amd64.deb
postgresql-18-pg-describe 1.0.0 u26.aarch64 pigsty 37.2 KiB postgresql-18-pg-describe_1.0.0-1PIGSTY~resolute_arm64.deb

Source

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

pig install pg_describe -v 18;   # install for PG 18
pig install pg_describe -v 17;   # install for PG 17

Create this extension with:

CREATE EXTENSION pg_describe;

Usage

Sources:

pg_describe reports the parameters and result columns of a SQL statement without executing it. It uses PostgreSQL parsing and analysis to infer parameter types, wire-visible result types, source-column provenance, and outer-join-aware nullability. Use it for code generation, migration checks, and query-contract tooling.

Describe a Query

CREATE EXTENSION pg_describe;

SELECT *
FROM pg_describe(
  'SELECT id, email FROM users WHERE id = $1'
);

Rows with kind = 'param' describe $1, $2, and later parameters. Rows with kind = 'column' describe result-column order, name, type OID/name, source table/column, base NOT NULL status, and whether the final expression is known non-null.

Check Join Nullability

SELECT *
FROM pg_describe($query$
  SELECT o.id, c.email
  FROM orders AS o
  LEFT JOIN customers AS c ON c.id = o.customer_id
  WHERE o.placed_at >= $1
$query$);

Even when customers.email is declared NOT NULL, result_not_null is false because a left join can null-extend the row. This distinction is useful when generating nullable client types.

Execution and Security Boundary

  • The statement is parsed and analyzed but not executed. Describing a DELETE, volatile function call, or expensive query does not run the statement.
  • Normal name resolution and privilege checks still apply. Callers cannot use pg_describe to inspect objects they could not reference themselves.
  • Parameter types must be inferable from context; ambiguous $n parameters still produce PostgreSQL analysis errors.
  • The result describes PostgreSQL’s analyzed output, not dynamic SQL assembled later by an application.

Requirements and Caveats

  • Upstream 1.0.0 requires PostgreSQL 17; PostgreSQL 16 is described as possibly working but untested. Pigsty packages target PostgreSQL 17 and 18.
  • The extension is relocatable and does not require preloading or a restart.
  • The companion pg-describe-gen TypeScript tool is a separate npm package. The PostgreSQL extension works without it.
  • This is a young API. Pin the extension/tool versions in CI and review generated changes alongside schema migrations.
Last updated on