corium-pgwire
A PostgreSQL wire-protocol front end for Corium SQL.
What it does
Speaks the PostgreSQL v3 frontend/backend protocol so ordinary PostgreSQL
clients (psql, JDBC, psycopg, pgx, BI tools) can query and mutate Corium
databases. Reads execute through corium-sql's
SqlSession; supported DML is planned there and committed through the
catalog's normal Corium transactor connection.
One server exposes a whole catalog of databases:
serve— accepts connections on aTcpListenerand handles each on its own task until a shutdown future resolves.DbCatalog— the async trait the server resolves databases through:list()enumerates the catalog anddb(name)returns a fresh immutable snapshot. A write-capable implementation also providestransact(); its default implementation is read-only. Implementations open databases lazily and cache them, so one database (and its segment cache) is shared across all client connections.PgWireConfig— an optional required cleartext password and the reportedserver_version.
A connection picks its database with the standard startup database parameter
and can switch at any time with USE <database>; SHOW DATABASES lists the
catalog. The database is validated lazily, so a client may connect with an
unknown default (for example the conventional postgres) and then USE a real
one.
Protocol coverage
- Startup with TLS/GSSAPI negotiation declined (
SSLRequest/GSSENCRequestanswered withN). - Trust or cleartext-password authentication.
- The simple query sub-protocol (
Query), including multiple semicolon-separated statements. - The extended query sub-protocol (
Parse/Bind/Describe/Execute/Sync/Close/Flush) with typed bound input parameters. - Results use the text wire format. Common scalar input parameters accept text or binary format; array and text-timestamp inputs and binary results remain unsupported.
INSERT,UPDATE, andDELETEover existing namespace projections, includingRETURNING, execute as guarded autocommit statements. Concurrent basis changes are reported as serialization failures.- Explicit transaction blocks track PostgreSQL's transaction status and allow reads, but reject writes until atomic multi-statement transactions exist.
SET,RESET, andDISCARDare accepted as compatibility no-ops.USE <database>switches the active database andSHOW DATABASESlists the catalog.
Type mapping
Corium's SqlType/SqlValue are rendered into PostgreSQL types:
| Corium | PostgreSQL |
|---|---|
Boolean |
bool |
SignedInteger |
int2 / int4 / int8 |
UnsignedInteger |
int4 / int8 / numeric (64-bit entity ids) |
Float |
float4 / float8 |
TimestampMillis |
timestamptz (UTC, ISO 8601) |
Text |
text |
Bytes |
bytea (hex output) |
List<T> |
the matching array type, e.g. _text |
Parameter and result formats
Scalar parameters accept PostgreSQL text and binary encodings. Text
timestamptz parameters accept ISO 8601 forms and require an explicit UTC
offset because the server does not maintain a session time zone. Query results
support both text and binary formats; array parameters remain unsupported.
Dependencies
corium-sql,corium-db,corium-core— the database and its SQL projection.tokio— the async TCP server and framing I/O.async-trait— theDbCatalogtrait;thiserror,tracing.
This is the crate behind the corium postgres-server command. See
docs/sql.md and
ADR-0013, and
ADR-0015.
The CLI server remains read-only unless its operator passes --allow-writes.
When enabled, the catalog commits through its cached corium-peer connection,
so the configured Corium service principal and transactor authorization gate
remain authoritative. PostgreSQL usernames/passwords are not yet mapped to
Corium principals; per-user authentication and authorization parity is still
future work.