PostgreSQL wire protocol

PostgreSQL protocol v3 — бинарный TCP-протокол для общения с PostgreSQL (порт 5432). Не HTTP, не JDBC-магия — простое сообщение-ориентированное поверх TCP.

Startup

Клиент → сервер: StartupMessage {
  protocolVersion: 196608 (3.0),
  user: "vasya",
  database: "shop"
}

# опционально TLS
Клиент → сервер: SSLRequest
Сервер → клиент: 'S' (SSL supported) или 'N'
[TLS handshake]

# аутентификация
Сервер → клиент: AuthenticationSASL / MD5 / cleartext
Клиент → сервер: SASLInitialResponse / PasswordMessage
Сервер → клиент: AuthenticationOk + ParameterStatus + BackendKeyData

Format сообщения

| 1 byte type | 4 byte length | payload |

# пример Query
'Q' | 0x00000018 | "SELECT * FROM users;\0"

Simple Query

C → S: Query "SELECT id, name FROM users;"

S → C: RowDescription { fields: [{name:"id",type:23}, {name:"name",type:25}] }
S → C: DataRow ["1", "Vasya"]
S → C: DataRow ["2", "Petya"]
S → C: CommandComplete "SELECT 2"
S → C: ReadyForQuery 'I'  # idle

Extended Query (prepared statements)

C → S: Parse    stmt="s1" query="SELECT * FROM users WHERE id=$1"
C → S: Bind     portal="p1" stmt="s1" params=[42]
C → S: Describe portal="p1"
C → S: Execute  portal="p1"
C → S: Sync

S → C: ParseComplete
S → C: BindComplete
S → C: RowDescription
S → C: DataRow
S → C: CommandComplete
S → C: ReadyForQuery

Плюсы: защита от SQL-injection (значения отдельно от текста), кеш планов на сервере.

COPY protocol

Быстрая массовая загрузка/выгрузка, минует SQL-парсинг:

C: Query "COPY users FROM STDIN"
S: CopyInResponse
C: CopyData "1\tVasya\n"
C: CopyData "2\tPetya\n"
C: CopyDone

Cancel Request

Отдельное соединение с backend-secret → отменить запрос без разрыва основного соединения.

Аутентификация

Реализации не-Postgres

Совместимость на уровне протокола = обычные psql-клиенты подключаются:

См. также

← на главную