Version 5.4.6

Released on 2023-11-30.


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

We recommend that you upgrade to the latest 5.3 release before moving to 5.4.6.

A rolling upgrade from 5.3.x to 5.4.6 is supported. Before upgrading, you should back up your data.


Tables that were created before CrateDB 4.x will not function with 5.x and must be recreated before moving to 5.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 5.4.0 release notes for a full list of changes in the 5.4 series.


  • Fixed an issue that caused queries with a NOT expression in the WHERE clause to fail evaluating NULL correctly.

  • Fixed an issue that caused the value for generated primary key columns to evaluate to NULL in INSERT INTO .. ON CONFLICT statements if the column wasn’t part of the target column list.

  • Creating a table that uses a table-function as part of a default expression or generated expression now results in an error on table creation, instead of never inserting records due to runtime failures.

  • Improved the error message when using COPY FROM with wait_for_completion=false and RETURN SUMMARY. It now reports that the combination is not supported instead of running into a ClassCastException.

  • Fixed an issue that caused queries with a NOT (a AND b) expression in the WHERE clause to not evaluate correctly with NULL values.

  • Fixed an issue that caused queries with a NOT or != on a CASE expression containing a nullable column to exclude NULL entries.

  • Fixed an issue that caused the hash-join operator generate invalid hashes which lead to a broken join operation when there were more than two relations involved e.g.::

    SELECT * FROM t1, t2, t3 WHERE t3.c = t1.a AND t3.c = t2.b AND t1.a = t2.b;

    would generate the logical plan::

    HashJoin[(t3.c = t2.b AND t1.a = t2.b)]
      ├ HashJoin[(t3.c = t1.a)]
      │  ├ Collect[doc.t3 | [c] | true]
      │  └ Collect[doc.t1 | [a] | true]
      └ Collect[doc.t2 | [b] | true]

    The hash-symbol generation for the join t3.c = t2.b AND t1.a = t2.b was broken and would not join the data.