Сводка изменений по сравнению с протоколом версии 2.0
В этом разделе представлен краткий список изменений, который может быть полезен разработчикам, желающим обновить существующие клиентские библиотеки до протокола 3.0.
В начальном пакете автозапуска вместо фиксированного формата используется гибкий формат списка строк. Обратите внимание, что сеансовые значения по умолчанию для параметров времени выполнения теперь можно задать непосредственно в пакете автозапуска. (На самом деле это можно было сделать и раньше, используя поле options, но, учитывая ограниченную ширину options и отсутствие способа заключить пробелы в значениях в кавычки, этот метод был не очень безопасным.)
Теперь в всех сообщениях сразу за байтом типа сообщения идет счетчик длины (за исключением пакетов автозапуска, в которых нет байта типа). Также обратите внимание, что байт типа теперь есть в сообщении PasswordMessage.
Сообщения ErrorResponse и NoticeResponse ('E' и 'N') теперь содержат несколько полей, из которых клиентский код может собрать сообщение об ошибке желаемого уровня детализации. Обратите внимание, что отдельные поля скорее всего не будут завершаться переводом строки, тогда как в старом протоколе одиночная строка всегда завершалась так.
Сообщение ReadyForQuery ('Z') включает индикатор статуса транзакции.
Различие между типами сообщений BinaryRow и DataRow исчезло; один тип сообщений DataRow служит для возвращения данных во всех форматах. Обратите внимание, что структура DataRow была изменена для упрощения его синтаксического анализа. Кроме того, изменилось представление двоичных значений: оно больше не привязано к внутреннему представлению сервера.
В протоколе появился новый подчиненный «протокол расширенных запросов», который добавляет типы клиентских сообщений Parse, Bind, Execute, Describe, Close, Flush и Sync, а также типы серверных сообщений ParseComplete, BindComplete, PortalSuspended, ParameterDescription, NoData и CloseComplete. Существующие клиенты не обязаны подстраиваться под этот подчиненный протокол, но вполне вероятно, что его применение позволит улучшить производительность или функциональность.
Данные COPY теперь заключаются в сообщения CopyData и CopyDone. Существует четко
определенный способ восстановления в случае ошибок в процессе выполнения COPY.
Специальная последняя строка «\.» больше не нужна и не передается во время
COPY OUT. (Она по-прежнему распознается как завершающая при COPY IN, но
считается устаревшей и в итоге будет убрана.) Поддерживается COPY в двоичном
режиме. Сообщения CopyInResponse и CopyOutResponse включают поля, показывающие
количество столбцов и формат каждого столбца.
Изменилась структура сообщений FunctionCall и FunctionCallResponse. Сообщение FunctionCall теперь поддерживает передачу функциям аргументов NULL. Также в нем могут передаваться параметры и возвращаться результаты в текстовом или двоичном формате. Больше нет причины считать сообщение FunctionCall потенциальной брешью в безопасности, поскольку оно не дает прямого доступа к внутренней презентации данных на сервере.
Сервер передает сообщения ParameterStatus ('S') при запуске подключения для всех параметров, которые он считает интересными для клиентской библиотеки. Впоследствии при любом изменении активного значения одного из этих параметров тоже передается сообщение ParameterStatus.
Сообщение RowDescription ('T') содержит новые поля с OID таблицы и номером столбца для каждого столбца описываемой строки. Кроме того, в нем выводится код формата для каждого столбца.
Сервер больше не генерирует сообщение CursorResponse ('P').
В сообщение NotificationResponse ('A') добавилось строковое поле, в котором
может содержаться строка «информационного наполнения», передаваемая отправителем
события NOTIFY.
Раньше сообщение EmptyQueryResponse ('I') включало пустой строковый параметр; он был удален.