Version 6.4.6

Released on 2026-10-08.

Note

If you are upgrading a cluster, you must be running CrateDB 5.0.0 or higher before you upgrade to 6.4.6.

We recommend that you upgrade to the latest 6.3 release before moving to 6.4.6.

A rolling upgrade from >= 6.3.0 to 6.4.6 is supported. Before upgrading, you should back up your data.

Warning

Tables that were created before CrateDB 5.x will not function with 6.x and must be recreated before moving to 6.x.x.

You can recreate tables using COPY TO and COPY FROM or by inserting the data into a new table.

Table of contents

See the Version 6.4.0 release notes for a full list of changes in the 6.4 series.

Fixes

  • Fixed an issue that could cause PostgreSQL wire protocol clients to receive an error like server sent data ("D" message) without prior row description ("T" message) if executing write operations followed by a read operation using pipelining.

  • Fixed an issue that could cause = ANY (...) or IN (...) expressions to fail on columns of type UUID or NUMERIC.

  • Fixed a rounding error if casting timestamp or long values before 1970-01-01 to date.

  • Fixed an issue that caused order-sensitive aggregations (string_agg, array_agg) applied on top of UNION ALL ... ORDER BY to return incorrect results.

  • Fixed an issue that could cause window functions using RANGE with integral PRECEDING/FOLLOWING bounds to compute frames incorrectly due to boundary overflow.

  • Fixed incorrect RANGE and ROWS window frames caused by overflow when large frame bounds were narrowed before evaluation. Explicit NULL frame bounds and negative ROWS offsets now raise an error.

  • Fixed an issue that caused CREATE SNAPSHOT to fail if repository had at least one snapshot created before and backend storage’s DELETE API was temporarily unavailable.

  • Fixed an issue that caused NULL to always be returned for numeric_scale of information_schema.columns table. Now it returns the defined scale for NUMERIC, 0 for integral numeric types (BYTE, SHORT, INTEGER, LONG) and NULL for all other types.

  • Fixed an issue, introduced with Version 6.3.0, which caused RESTORE SNAPSHOT to always restore all foreign tables contained in the snapshot, even if they weren’t requested. Foreign tables are now only restored together with their servers, e.g. by using RESTORE SNAPSHOT ... ALL or RESTORE SNAPSHOT ... METADATA. A foreign table restored explicitly with RESTORE SNAPSHOT ... TABLE doesn’t restore its server and user mappings, so it’s unusable unless they already exist or created manually.

  • Fixed a rare race condition causing the query CircuitBreaker’s state not to be reset after KILL or CircuitBreakingException, and leading to consequent queries to fail with false positive CircuitBreakingException.

  • Fixed a race condition in EXPLAIN ANALYZE that could cause an intermittent NullPointerException.

  • Fixed an issue that could cause logical replication of new partitions to fail after restarting publisher nodes.

  • Fixed an issue that caused pg_catalog.pg_publication and pg_catalog.pg_publication_tables to only show the publications owned by the current user, even for superusers and users with the AL privilege. Superusers and users with AL can now see all publications.

  • Fixed an issue that caused a > or >= comparison on the distance function in a WHERE clause, e.g. WHERE distance(p, 'POINT (0 0)') > 100, to also match rows where the GEO_POINT column p is NULL.

  • Fixed an issue that caused WHERE distance(p, ...) IS NULL to fail with an IndexOutOfBoundsException, and comparisons like WHERE distance(p, NULL) > 100 to fail with a NullPointerException.

  • Fixed an issue where ORDER BY using a REAL or DOUBLE PRECISION column returned values of Infinity as NULL.

  • Fixed a performance regression introduced in Version 6.4.3 that affected all queries running over HTTP protocol with password authentication.

  • Fixed an issue where rows with NaN were not returned when a range filter was used and the predicate evaluated to true

  • Fixed an issue that caused HTTP requests authenticated without an Authorization header, e.g. using client certificate authentication, to run as the user set by auth.trust.http_default_user (crate by default) instead of the authenticated user.