Breaking behavior
* The tile extent can now be set to null, in which case internally TileDB sets the extent to the dimension domain range. [1880](https://github.com/TileDB-Inc/TileDB/pull/1880)
* The C++ API `std::pair<uint64_t, uint64_t> Query::est_result_size_var` has been changed to 1) a return type of `std::array<uint64_t, 2>` and 2) returns the offsets as a size in bytes rather than elements. [1946](https://github.com/TileDB-Inc/TileDB/pull/1946)
New features
* Support for nullable attributes. [1895](https://github.com/TileDB-Inc/TileDB/pull/1895) [#1938](https://github.com/TileDB-Inc/TileDB/pull/1938) [#1948](https://github.com/TileDB-Inc/TileDB/pull/1948) [#1945](https://github.com/TileDB-Inc/TileDB/pull/1945)
* Support for Hilbert order sorting for sparse arrays. [1880](https://github.com/TileDB-Inc/TileDB/pull/1880)
* Support for AWS S3 "AssumeRole" temporary credentials [1882](https://github.com/TileDB-Inc/TileDB/pull/1882)
* Support for zero-copy import/export with the Apache Arrow adapter [2001](https://github.com/TileDB-Inc/TileDB/pull/2001)
* Experimental support for an in-memory backend used with bootstrap option "--enable-memfs" [1873](https://github.com/TileDB-Inc/TileDB/pull/1873)
* Support for element offsets when reading var-sized attributes. [1897] (https://github.com/TileDB-Inc/TileDB/pull/1897)
* Support for an extra offset indicating the size of the returned data when reading var-sized attributes. [1932] (https://github.com/TileDB-Inc/TileDB/pull/1932)
* Support for 32-bit offsets when reading var-sized attributes. [1950] (https://github.com/TileDB-Inc/TileDB/pull/1950)
Improvements
* Optimized string dimension performance.
* Added functionality to get fragment information from an array. [1900](https://github.com/TileDB-Inc/TileDB/pull/1900)
* Prevented unnecessary sorting when (1) there is a single fragment and (i) either the query layout is global order, or (ii) the number of dimensions is 1, and (2) when there is a single range for which the result coordinates have already been sorted. [1880](https://github.com/TileDB-Inc/TileDB/pull/1880)
* Added extra stats for consolidation. [1880](https://github.com/TileDB-Inc/TileDB/pull/1880)
* Disabled checking if cells are written in global order when consolidating, as it was redundant (the cells are already being read in global order during consolidation). [1880](https://github.com/TileDB-Inc/TileDB/pull/1880)
* Optimize consolidated fragment metadata loading [1975](https://github.com/TileDB-Inc/TileDB/pull/1975)
Bug fixes
* Fix tiledb_dimension_alloc returning a non-null pointer after error [1959]((https://github.com/TileDB-Inc/TileDB/pull/1859)
* Fixed issue with string dimensions and non-set subarray (which implies spanning the whole domain). There was an assertion being triggered. Now it works properly.
* Fixed bug when checking the dimension domain for infinity or NaN values. [1880](https://github.com/TileDB-Inc/TileDB/pull/1880)
* Fixed bug with string dimension partitioning. [1880](https://github.com/TileDB-Inc/TileDB/pull/1880)
API additions
C API
* Added functions for getting fragment information. [1900](https://github.com/TileDB-Inc/TileDB/pull/1900)
* Added APIs for getting and setting ranges of queries using a dimension name. [1920](https://github.com/TileDB-Inc/TileDB/pull/1920)
C++ API
* Added class `FragmentInfo` and functions for getting fragment information. [1900](https://github.com/TileDB-Inc/TileDB/pull/1900)
* Added function `Dimension::create` that allows not setting a space tile extent. [1880](https://github.com/TileDB-Inc/TileDB/pull/1880)
* Added APIs for getting and setting ranges of queries using a dimension name. [1920](https://github.com/TileDB-Inc/TileDB/pull/1920)
* Changed `std::pair<uint64_t, uint64_t> Query::est_result_size_var` to `std::array<uint64_t, 2> Query::est_result_size_var`. Additionally, the size estimate for the offsets have been changed from elements to bytes. [1946](https://github.com/TileDB-Inc/TileDB/pull/1946)