sql.postgres.messages
import sql.postgres.messages
sqldoes not re-export this module, so it is reached only by importing it directly.
Framing for the PostgreSQL wire protocol, version 3.
Every message is a one byte tag, a four byte big-endian length that counts itself, and then the body. The one exception is the startup message, which has no tag because the server has not yet been told which protocol version is in use.
Constants
AUTHENTICATION
sql.postgres.messages.AUTHENTICATION = 'R'
Messages the server sends, by tag.
BACKEND_KEY_DATA
sql.postgres.messages.BACKEND_KEY_DATA = 'K'
BIND_COMPLETE
sql.postgres.messages.BIND_COMPLETE = '2'
CLOSE_COMPLETE
sql.postgres.messages.CLOSE_COMPLETE = '3'
COMMAND_COMPLETE
sql.postgres.messages.COMMAND_COMPLETE = 'C'
COPY_IN_RESPONSE
sql.postgres.messages.COPY_IN_RESPONSE = 'G'
COPY_OUT_RESPONSE
sql.postgres.messages.COPY_OUT_RESPONSE = 'H'
COPY_DATA
sql.postgres.messages.COPY_DATA = 'd'
COPY_DONE
sql.postgres.messages.COPY_DONE = 'c'
DATA_ROW
sql.postgres.messages.DATA_ROW = 'D'
EMPTY_QUERY_RESPONSE
sql.postgres.messages.EMPTY_QUERY_RESPONSE = 'I'
ERROR_RESPONSE
sql.postgres.messages.ERROR_RESPONSE = 'E'
NO_DATA
sql.postgres.messages.NO_DATA = 'n'
NOTICE_RESPONSE
sql.postgres.messages.NOTICE_RESPONSE = 'N'
NOTIFICATION_RESPONSE
sql.postgres.messages.NOTIFICATION_RESPONSE = 'A'
PARAMETER_DESCRIPTION
sql.postgres.messages.PARAMETER_DESCRIPTION = 't'
PARAMETER_STATUS
sql.postgres.messages.PARAMETER_STATUS = 'S'
PARSE_COMPLETE
sql.postgres.messages.PARSE_COMPLETE = '1'
PORTAL_SUSPENDED
sql.postgres.messages.PORTAL_SUSPENDED = 's'
READY_FOR_QUERY
sql.postgres.messages.READY_FOR_QUERY = 'Z'
ROW_DESCRIPTION
sql.postgres.messages.ROW_DESCRIPTION = 'T'
AUTH_OK
sql.postgres.messages.AUTH_OK = 0
Authentication requests, by the number that follows the tag.
AUTH_CLEARTEXT
sql.postgres.messages.AUTH_CLEARTEXT = 3
AUTH_MD5
sql.postgres.messages.AUTH_MD5 = 5
AUTH_SASL
sql.postgres.messages.AUTH_SASL = 10
AUTH_SASL_CONTINUE
sql.postgres.messages.AUTH_SASL_CONTINUE = 11
AUTH_SASL_FINAL
sql.postgres.messages.AUTH_SASL_FINAL = 12
PROTOCOL_VERSION
sql.postgres.messages.PROTOCOL_VERSION = 196608
The protocol version this adapter speaks: 3.0, as a single number with the major version in the high half.
SSL_REQUEST
sql.postgres.messages.SSL_REQUEST = 80877103
The number the server recognises as a request to start TLS. It takes the place of a protocol version in a startup-shaped message.
Functions
read_cstring()
sql.postgres.messages.read_cstring(payload, at: number) -> dict
Splits a run of zero-terminated strings.
Several messages are built this way, including the error report, where each field is a one byte code followed by its text.
Parameters
payload(bytes)at(number) — Where to start.
Returns dict — { value, next }
Classes
Writer
class sql.postgres.messages.Writer
Builds one outgoing message.
Bytes accumulate in a list and frame() puts the tag and length on the
front, since the length cannot be known until the body is finished.
Writer.byte()
sql.postgres.messages.Writer.byte(value: number) -> Writer
Appends one byte.
Parameters
value(number)
Returns Writer — This writer, so calls chain.
Writer.int16()
sql.postgres.messages.Writer.int16(value: number) -> Writer
Appends a big-endian 16 bit integer.
Parameters
value(number)
Returns Writer
Writer.int32()
sql.postgres.messages.Writer.int32(value: number) -> Writer
Appends a big-endian 32 bit integer.
Parameters
value(number)
Returns Writer
Writer.cstring()
sql.postgres.messages.Writer.cstring(value: string) -> Writer
Appends a string and the zero byte that ends it.
Parameters
value(string)
Returns Writer
Writer.raw()
sql.postgres.messages.Writer.raw(values: list) -> Writer
Appends raw bytes.
Parameters
values(list)
Returns Writer
Writer.length()
sql.postgres.messages.Writer.length() -> number
How many bytes the body holds so far.
Returns number
Writer.frame()
sql.postgres.messages.Writer.frame(tag) -> bytes
The finished message, ready to send.
Parameters
tag(string|nil) — The message’s tag, or nil for a startup message, which has none.
Returns bytes
Reader
class sql.postgres.messages.Reader
Reads framed messages from a connected stream.
Works over a plain TcpStream or a TlsStream without caring which,
since both read the same way.
Constructor
sql.postgres.messages.Reader(stream)
Parameters
stream(TcpStream|TlsStream) — An already-connected stream.
Reader.upgrade()
sql.postgres.messages.Reader.upgrade(stream)
Swaps the stream, for the point in the handshake where a plain connection becomes a TLS one.
Parameters
stream(TlsStream)
Reader.read_exact()
sql.postgres.messages.Reader.read_exact(count: number) -> bytes
Reads exactly count bytes, waiting for as many as it takes.
Parameters
count(number)
Returns bytes
Raises ConnectionError if the server closes first.
Reader.read_message()
sql.postgres.messages.Reader.read_message() -> dict
Reads the next message.
Returns dict — { tag, payload }
2026, Richard Ore and Zuri contributors