# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic
Versioning](https://semver.org/spec/v2.0.0.html).

## [0.36.2] - 2025-11-28

### Fixed

- Fixed text decoding for `NaiveTime` and `SystemTime`. [#358]

## [0.36.1] - 2025-11-24

### Changed

- Add and correct more implements of `FromSqlText`: new implementations are
  added for `Vec<Option<T>>` where T is `FromSqlText`. Corrected parsing for
  timestamp and date types. [#353]

## [0.36.0] - 2025-11-21

### Changed

- Client provided parameter types are now stored as `Vec<Option<Type>>`. If
  the OID of client provided type is 0, we use `None` here. Previously we will
  default to `UNKNOWN` type but it has different semantics. [#350]
- Extended query parameter parsing now respects format code, we will use
  `FromSqlText` to parse those types encoded as text. More type to be supported
  for `FromSqlText`. [#351]
- Unnamed portal is automatically dropped when execution finished [#348]

### Fixed

- Issue with client-api when decoding data [#347]

## [0.35.0] - 2025-11-05

### Added

- Customisible `DateStyle`, `IntervalStyle`, `extra_float_digits` support.

### Changed

- Updated `ToSqlText` and `FromSqlText` interface to include a new
  `FormatOptions` for postgres' additional options on text representation of
  some types.

## [0.34.2] - 2025-10-21

### Added

- Exposed more functions from `pgwire::tokio::server`. [#333]

### Changed

- Removed `BufReader` wrapper on socket [#332]

## [0.34.1] - 2025-10-20

### Changed

- Update `pg_type_*` feature flags to `pg-type-*` following our previous naming
  pattern. [#331]

## [0.34.0] - 2025-10-18

### Added

- Access SNI server name from `ClientInfo` [#323]
- Added encode API for `serde_json::Value`/json in postgres [#321]
- Added `Debug` to `Response` enum [#325]

### Changed

- No-op handlers now returns error [#319]
- Make `pgwire::tokio::server` public [#329]

### Fixed

- Potential busy loop with peeking data [#330]


## [0.33.0] - 2025-09-22

### Added

- Portal suspension support, aka server-side cursor in extended query. This
  feature allows client to send `Execute` with a `max_row` property to limit how
  many rows to return. Client can send further `Execute` against the same portal
  until all rows returned. [#303]

### Changed

- Simplified and removed lifetime specifier from `Response` and
  `QueryResponse`. Breaking change.
- Changed SCRAM authentication implementation. SASL is now a framework to
  support multiple authentication mechanisms. Breaking change. [#302]
- Added `Send` to client in `StartupHandler`.
- Added `Debug` requirement for `AuthSource`.

### Removed

- `scram` feature is removed, it's enabled with either of `ring` or `aws-lc-rs`
  is on.

## [0.32.1] - 2025-08-12

### Fixed

- Correct packet length check [#295]
- Potential panic on direct TLS when it is not configured [#296]
- Timeout on getting startup message on Windows [#297]

## [0.32.0] - 2025-08-07

### Added

- Added support for GSSAPI handshake. This fixes connection issue with psql 14
  homebrew on Mac. [#290]
- Added authentication timeout (60s). Unauthenticated connection will be dropped
  after timeout. [#293]
- Added validation on packet length. [#292]

### Changed

- Corrected typo for `MESSAGE_TYPE_BYTE_PASSWORD_MESSAGE_FAMILY`

## [0.31.1] - 2025-07-31

### Added

- The default implementation of `SimpleQueryHandler#on_query`,
  `ExtendedQueryHandler#on_execute` and `ExtendedQueryHandler#on_describe` and
  moved to `SimpleQueryHandler#_on_query`, `ExtendedQueryHandler#_on_execute`
  and `ExtendedQueryHandler#_on_describe`. This allows you to reuse the
  implementation in your own `on_query`/`on_execute`/`on_describe` without
  copying the code. [#287]

### Fixed

- `NegotiateProtocolVersion` code and member visibility [#288]

## [0.31.0] - 2025-07-04

### Added

- Initial support for Postgres 18 new proptocol version 3.2, and protocol
  negotiation for future protocol upgrades [#281]
- CancelRequest message and initial (unstable) API, made backend key and secret
  key configurable by user [#266] [#267]

### Changed

- Updated `PgWireServerHandlers` to use `impl trait` style return value, this
  allow us to define default implementation easier, which requires less
  boilerplate code. [#269]
- Updated message decode functions to take an additional `DecodeContext`. It
  provides some state information like protocol version, connection state, with
  which we can not decode `SslRequest`, `Startup` messages in the `decode`
  function. [#282]
- Using `arrow-pg` crate for duckdb example [#273]

## [0.30.2] - 2025-06-03

### Changed

- Add `QUOTE_CHECK` and `QUOTE_ESCAPE` back to types public APIs [#264]

## [0.30.1] - 2025-05-28

### Changed

- Set chrono version to `0.4` as we don't require features in `0.4.40`

## [0.30.0] - 2025-05-28

### Changed

- Lifetime specifier of do_query methods in query handlers, it doesn't have to
  be same with query input at all [#260]
- Provide `ClientInfo` to `QueryParser` for context-aware parsing [#263]

### Fixed

- Scram authentication failure error [#257]

## [0.29.1] - 2025-05-21

### Changed

- Released version restrictions on chrono [#259]

## [0.29.0] - 2025-05-07

### Added

- New API `client_certificates` in `ClientInfo` for retrieving clietn
  certificate information. [#255]
- A few unfinished client API. These APIs are disabled with feature gate by
  default.

### Changed

- Reverted API change for optional TLS feature introduced in 0.27. Now the API
  signature stays unchanged when TLS disabled, you will still need to pass
  `None` as `TlsAcceptor` in `process_socket`. [#228]
- Previously we treat all error as fatal internal error but some of them are due
  to client invalid input. This version corrected this and return `ERROR` for
  these type of errors. [#240]
- For direct SSL negotiation, we now check ALPN strictly. [#243]
- Changed default server_version format for compatibility. [#233]

### Fixed

- Avoid panic for `get_string` on empty buffer [#247]


## [0.28.0] - 2024-12-07

### Added

- `ErrorHandler` for centralized error processing [#222]

### Changed

- `PgWireHandlerFactory` is renamed to `PgWireServerHandlers` to avoid
  confusion. This trait doesn't require generating new instance for each
  call. [#226]

### Fixed

- Text encoding for bytea type [#224]

## [0.27.0] - 2024-11-30

### Added

- `on_flush` handler for extended query handler [#220]

### Fixed

- `Parse` message encoding [#219]

### Changed

- MSRV to 1.75
- Made TLS an optional feature. `server-api` now provides no TLS functionality
  [#218]


## [0.26.0] - 2024-11-02

### Added

- New `Response` type for transforming transaction state: `TransactionStart` and
  `TransactionEnd`. [#200]

### Fixed

- oid output for tags [#211]
- array type serialization [#212]

### Changed

- Update MSRV to 1.74
- Breaking: Rewrite `NoopStartupHandler` to be a trait. You can provide an empty
  implementation to keep original behaviour. And it's now possible to customize
  some behaviour by adding a `post_startup` implementation.

## [0.25.0] - 2024-09-28

### Fixed

- Dead-loop when client connects without send packets or sending insufficient
  bytes [#206], [#207]

### Changes

- Removed unneeded `Arc` for handler factory [#202]
- `PgWireFrontendMessage::SslRequest` now carries an optional `SslRequest`
  message where `None` indicates the client doesn't issue `SslRequest` and
  starts directly. [#207]
- Add `AwaitingSslRequest` state. [#207]

## [0.24.2] - 2024-09-14

### Fixed

- Array encoding issues for date and time types [#194]
- String array quote and escape [#198]

## [0.24.1] - 2024-08-06

### Fixed

- Codec error when decoding authentication messages [#190]
- Codec error when decoding parameters larger than 32767 [#192]
- Panic when client sends invalid authentication message type [#191]

## [0.24.0] - 2024-08-03

### Added

- `ToSqlText` support for `Decimal` [#186]
- Direct SSL startup, a new feature introduced in PostgreSQL 17. It allows
  ssl handshake once tcp connected, which saves a roundtrip on secure connection
  startup. [#189]

### Changed

- Improvement our API for COPY. [#185]
  - Added `CopyInProgress` for `PgWireConnectionState` to track connection in
    COPY
  - Changed `on_copy_fail` in `CopyHandler` to return an `Error` as Postgres
    document specified.
  - Corrected behaviour for error handling when COPY is initialized via extended
    subprotocol.

## [0.23.0] - 2024-06-14

### Added

- New `CopyHandler` API for processing postgres `COPY`-in operations.

### Changed

- Updated the API of `pgwire::tokio::process_socket` to accept new
  `PgWireHandlerFactory` instead of each subprotocol handler individually, to
  keep API clean, also reduce some of boilerplate code.
- `MakeHandler` trait and its implementation are removed. You will need to
  implement those logic with new `PgWireHandlerFactory`. For stateful handlers,
  like most `ExtenededQueryHandler` implementations, it need to be created for
  every call to `extended_query_handler`. For stateless ones, it can be cached.

### Fixed

- Include API usage on random nonce generate [#182]


## [0.22.0] - 2024-04-29

### Changed

- SCRAM authenticator is now an optional feature that is turned off by
  default. To use SCRAM authenticator, add feature flag `scram`. [#180]
- `aws-lc-rs` based crypto backend is the default when using TLS or SCRAM. Use
  `default-features=false` and `server-api-ring` to use the ring backend. [#179]
- Use `default-features=false` if you only uses message codecs from this
  library. [#177]
- BREAKING CHANGE: ready state code is now presented in enum
  `TransactionStatus`. There is an update of `ReadyForQuery`'s `new`. [#176]

### Fixed

- panic when decoding SASL messages [#175]

## [0.21.0] - 2024-04-18

### Added

- You can now customize command tag for `QueryResponse`. [#173]

### Fixed

- Text representation of NULL values in array, and bool values are now fixed to
  align with postgres. [#174]

## [0.20.0] - 2024-03-17

### Changed

- Changed `do_describe` API from `ExtendedQueryHandler` to more specific
  `do_descirbe_statement` and `do_describe_portal`. This is a breaking change,
  see sqlite example for how to migrate. [#164]
- Improved performance of `DataRowEncoder`, updated how we store data in
  `DataRow`. Breaking change for message layer users. [#165] [#166]

## [0.19.2] - 2024-01-31

### Fixed

- Error on `Parse` command when using pgcli client [#152]
- Remove `'static` bound for handler implementations [#149]

## [0.19.1] - 2024-01-14

### Fixed

- Simple query client blocks on error [#148]

## [0.19.0] - 2024-01-08

### Changed

- Updated `Tag` constructors for including ObjectID. [#147]
- Removed some getters and setters, use direct field access. [#144]

### Fixed

- Message sequences fixes [#145] [#146]

## [0.18.0] - 2023-12-23

### Changed

- Associated `PortalStore` to client as how PostgreSQL is designed. This is a
  regression design issue introduced in `0.8`.

## [0.17.0] - 2023-12-07

### Added

- Added `SslRequest` and `SslResponse` message [#116] [#117]
- Added `NotificationResponse` message for Postgres `LISTEN/NOTIFY` feature
  [#136]
- Added encoding support for array data type [#130]

### Changed

- Allow sending custom message from `SimpleQueryHandler` by changing `Client`
  reference to mutable [#133]
- Updated tokio-rustls to 0.25 [#135]
- Using `feed` for sending response [#128]

## [0.16.1] - 2023-09-28

### Fixed

- Fixed message decode for `flush` [#113]
- Add a fix for potential panic on `startup`. [#112]

## [0.16.0] - 2023-08-04

### Changed

- Changed `Portal::parameter` function to require a `&Type` argument for
  deserialization. Previously we relies on client specified types but it doesn't
  work when the client driver requires type inference on server-side. The new
  function signature allows you to provide an type. [#106]
- Changed `DefaultServerParameterProvider` API to allow modification of built-in
  parameters. [#97]

## [0.15.0] - 2023-06-23

### Added

- Codecs for `Copy` messages. [#91]

### Changed

- Made `parse_sql` from `QueryParser` an async function because some
  implementation requires async operation [#96]

## [0.14.1] - 2023-06-01

### Fixed

- Corrected how server handler responds `Sync` message. Fixed compatibility with
  rust sqlx client. #90

## [0.14.0] - 2023-05-04

### Added

- Exposed `send_describe_response` and `send_execution_response` as helper
  functions for custom `ExtendedQueryHandler` implementation.

### Changed

- `tcp_nodelay` is turned on by default within pgwire for performance
  consideration.
- Changed getters of `QueryResponse` to return owned data.

## [0.13.1] - 2023-04-30

### Added

- A new helper function `send_query_response` is added for convenience of custom
  query handler implementation

## [0.13.0] - 2023-04-08

### Added

- Message `NoData` that sends from backend when `Describe` sent on an empty
  query.
- Add `EmptyQuery` to `Response` enum to represent response for empty query.
- Add `no_data` constructor to `DescribeResponse` for empty query.

### Changed

- Improved empty query check for `SimpleQueryHandler`. #75

## [0.12.0] - 2023-03-26

### Added

- `ToSqlText` trait and default implementation for some types. This trait is
  similar to `ToSql` from `postgres-types` package. It provide text format
  encoding while `ToSql` are binary by default.

### Changed

- Updated `DataRowEncoder` encode API with unified `encode_field` for both
  binary and text encoding. `DataRowEncoder::new` now accepts
  `Arc<Vec<FieldInfo>>` instead of column count. The encoder now has type and
  format information for each column. `encode_field` no longer requires `Type`
  and `FieldFormat`. A new `encode_field_with_type_and_format` is provided for
  custom use-case.
- Updated `do_describe` API from `ExtendedQueryHandler` to include full
  information about requested `Statement` or `Portal`.
- `query_response` function is replaced by `QueryResponse::new`

## [0.11.1] - 2023-02-26

### Fixed

- lifetime binding in `on_query` functions if the implementation has its own
  lifetime specifier

## [0.11.0] - 2023-02-26

Further improve extended query support. Now the server can respond statement
describe correctly.

### Added

- Add some docs.
- Add `integer_datetimes` parameter on startup so clients like jdbc will parse
  time types as integer.
- `DescribeResponse` that contains information for both `ParameterDescription`
  and `RowDescription`.

### Changed

- Update `do_describe` of `ExtendedQueryHandler`. Add new bool argument
  `inference_parameters` to check if parameter types from statement is required
  to return.
- Updated resultset `Response::QueryResponse` lifetime from `'static` to portal
  or query string, this allows reference of portal in stream.

### Fixed

- The default implementation of `ExtendedQueryHandler` now correctly responds
  `Close` message with `CloseComplete`
- Correct SCRAM mechanism name in plain connection

## [0.10.0] - 2023-02-08

This release reverts design to use `MakeHandler` in `process_socket`, since it
stops shared implementation between `StartupHandler` and query handlers.

### Changed

- Update `process_socket` to accept `StartupHandler`, `SimpleQueryHandler` and
  `ExtendedQueryHandler`. `MakeHandler` should be called upon new socket
  incoming. Check our updated examples for usage.
- Removed `Password`, `SASLInitialResponse` and `SASLResponse` from frontend
  message enum to avoid confusion. `PasswordMessageFamily` is now an enum that
  contains all these message forms and a raw form. This is because in postgres
  protocol, password message can only be decoded into concrete type when there
  is a context. See our MD5 and SCRAM authenticator for usage.

## [0.9.1] - 2023-02-02

Fixes compatibility with rust-postgres client's prepared statement
implementation. It sends Parse-Describe-Sync on `Client::prepare_typed`.

### Fixed

- `Parse` and `Bind` completion response is now fixed
- Responding statement describe request with parameter description, and ready
  for query

## [0.9.0] - 2023-02-01

### Changed

- Updated `QueryParser` API to provide parameter types for implementation.
- Updated `Portal` API, it now holds `Arc` reference to related
  `StoredStatement`.
- Updated `ExtendedQueryHandler::do_describe` arguments, it now takes a borrowed
  `StoredStatement`. Compared to previews API, parameter types are provided as
  well.
- Renamed `StoredStatement::type_oids()` to `parameter_types()`

## [0.8.0] - 2023-01-29

### Changed

- `ExtendedQueryHandler` trait now has two new component: `PortalStore` and
  `QueryParser`. `PortalStore` replaced statement and portal cache on
  `ClientInfo`, these data will now be cached with `PortalStore` from
  `ExtendedQueryHandler` implementation.
- A default `PortalStore` implementation, `MemPortalStore`, is provided for most
  usecase.
- `Statement` API now renamed to `StoredStatement`. The new API holds parsed
  statement from `QueryParser` implementation.
- `Portal` API, like it's statement counterpart, no longer stores statement as
  string, it shares same statement type with `StoredStatement`, `QueryParser`
  and `ExtendedQueryHandler`.
- `PasswordVerifier` and `AuthDB` are now merged into `AuthSource` API. The new
  API asks developer to fetch password and an optional salt. The password can
  either be hashed or cleattext, depends on which authentication mechanism is
  used.

### Added

- `SCRAM-SHA-256-PLUS` authentication is supported when you provide server
  certificate.
- `do_describe` is added to `ExtendedQueryHandler`, now it's possible to
  `Describe` a statement or portal without execution. The implementation is also
  required to be capable with this.
- `DefaultServerParameterProvider` implementation is provided to include minimal
  parameters for JDBC and psycopg2 working.
- `PlaceholderExtendedQueryHandler` to simplify example and demo when extended
  query is not supported.
- `Flush` message added. @penberg
