CedarDB Releases
Current Release
You can automatically install the latest release using our helper script:
curl https://get.cedardb.com | bashOr use the CedarDB Docker container:
docker pull cedardb/cedardbFor manual download, please choose the correct version for your system:
| System | AMD64 | ARM64 |
|---|---|---|
| current | cedar-current-amd64.tar.xz | cedar-current-arm64.tar.xz |
| legacy (<22.04) | cedar-legacy-amd64.tar.xz | cedar-legacy-arm64.tar.xz |
13 May 2026
New Features
- Extend generate_series to support numerics.
- Introduce possibility to set compression settings on table level.
- Use ARM neon vector instructions for vectorized execution of integer table scan predicates on ARM machines.
Performance
- Improve WAL truncation logic by taking available disk space into account, leading to higher sustained transactional throughput for most deployments.
- Reduce buffer manager contention under high load, increasing the stability of transactional throughput.
- Optimize prefix comparisons with substr(), which can now use indexes.
PostgreSQL Compatibility
- Change return type of EXTRACT(EPOCH FROM interval '<interval>') from double precision to numeric.
- Implement json_arrayagg support.
- Ensure table oids remain unchanged when using ALTER TABLE.
Maintenance
- Fix an index corruption when merging pages with large strings.
- Fix a bad optional access in an edge case when re-optimizing prepared statements containing an index scan.
- Fix missing results for long strings with filter optimization.
- Fix an issue where running cheap queries in a hot loop could lead to large memory allocations.
- Fix a bug in recovery when remote servers were dropped.
- Fix potential live locks in the buffer manager due to stale index structures.
- Fix duplicated ordinality results of generate_series and invalid lockstep execution of generate_series in combination with other set returning functions.
- Set columns that are changed to be a primary key via ALTER TABLE to not nullable.
- Correct column names in the cedardb_compression_infos system view.
Older Versions
v2026-04-27
27 Apr 2026New Features
- Add json_agg and json_build_array functions.
Maintenance
- Fix rare cases of livelocks occurring under high insert load on partitioned tables.
- Remove hidden system columns like ctid from row outputs.
- Fix a bug in foreign key constraint checks when column order differs between the referenced and referencing table.
- Fix output of internal helper function pg_relation_is_updatable.
- Fix crash on BEGIN TRANSACTION statement in interactive mode.
v2026-04-20
20 Apr 2026New Features
- Add support for ALTER FUNCTION statement.
- Add support for pg_stat_database system table.
- Add support for one-level ON UPDATE CASCADE on foreign keys.
- Release storage space to the OS with VACUUM (TRUNCATE).
- Reclaim pages of indexes and tables after ALTER TABLE statements.
PostgreSQL Compatibility
- Enable uint4, int4, uint8 and int8 return types for generate_series(...) based on input types.
- Fix pg_index.indclass entries.
- Result columns of multiple table functions are now evaluated in lock-step, replacing the cross product between results with a full outer join.
- Fix content of pg_class.reloptions system table column.
- Fix context field of pg_settings system table.
- Add class row types to pg_types and pg_class.reltype.
Maintenance
- Fix crash on invalid typemod inputs to pg_catalog.format_type.
- Fix a race condition that could lead to a crash during an index read.
- Defining views that depend on system tables no longer triggers an assert.
- Fix optimizer crash on large DELETE CASCADE.
- Fix unknown parameter type coercion for PREPARE statements that INSERT INTO non-null columns.
- Resolve several issues within nested recursive queries that could trigger timeouts and runtime errors.
- Fix inconsistency of owner of table and its dependent objects, e.g., indexes.
- Fix comparison of UUIDs greater than '7FFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF' in tablescans.
- generate_subscript now properly handles arrays with non-1-based lower bound.
- Replace dead link in error messages.
- Fix startup crash on Debian Bookworm due to wrong io_uring version check.
- Remove erroneous unlinkat warnings when deleting compressed data.
v2026-04-02
2 Apr 2026New Features
- Add support for PostgreSQL-compatible role-based access control through GRANT and REVOKE.
- Add support for cascading deletes.
- Add support for input and output of array types in postgres binary format.
- Support if not exists in create role.
PostgreSQL Compatibility
- Improve implicit column names instead of returning '?column?'.
- Allow INSERT / UPDATE / DELETE in CTEs.
- Add support for simple create table like statements.
- Add support for CREATE OR REPLACE FUNCTION.
- Add support for the aclexplode function.
- Add support for the pg_get_functiondef function.
- DROP TABLE IF EXISTS does not error on invalid schemas any more.
- array_ndims and array_dims functions now return NULL for empty arrays with no dimensions.
- Fix oid functions to check the search path.
- Add additional information about foreign keys to pg_constraints system table.
- Fix conversion of char(1) with zero byte '\0' content to text and other types.
- length() function for character now returns the length of the stored character sequence instead of the precision of the type.
- Comparisons of text and varchar with character and char no longer strip whitespace from the right side of the string.
Maintenance
- Avoid No such file or directory warnings for connections via domain sockets.
- Fix database checkpoints potentially missing page modifications.
- Add parquet_scan and read_parquet alias for parquet_view.
- Fixes in parquet dictionary parsing and detection of malformed headers.
- Allow table-qualified expressions in ORDER BY clause in DISTINCT query (e.g. SELECT DISTINCT … ORDER BY t.col).
- Dropping a primary key constraint after at least one incoming foreign key constraint has been dropped no longer triggers an assert.
- UPDATE with RETURNING now properly returns table-qualified column references.
- Evaluating random() after an outer join no longer triggers an assert.
- Fix bug where multiple unnest() calls in a subquery could lead to an internal error.
- Update timezone information to timezone db version 2026a.
- Parquet: Read files with V2 headers and mixed compressed and uncompressed pages.
- Parquet handles files with missing dictionary offset correctly.
- Add a fallback path to avoid unable to allocate memory errors.
- Enable single-character split for non-matching regex in regexp_split_to_array.
v2026-03-19
19 Mar 2026New Features
- Add support for OVERRIDE SYSTEM VALUE and OVERRIDE USER VALUE for INSERT statements.
- Implement SEQUENCE NAME option for generated columns
- Add support for GENERATED ALWAYS AS IDENTITY columns.
- Implement pg_stat_activity.
- Implement pg_stat_ssl.
- Improve hinting for common error situations.
Performance
- Improve the performance of table scans with compressed data ~5 %.
PostgreSQL Compatibility
- Add support for pg_get_serial_sequence function.
- Allow for non-constant inputs in sequence functions, e.g., PREPARE nextseq as SELECT nextval($1).
- Implement pg_backend_pid().
- Implement pg_stat_get_activity().
- Align system table column types with postgres system table column types.
- Fix output of pg_show_all_settings to improve compatibility with pgAdmin.
- Fix entries of columns attidentity, atthasdef and attgenerated in pg_attribute system table.
Maintenance
- Fix parsing legacy parquet files without nullability statistics and dictionary encoding.
- Parquet Reader accepts files with wrong Page Metadata written by DuckDB until 2024.
- Reduce log-noise in docker image caused by health check queries.
- Fix cases of timestamps with timezone overeagerly converting to daylight savings time on the day of a DST switch.
- Fix an error where INSERT INTO x DEFAULT VALUES did not insert a row.
- Change generate_subscripts function return type to int32.
- Fix JSON representation of arrays with lower bounds other than 1.
- Fix a bug where the ordinality result column of unnest(array) WITH ORDINALITY was not usable in outer operators.
- Fix ALTER TABLE ... ADD COLUMN ... DEFAULT ... with different column and default value types.
- Fix printing enum columns to CSVs.
v2026-03-03
3 Mar 2026New Features
- Support FORCE_NULL and FORCE_NOT_NULL options for COPY FROM.
- Add support to expand '*' in file names, e.g., SELECT col1, col2 FROM 'part*.parquet'.
- Add brotli decompresion support to parquet.
- Add process_sql for data preloading with docker init scripts.
Performance
- Decrease memory footprint of new connections
PostgreSQL Compatibility
- Add support for named primary key, foreign key and unique constraints in CREATE TABLE and ALTER TABLE statements.
Maintenance
- Add version information of subcomponents to cedardb -version command line output
- Fix missing results for open range predicates answered through index scans on columns with custom null ordering, i.e., x < 3 on an index with x ASC NULLS FIRST.
- Enable row_to_json to accept composite type expansions, like table.*.
- Fix a rare race condition that left duplicates in primary index by concurrent `INSERT INTO .. ON CONFLICT .. DO UPDATE` patterns that updated the same key.
- Add proper handling for unsupported named check constraints in ALTER TABLE ADD CONSTRAINT <name> CHECK <...>.
- Fix rare snapshot inconsistency with high number of short-lived concurrent connections.
- Fix cotd and cot behavior for multiples of 180 degrees.
- Fix nullability behavior of text similarity functions.
- Fix an assertion that triggered during optimization of recursive cte's with unused columns.
- Fix unnesting of row expressions in complex queries.
v2026-02-18
18 Feb 2026New Features
- CedarDB binary checks for current version.
Performance
- Replace internal UUID representation for better performance.
- Improved BigNumeric runtime performance.
- Improve performance of filters on boolean columns.
- Cardinality estimation for expressions on intervals is now more exact.
- Add partition pruning for IN and BETWEEN predicates.
- Speed up for FSST decompression.
PostgreSQL Compatibility
- Added support for pg_database_size().
- Ensure search path compatibility with PostgreSQL in a lot of edge cases.
- Fix quoting of identifiers in OID output, pg_get_indexdef and similar functions.
- Fix edge cases in parsing OIDs from schema-qualified object names and object names with reserved keywords.
- Use the same naming as PostgreSQL for types in Type-OID output and the format_type function.
- Added missing interval extraction functions: microsecond, millisecond, week, quarter, decade, century, millenium.
- Added support the postgres_verbose interval style.
- Accept NaN, -Infinity, Infinity as JSON literals.
Maintenance
- Fix a rare race condition that crashed recovery.
- Fix sequence naming for generated always columns of tables which name includes a " character.
- Fix a bug where comparison of int128 values in Numerics failed.
- Fix a bug in FSST compression that was caused by false positives when matching a byte sequence to symbols.
- Fix crash due to malformed WHERE clause in UPDATE and DELETE statements.
- Fixed bug that crashed the database when the current_schemas function was used with an invalid argument type.
- Reduce docker image size.
- Fix a crash during optimization of nested set operations.
- Fix a bug where the sign of an interval's month field was flipped when cast to a string.
- Comparison of intervals now normalizes intervals. The previous behavior lead to edge cases where '35 days' < '1 month'.
- Correctly handle overflows in interval multiplication and division.
- Out of bounds access error messages for bit fields now print the correct bounds.
- Fix ALTER TABLE ADD COLUMN IF NOT EXISTS.
- Fix crash when reoptimizing a prepared statement's join into an index join.
- Fix unnesting map operators for rare edge cases.
- Fix a rare race condition that corrupted indexes.
- Fix pg_advisory_lock with NULL inputs.
- Fix UUID ordering bug for UUIDs with most significant bit set to 1.
v2026-02-03
3 Feb 2026New Features
- Add gcd(int, int) and gcd(bigint, bigint) to calculate the greatest common divisor.
- CREATE INDEX and ALTER TABLE don't lock the entire database any more and can operate on different tables concurrently.
- The performance optimization BEGIN BULK WRITE is now obsolete and is replaced by automatic fine-grained locks within regular transactions. You can re-enable the bulk writer by setting usebulkwriter = true in your config file and restarting CedarDB.
Performance
- Fix an issue where escaped characters could result in a wrong CSV file line estimate affecting COPY efficiency.
Maintenance
- Fix parsing MATCH in CREATE TABLE statements.
- Fix a bug that prevented deleted compressed data from being freed on disk.
- Update CedarDB libraries and reduce size of the Docker image.
v2026-01-22
22 Jan 2026New Features
- Significantly improved compression for text columns using FSST with dictionary encoding.
- Add support for enums, allowing for the creation and use of labelling datatypes wherever required.
- Add built-in function hamming_distance, computing the hamming distance between two inputs of type bytea.
Performance
- Improve performance for hash joins with wide tables.
- Reduced versioning memory footprint when reinserting after mass deletes in a relation.
- Use finer-grained checks for prepared statement invalidation within a long-running transaction.
PostgreSQL Compatibility
- support ALTER DATABASE ... OWNER TO and RENAME TO.
- support ALTER TABLE DROP CONSTRAINT.
- support DROP DATABASE of empty databases.
Maintenance
- pg_constraints does not contain duplicates anymore if a table was altered.
- Fix missing tuples when scanning partitioned relations using an index.
- Invalidate and reprepare prepared statements affected by session setting changes.
- Reuse storage of deleted indexes.
v2026-01-15
15 Jan 2026Performance
- Late materialize result columns not used in the query for up to 1000x query speedup.
PostgreSQL Compatibility
- Add support for COPY (ON_ERROR ignore) to load CSVs on a best-effort basis.
- Support NegotiateProtocolVersion message for protocol version 3.2 introduced with Postgres 18.
- Synchronize CedarDB SQL parser grammar with Postgres 18.
- Support partitioned relations in psql description mode.
Maintenance
- Fix a rare segfault when accessing versions left by rollbacked transactions inserting and deleting same tuples in the same transaction.
- Fix a bug that could be triggered by an UPDATE ON CONFLICT with many columns.
- Prevent crash caused by strings exceeding 4 GB during query execution.
- Fix a bug where updating the partition key column could move tuples to the wrong partition.
- Fix a bug where we sent telemetry at a higher frequency than intended.
- Fix a bug in outer join null handling caused by the psql command \d TABLENAME.
- Fix return value of ascii function with empty string.
- Fix array concat with NULL.
- Fix handling null values when compressing two or more ALP compressed columns.
- Fix a bug that could be triggered when updating neighboring versions whose lifetimes differ.
- Fix a rare race condition when drop table maintenance task were running during shutdown.
v2025-12-19
19 Dec 2025New Features
- Add VACUUM (CHECK_INTEGRITY) to verify database integrity.
Performance
- Table scans on partitioned tables are now up to 1000 times faster.
- Improve performance of complex queries on system tables.
PostgreSQL Compatibility
- Support ALTER SEQUENCE OWNER TO.
Maintenance
- Fix missing default values in ALTER TABLE ADD COLUMN with specified default values.
- Fix a race condition where we loaded data with COPY to tables without writing their index entries.
- Fix incorrect empty results for index scans in partitioned relations when the partition key is not bound.
- Fix an issue during database shutdown that could cause some recently modified pages not to be persisted. This often manifested as missing index entries after restart.
- Fix a table corruption when a crash occurs shortly after a truncate.
- Fix a rare race condition when maintenance tasks were still running during shutdown.
- Running DROP TABLE in bulk transactions no longer disrupts concurrent readers.
- Fix pgAdmin4 metadata query resulting in no printed results.
- Fix columnar comparison of array values.
- Fix type coercion of ARRAY[NULL].
v2025-12-10
10 Dec 2025New Features
- Slice multi-dimensional arrays.
Performance
- Add compression for floating-point numbers (Adaptive Lossless Floating-Point Compression).
PostgreSQL Compatibility
- trim_array now correctly observes dimension offsets, i.e. trim_array([10:12]={1,2,3},2) now returns {2,3}.
- Treat ctid column as a functional dependency key for the whole table, allowing query patterns like select any_column from any_table group by ctid.
- Add more types to pg_type including missing array types.
Maintenance
- Fix an assertion error with prepared statements caused by concurrent DDL statements.
- Increase overall stability of array handling by fixing several cases for out of bounds memory access when handling arrays.
- Array containment checks now correctly handle null values, i.e., select ARRAY[1,4,null] @> ARRAY[0,1,0]; is now false.
- Fixed a bug where concatenating arrays of different types would silently garble the result. CedarDB now instead reports an error.
- array_position(s) now correctly handles cases where needle and/or haystack are null.
- array_to_string now correctly drops null values if no null substitute is provided instead of printing the empty string, i.e.: array_to_string('{1,NULL}',',') now returns '1' instead of 1,.
- Clear table data after calling DROP TABLE to reduce space consumption.
v2025-12-02
2 Dec 2025New Features
- Support ALTER OWNER for views.
Performance
- Improve JSONB object access performance by up to 20%.
PostgreSQL Compatibility
- Respect default escape character \ for COPY FROM STDIN statements.
- Support casts from jsonb to numeric and boolean.
- Add support for WITH ORDINALITY for json(b)_array_elements functions.
Maintenance
- Ignore misformed values, such as invalid JSON documents, when evaluating samples for query planning.
- VACUUM now removes no longer visible compressed blocks.
- Fix nullability in complex boolean expressions.
- Fix a crash when defining named table constraints.
- Fix a rare OOB read when scanning compressed data.
- Fix a crash when executing prepared statements with concurrent schema changes.
v2025-11-24
24 Nov 2025New Features
- Preserve SQL names of common table expressions in EXPLAIN output.
- Support for row expression inside SELECT: SELECT (1, 2);.
- Add support for directly selecting from table generating functions: Queries like select pg_get_keywords() now work.
Performance
- Regular write transactions require much less main memory per inserted or delete tuple.
PostgreSQL Compatibility
- Ignore casts for output column names if a better name is available, fixing issues with pg_dump.
Maintenance
- Ensure that DISCARD ALL also resets all advisory locks held by the current session.
- Fix parsing multidimensional array literals like select ARRAY[[], []]::varchar[][];.
- Fix cases where comparing a numeric with a constant of different sign could lead to wrong results.
- VACUUM now automatically reclaims space of truncated tables.
- array_positions(), array_remove() and array_replace() no longer crash when called on null arrays.
- Fixed crash in \copy and copy from stdin when loading into table with indexes.
- Removed duplicates in the pg_type system table which caused issues with some PostgreSQL tools.
- Fixed a bug where schema changes after recovering from an unclean database shutdown could have lead to schema corruption.
- Fixed a crash when accessing JSONB certain data.
- Fixed a crash in LIKE expression with underscore.
- Fixed multiple race conditions in the storage layer that could lead to a database crash.
- Fixed a crash in array_agg() with empty array inputs.
- Fixed a rare assertion error for certain recursive CTEs with unused columns.
- CedarDB now accepts CREATE DATABASE ENCODING UTF8.
v2025-11-06
6 Nov 2025New Features
- Add pg_drop_caches() to clear buffer caches without restarting the database system.
- Add full support for PostgreSQL advisory locks, including the ability to wait until a resource is freed and detect deadlocks.
- Add support for RENAME COLUMN as part of ALTER TABLE.
- Add support for sum(bool).
- Add unsigned types to SQL: uint1, uint2, uint4, uint8.
Performance
- Faster comparison of EXTRACT (YEAR ...) with constants.
- Improved auto-compression of small inserts.
Maintenance
- Check casts from TinyInt to Numeric for numeric precision loss.
- Fix a crash for complex recursive queries.
- Fix a crash in generate_series(from, to) with complex from or to expressions.
- Fix an assertion when optimizing sum(1)
- Fix data corruption after UPDATE.
- Fix rare cases of missing results when using volatile functions, such as now(), in filters used to prune compressed data.
- Fix rare overflow check in try cast from numeric to integers: select cast((128::numeric) as int1 or null);.
- Improve cardinality estimation for COPY FROM STDIN. This allows better parallel small inserts.
- Fix rare segfaults of single tuple IndexScans due to a wrong latching behavior.
- Update to LLVM 21.
v2025-10-22
22 Oct 2025New Features
- Add `uuidv7` to generate UUIDv7 containing timestamps.
- Add `great_circle_distance` to calculate geospatial distances between two points represented as latitude, longitude pairs.
- Add transaction_timeout and idle_in_transaction_session_timeout session settings. When set to any time span, connections with long-running or idling transactions are automatically closed, e.g. to reduce WAL bloat: SET idle_in_transaction_session_timeout TO '6h'. Off by default.
- Add support for the `#` operator on bit strings: `select b'101' # b'100';`
- Add support for the `|` operator on bit strings: `select b'101' | b'100';`
Performance
- Improve scheduling under high query load to reduce P99 latencies.
- Adding foreign key constraints does not require a bulk writer anymore
- Improve automated frame of reference compression leading to up to 57 % better compression ratios and 23 % increased table scan performance.
- Speed up daylight-savings time rule evaluation for timestamps with time zone. This can improve performance for time series workloads by up to 40%.
PostgreSQL Compatibility
- Improve binary function overload resolution
Maintenance
- Update timezone database to 2025b
- Harden prepared statements against parallel DDL operations
- Fix rare cases of out-of-bound reads during query processing
- Allow using alias when directly using file names in from clause, e.g. `select c.* from 'file.csv' c`
v2025-10-07
7 Oct 2025New Features
- Improved the install script. It now supports a non-interactive mode for automatic installation, creating a symlink in /usr/local/bin, and installing cedardb as systemd socket-activated service.
- Added support for the & operator on bit strings: select b'101' & b'100';.
Performance
- Speed up expressions of type timestamptz at time zone by 35% by caching the local time zone.
PostgreSQL Compatibility
- CedarDB is now more lenient in which non-standard COPY FROM messages it accepts, enabling to bulk copy data from GO's pgx.
Maintenance
- Don't crash on multi-line comments at statement start
v2025-09-30
30 Sep 2025New Features
- Add support for timestamptz arguments in date_trunc and age
Performance
- Allow constant folding for all integer types, not only int4.
- Improve performance of table scans on compressed data by up to 25%.
PostgreSQL Compatibility
- Adhere to PostgreSQL behaviour for empty-array-specification-and-cast combinations, e.g., []::text.
- Return row count for CREATE (TEMPORARY) TABLE AS statements.
- Allow using table aliases in DISTINCT ON clauses.
Maintenance
- Long-running read-only transactions no longer block log truncation, drastically reducing peak log size on disk in some cases.
- Fix a bug triggering asserts in an edge case in temporary tables
- Fix date_trunc behaviour for BC timestamps and dates
v2025-09-24
24 Sep 2025New Features
- CedarDB now allows for persistent configuration parameters via a config file. Read more on the configuration docs page.
Performance
- Improved automated dictionary compression leading to up to 20% better compression ratios and 12% increased table scan performance.
- Recursive CTEs that include unused columns are now significantly faster.
PostgreSQL Compatibility
- CedarDB now treats parameter of type unknown as text like Postgres does.
- The pg_prepared_statements system table now reports the result type of prepared statements.
Maintenance
- Renamed some settings that previously had to be prefaced with debug. to have more intuitive names. You can find a list of all settings at the configuration docs page.
- CedarDB now returns the correct row count for statements that affected more than 2^31 rows.
- Fixed a bug that triggered an assertion in the undocumented Postgres functions float4send, float8send, and pg_options_to_table.
- Fixed a bug that triggered an assertion when casting a vector with a fixed number of dimensions to a vector with variable dimensions.
- Fixed a bug where CedarDB didn't correctly handle nullability in greatest() and least() under some circumstances.
- Fixed a bug where new schemas couldn't be created after a restart.
- CedarDB now accepts startup messages consisting of multiple fragmented TCP packets.
- Fixed a rare case where CedarDB failed an assertion when preparing a statement with an argument of type char(1).
v2025-09-17
17 Sep 2025New Features
- Added support for tables on Google Cloud Storage.
Maintenance
- CedarDB is now much more cautious about when to use bulk transactions during COPY statements. This enables parallel loading for most scenarios where CedarDB previously rejected a second COPY statement due to an already active bulk transaction.
- CedarDB now correctly detects correlated UDF arguments within CTEs and will now return a "Feature Not Supported" error instead of throwing an assertion.
- asof joins where one side only has a single tuple now return the correct results in all cases.
- CedarDB now correctly handles arbitrarily nested PREPARE statements. You can now EXECUTE a PREPAREd EXECUTE statement.
v2025-09-10
10 Sep 2025New Features
- Added to_char(timestamp[tz], text).
Performance
- Improved performance of regex matching, speeding up some queries by up to 2%.
- Improved performance of float-to-float comparisons by up to 20%.
PostgreSQL Compatibility
- Improve overload resolution in function arguments. For example, select sin(null); now works without an explicit cast.
- factorial(n) now returns a numeric instead of a bigint.
Maintenance
- Fixed a bug where COPY FROM didn't work for temporary tables.
- Fixed handling of null arrays in quantified expressions: select 1 = ANY(NULL) now correctly returns NULL.
- Fixed a bug where the query optimizer bailed after generating selectivity estimates larger than 1 on equality estimations.
- Ensure that NaN is handled correctly in float-to-float comparisons.
- Fixed a bug where the converting a timestamp to timestamptz via at time zone miscalculated the timezone offset.
- Ensure union always removes duplicates, even if CedarDB can optimize the union operator away.
- Fixed an overeager warning in the buffer manager.
- Fixed a rare race condition that could trigger when the buffer manager repurposed previously used buffer pages.
v2025-08-27
27 Aug 2025New Features
- The cedardb_compression_info system table now shows the uncompressed size of text columns.
- S3-backed tables now appear in the system tables pg_foreign_server, pg_foreing_data_wrapper and pg_foreign_table.
- The write-ahead-log is now directly truncated after a successful recovery. This drastically reduces WAL bloat when restarting after a system crash.
PostgreSQL Compatibility
- Restored compatibility with rsql.
- The Docker image now (correctly) ignores the PGHOST environment variable.
- The pg_indexes system table now has a tablespaces column.
- Databases are automatically seeded with all PostgreSQL pre-defined roles.
- The pg_auth_members system table shows role memberships now.
- Make sure select pg_typeof(last_value) from sequence always returns bigint regardless of the sequence type.
- ceil(), floor(), and trunc() now discard fractional digits like Postgres does.
- The vector (pgvector) type can now cast to arbitrary numeric types including 32-bit floats.
Maintenance
- CedarDB now prints the offending string when parsing an invalid JSON value fails during data ingestion.
- Fixed a bug where querying information_schema.tables triggered an assertion when the database contained tables with columns of the serial type.
- Fixed a bug where opening a database didn't succeed after changing the owner of a table.
- Improved support for Amazon DMS.
- Fixed a bug where exiting the interactive shell would print a malloc() error.
v2025-08-20
20 Aug 2025New Features
- Added support for regexp_count and regexp_instr.
- Added support for string_to_table.
- Added support for drop server.
- Added a custom system table cedardb_compression_infos to show database compressions infos.
PostgreSQL Compatibility
- Fixed last_value column in pg_sequence.
- Added support for multiple arrays in unnest(anyarray, ...).
- Added support for user-defined functions in FROM.
- Added support for implicit conversions from text to regclass for pg_total_relation_size(regclass) and related functions.
Maintenance
- Fixed overly large memory consumption in COPY FROM STDIN, i.e., psql's \copy mode.
- Prepare for snapshot isolation for DDL statements, unlocking tons of new DDL functionality to be shipped in future releases.
- Fixed unchecked overflows when converting float8 to float4.
v2025-08-07
7 Aug 2025New Features
- Added support to read relations from S3 using create server.
- Added support for the real (float4) floating point datatype. CedarDB previously used double precision for single precision numbers.
- Added support for jsonb || jsonb aka jsonb_concat(jsonb, jsonb, ...).
- Added support for regexp_like(text, text).
Performance
- Reduced memory consumption for large text-heavy CSV scans.
- Reduced memory consumption and improved performance of group by spooling.
PostgreSQL Compatibility
- Fixed OID to integer comparisons to handle negative numbers consistently.
Maintenance
- Fixed float multiplications of NaN with zero and integer conversions near extreme values.
- Fixed tryCast semantics to be null-returning.
v2025-07-23
23 Jul 2025New Features
- Added support for jsonb ? text aka jsonb_exists(jsonb, text).
- Added support for jsonb ?| array aka jsonb_exists_any(jsonb, array).
- Added support for jsonb ?& array aka jsonb_exists_all(jsonb, array).
Performance
- Reduced disk and memory consumption of large index bulk loads.
Maintenance
- Fixed crash in rollback of index bulk loads.
- Fixed a nasty data corruption during repeated recovery. During recovery after an unclean shutdown, CedarDB did not immediately discard partially written logs. In case of a second unclean shutdown, those inconsistent log entries might have lead to inconsistent state.
- Fixed build for legacy distributions.
v2025-07-09
9 Jul 2025New Features
- When not specifying any database location on the CLI, CedarDB now creates and uses a default database at ~/.cedardb/db. You can now use a temporary in-memory using the --inmemory switch. (Note that this is prone to running OOM)
- Preliminary support for pg_advisory_lock(bigint).
- Added support for jsonb @> jsonb aka jsonb_contains().
- Added support for json_build_object(variadic any).
- Added support for out-of-memory GROUP BY.
Maintenance
- Fixed a deadlock in our buffer manager.
- Fix assertion failure for subqueries in UPDATE.
- Removed jemalloc.
- Upgrade to LLVM20 and GCC15.
v2025-06-24
24 Jun 2025New Features
- Support for extract(timezone, ..) for the timestamptz type.
- Support for the transaction_timeout setting.
- Support for to_json().
PostgreSQL Compatibility
- oids can now be compared with all integer datatypes. This fixes the pgsql plugin of visual studio code.
- Support for subqueries in the unnest() function: select unnest((SELECT ARRAY[1,2]));. This fixes issues with pg_cli.
- Add server protocol support to the postgres-specific legacy types int2vector and oidvector in addition to the existing value support.
- Allow connections via TLSv1.2. CedarDB previously only allowed TLSv1.3 connections which caused issues with some clients such as AWS DMS.
Maintenance
- Solved an issue where CedarDB would sometimes fail to catch exceptions inside transactions. One of the rare case where the compiler was actually at fault: GCC Bug 119151.
- Fixed a bug where pg_get_indexdef() with invalid column ids would trigger an assert.
v2025-05-28
28 May 2025New Features
- We've added the encode_geohash function! You can now compute a geohash from a latitude/longitude pair and a precision: select encode_geohash(48.317009, 11.662260, 5) -- returns u286c.
PostgreSQL Compatibility
- CedarDB now correctly reports the version number of Postgres it's compatible with as 160001 instead of 16001. This caused issues with a few clients that wrongly assumed CedarDB was only compatible with a Postgres version older than version 1(!).
Maintenance
- Fixed a bug where CedarDB would crash when running an explain statement without a format type: explain (format) select ....
- Fixed a bug where recursive SQL queries that relied on the duplicate elimination of union wouldn't terminate in some circumstances.
v2025-05-14
14 May 2025New Features
- Add support for the client_min_messages setting. It controls the minimum severity a message must have to be sent to a connecting client.
- Streamlined command line args: --createdb will now open existing database files.
- CedarDB now supports function calls in the FROM clause: select * from sqrt(4);.
- SQL statements with syntax errors are now also added to the history in interactive mode. You can now browse to them and edit them from within the shell. Previously, only statements that have been executed successfully were added.
- CedarDB now supports prepared statements using the construct first X rows only offset Y which is used e.g. by Hibernate for pagination.
Performance
- Reduced memory consumption of queries with aggregations.
PostgreSQL Compatibility
- Stubbed the Postgres system tables pg_stats_ext and pg_stats_ext_exprs.
- Added the Postgres function pg_type_is_visible().
- Stubbed the Postgres functions row_security_active(), pg_mcv_list_items(), pg_ident_file_mappings(), pg_stat_get_numscans() and has_foreign_data_wrapper_privilege().
- Added all Postgres builtin UDFs that Postgres's information_schema relies on.
- Report the correct default collate of en_US.UTF-8 in the pg_database system table.
- Stubbed the default_table_access_method setting which is required by pg_dump but irrelevant for CedarDB.
- Use Postgres-compatible oids in the pg_database system table.
- pg_relation_size() and pg_index_size() now also support sequences.
Maintenance
- CedarDB now creates statistics for system tables. This significantly speed up some tools that joined a lot of system tables as CedarDB now generates better query plans.
- Fixed a rare bug where queries with IN expressions crashed.
- Fixed a bug in the docker image where CedarDB was stuck in an endless loop updating the database schema if it crashed before.
- Fixed a rare bug where deleted tuples could reappear under some circumstances.
- Fixed a bug where the optimizer crashed on queries with a provable empty result set under some circumstances.
- Fixed a bug where tables could become owner-less when the owner's password was changed.
- Fixed a bug where CedarDB could have failed gracefully but didn't and instead terminated if the system ran out of memory.
alpha/2025-04-23
23 Apr 2025New Features
- Added support for COPY FROM <...> WITH ENCODING 'UTF8/UNICODE/SQLASCII'.
- Add support for most information_schema tables, as defined by the SQL standard. You can see the implementation progress here.
- Interactive mode no longer prints timing numbers per default. If you want to re-enable it, you can do so via "\timing on" in interactive mode.
- Looking up values in arrays via ALL/ANY now works: select 'a' = ANY('{a, b}').
- Add support for expanding row expressions with .*. The following now works: select (tablefun()).*
PostgreSQL Compatibility
- Implemented the postgres functions has_database_privilege(), pg_get_publication_tables(), pg_get_ruledef() and has_server_privilege().
- Casting the regproc,regprocedure and regnamespace types to text now returns the procedure resp. namespace name instead of just an internal identifier.
- Columns of system tables now always have the correct oid type, instead of being just an integer. This is required by a few clients who depend on the right behavior when casting attributes from system tables to text.
Maintenance
- Casting oids of sequences to strings no longer triggers an assert.
alpha/2025-04-10b
10 Apr 2025New Features
- Support for natively running CedarDB without Docker: curl https://get.cedardb.com | bash will install CedarDB on your system. You can then run ./cedardb to start the server.
- Streamlined docker build process. No need to re-download the Dockerfile after a new release. Re-running docker build will always create an up-to-date image.
- Experimental ARM support! Both the native binary and docker image now natively run on ARM64 systems.
- CedarDB can now bulk create indexes larger than main memory by spooling intermediate data to disk.
PostgreSQL Compatibility
- CedarDB now supports schema-qualified column names: select schema.table.column from schema.table.
- Implemented the postgres-internal functions pg_get_function_arguments(), pg_get_function_identity_arguments(), pg_get_function_result(), pg_get_function_sqlbody(), pg_prepared_statement(), pg_timezone_abbrevs(), pg_timezone_names().
- Implemented the pg_language system table.
- Improved output of the pg_proc system table.
- Stubbed a slew of postgres-internal system functions: pg_available_extensions(), pg_available_extension_versions(), pg_config(), pg_cursor(), pg_get_backend_memory_contexts(), pg_get_replication_slots(), pg_get_shmem_allocations(), pg_hba_file_rules() ,pg_prepared_xact(), pg_show_all_file_settings(), pg_show_all_settings(), pg_show_replication_origin_status(), pg_is_wal_replay_paused(), pg_stat_get_activity()
Maintenance
- Fixed a crash in regex_split.
- Fixed a crash in array comparisons.
- Fixed a bug where CedarDB's loading serialized query plans could lead to a crash.
- Fixed a bug where CedarDB wasn't able to unnest highly correlated expressions.
- Fixed a bug where we didn't correctly store precision/scale of array types across database restarts in some cases.
- Fixed a rare crash where we double-freed a string that represented a null value.
- cedardb --version now reports a more human-readable version identifier instead of just a git commit id.
alpha/2025-03-26
26 Mar 2025New Features
- Print dynamic filters in explain verbose.
Maintenance
- Fixed a bug where old databases that contained deleted indexes could not be loaded in the newest version of CedarDB.
- Fixed parsing ISO8601 intervals with more than 24 trailing zeroes.
alpha/2025-03-25
25 Mar 2025New Features
- Added support for DROP ROLE.
- Added support for DROP GROUP.
- Added support for DROP SCHEMA as long as the schema is empty.
- Added support for DROP SEQUENCE.
- Added support for pg_get_constraintdef(). As a consequence of this, '\d' in psql now shows foreign keys.
Performance
- Streamlined counting characters with SSE.
- Added support for AES hardware accelerated hashing via gxhash.
- Expressions of the type regex_replace(in, pattern, '\1') are no optimized to regexp_substr().
- Leading and trailing wildcards in regexp_substr() are now dropped.
- CedarDB now accepts comments which contain invalid UTF-8.
PostgreSQL Compatibility
- pg_table_size() now works with system tables.
- COPY now works with system tables: copy pg_class to stdout;
- Added support for DROP INDEX CONCURRENTLY which is a no-op since CedarDB always drops indexes concurrently, but is required by some tools.
- Added stubbed pg_get_triggerdef() function. This is required by some tools like pg_dump.
- Stubbed pg_partition_ancestor() system function. CedarDB partitions transparently, so this always returns an empty table.
- Added support for with ordinality in pg_partition_ancestor() system function.
- Added support for with ordinality in array_unnest() function.
- Server now correctly reports compatibility with PostgreSQL 16.1 instead of 11.3 under all circumstances.
- Get rid of the custom namespace cedar which caused issues with some tools.
- Allow casts from oids inside strings.
- CedarDB no longer prints implicitly created foreign key indexes in pg_class and pg_index.
- Print the full name when calling pg_get_indexdef() on a table that is not in the search path.
- pg_table_is_visible now works on indexes and sequences.
- Use Postgres's special legacy oidvector and int2vector types in pg_index.
- CedarDB now correctly enforces unique names across tables, views, indexes, and sequences.
If you previously two of those objects with the same name, they have been renamed! . So if you had a table and a sequence both called foo, the sequence is now called foo1. - SELECT * FROM
now works and returns the same table output as PostgreSQL. - Sequence limits now behave identical to Postgres.
- Implement pg_opclass system table.
Maintenance
- Updated ICU version to 76.1, introducing support for new unicode characters.
- Fixed off-by-one error in regexp_substr().
- Ensure sequences now have an explicit start value.
- Severely hardened UTF-8 validation.
- Fixed on OOB access when parsing ISO8601 intervals which lead to a crash.
- Fixed a bug where generate_series() didn't correctly work when used in conjunction with arrays that weren't 1-indexed.
- Fixed a bug where the undocumented Postgres function _pg_expandarray didn't correctly work on array that weren't 1-indexed.
- Fixed a bug where nulls weren't correctly ordered when using radix sort.
- Fixed a bug in regexp_match() and regexp_split_to_array() where they caused an error when used on values originating in a table.
- Fixed a bug where function lookups without an explicit namespace didn't find the function.
- Fixed quantified expressions over string arrays: insert into testtext values (array['test',null,'averylongstring']), (array['test']); select 'x' = ANY(x) from testtext; now works.
- Fixed an error when casting from or to TEXT[] arrays.
- Various bug fixes, stability, and performance improvements.
alpha/2025-02-20
20 Feb 2025Performance
- If the join build side is empty, we skip evaluating the probe side completely when this is safe to do.
- We revised operations that use the sequentially consistent memory model, replacing sequentially consistent stores and loads (where possible) with more performant acquire/release operations.
PostgreSQL Compatibility
- We made various compatibility time zone and interval changes such that we can pass the JDBC time tests.
- We now allow $ symbols in identifiers.
- You can now write nested comments in your SQL queries.
- Simplified index size checking by parsing names as regclass oids in pg_table_size('foo_pkey').
- PostgreSQL's parse messages are often sent without typemod. We now use the generic type as default.
- We now print arrays and calculate the array_length according to PostgreSQL. Our array printer used to differ for arrays that have special characters, are empty, or have null values.
- We now allow changing several transaction behavior settings with SET TRANSACTION statements and changing the default session behavior with SET SESSION CHARACTERISTICS AS TRANSACTION statements.
- OIDs of system tables are now identical to the ones PostgreSQL uses.
Maintenance
- Fixed a rare race condition where the current file descriptor was closed and data was read. This could cause incorrect results to be returned. Because the likelihood of this increased in constrained memory settings, we now use more rigorous integration tests that put more stress on the memory subsystem.
- Fixed a bug when we transformed an asof join conditions to a regular join condition.
- We fixed a rare race condition in our group commit that could cause queries to be live-locked until the next transaction commits.
- When processing insert on conflict, we only returned the updated rows instead of all rows.
- Fixed a bug where we used a cached functional dependency after unnesting the query which could trigger an assert.
- Various bug fixes, stability, and performance improvements.
alpha/2025-02-04
4 Feb 2025New Features
- CedarDB's explain output includes more details:
- explain now shows internally generated CTEs.
- explain analyze now shows the memory usage of hash joins and group by aggregations.
- explain analyze now reports the I/O statistics of table scans.
- You can now directly query csv files located on the server via select * from '/path/to/filename.csv'.
- Introduced the debug.log_slow_queries setting. It will log all queries which took longer than x milliseconds to execute on the server- and on the client side. Activate via set debug.log_slow_queries = min_time_in_milliseconds. Warning: This is a global setting!
Performance
- CedarDB now uses O_DIRECT on all systems that support it.
- Improved selection of unique indexes. CedarDB previously only considered indexes with an explicit constraint as unique. Now, we also consider if the index attributes include a key, which allows choosing better index scans.
- CedarDB now prefers covering and smaller indexes for index joins instead of always preferring primary keys.
- CedarDB will now prefer using a covering index for index scans where possible. The previous index selection strategy caused us to sometimes access the underlying table even if a covering index was available that guaranteed no table lookup would be required.
- Prefer using a table scan over an index scan if we have a very selective restriction on a table that is not covered by the index.
PostgreSQL Compatibility
- Add pg_prepared_statements system table.
- Correctly consider the weight parameter when deserializing numerics received in binary format.
- pg_index now correctly reports index orders (ascending or descending).
- The row description message of the wire protocol now correctly reports the base table columns of query results. This is required by e.g. JDBC to update ResultSets of a Query.
- Text output of timestamps now correctly truncates trailing zeroes in the microsecond field.
- pg_type now correctly reports the name of array types.
- Return a more readable error message when a varchar exceeds its max length.
- Startup messages may now contain integral timezone offsets instead of just a name.
- CedarDB will now correctly send a ParameterStatus message to the client if a setting has been updated.
- Extend the parsing logic of date style settings.
Maintenance
- Fix an issue where CedarDB created overly many memory mappings. This resulted in unnecessary out of memory errors on strict Linux configurations. This only became an issue when creating more than 10'000 tables.
- Fix a bug where we didn't parse drop operator correctly.
- Output offset in the seconds range on timestamp with timezones. This broke timestamps in timezones who had adjustements in the past which were not evenly divisble by minutes. One example is Casablanca, where the timezone was adjusted by 20 seconds in 1913.
- Fix a bug where we didn't consider some tuples in union all in rare edge cases.
- Fix some edge cases for array input from strings where the parser, e.g., didn't consider tab-stops as white-space.
alpha/2025-01-23
23 Jan 2025New Features
- CedarDB now asynchronously loads data from disk into its page cache. This makes queries that touch data that is not currently cached up to 4x faster!
- Output of explain is now flatter, allowing you to more easily read query plans of complex queries. For a full overview and instructions on how to get back the old behavior, please refer to our docs.
- You can now cast integers to bitstrings: select 29::bit(4).
- Support for read-only transactions via set transaction_read_only.
- explain analyze now returns more detailed information about execution times.
- Add support for a tinyint type.
Performance
- Improve index selecion for index scans.
- Skip over subtrees guaranteed to generate no results during execution.
PostgreSQL Compatibility
- System tables and views are now shown in pg_class.
- Allow parsing values of type time from strings that also specify a date.
- Correct handling of namespaces and owners in system tables.
- pg_table_is_visible() now correctly observes search_path.
- Enforce precision of numerics when casting them from strings or integral types.
- Ensure that no table with oid 0 is printend in system tables since 0 signals an invalid oid. Required by some clients.
- Support binary output of the ByteArray, JSON, and Time datatypes.
- Looking up functions now works with fully qualified names as well: select 'pg_catalog.sum(int)'::regproc;
- Allow using relation names in function calls without explicit casting to regclass: pg_table_size('foo');
- Add array_in dummy function in pg_proc and pg_types. Required by some JDBC queries inferring whether a given type is an array type.
- Support SQL standard compliant way to set the time zone.
Maintenance
- Work around a bug in LLVM calling conventions. See the corresponding issue in the LLVM repo.
- Print nicer error message when exceeding the maximum precision of a numeric.
- Fix a bug with null handling in generate_subscripts().
- Fix a bug with null handling in upserts.
- Fix a bug where we wrongly optimized multi-column conditions to IN expressions.
- Got rid of pesky irrelevant message about perf counters not being able to be initialized.
- Fixed a bug where the state of sequences was not correctly recovered after a system crash.
alpha/2025-01-03
3 Jan 2025Performance
- Vectorize printing of UUIDs. This drastically speeds up performance for queries returning a lot of UUIDs.
- Refined optimizer logic on when to employ an index scan when buffer size is limited to further reduce buffer thrashing.
Maintenance
- Columns can now be called 'step' again.
- Fixed a bug where index scans in combination with a limit without order by clause did not produce all matching tuples.
- Fixed a bug where index range scans in combination with a limit did not produce all matching tuples.
- Fixed a bug where inserting null values reported a unique constraint violation if the index enforcing uniqueness was created after rows had already been inserted.
- Fixed several bugs in unnesting of asof joins.
- Fixed a crash when calling pg_get_view_def on views with long names.
- Fixed a bug where using non constant limit or offset declarations triggered an assert.
- Fixed a race condition when changing settings concurrently.
- Fixed a bug where queries operating on tables with multiple unique and non-unique indexes would skip some rows.
- Various bug fixes, stability, and performance improvements.
alpha/2024-12-24
24 Dec 2024New Features
- We have added support for explain statements after different query optimization steps. For example, explain (step Unnesting) select * from foo, bar where foo.a = bar.b shows the query tree after the 'Unnesting' optimization step but before the 'Predicate Pushdown' step. For the syntax and available steps, please refer to our docs.
Performance
- The logic deciding whether to use an index for a join is now more sophisticated. Previously, it could happen that CedarDB suddenly switched to a very disadvantageous query plan once a relation's size reached 10% of the available main memory. CedarDB now also takes the cost of buffer thrashing into account, not only a relation's size.
- CedarDB is now more careful on when it holds an exclusive lock on the database schema during DDL statements, improving performance of DDL queries.
PostgreSQL Compatibility
- Support for non constant values for limit offset: It is now possible to prepare queries like select * from foo limit $1 offset $2. This was e.g. required by Drizzle Studio.
- Add pg_column_is_updatable() builtin function.
Maintenance
- Fix a bug in the null-handling logic of IN expressions which triggered a faulty assert. Also occured in instances where no explicit IN expression was present but CedarDB optimized a different expression into such an expression.
- Tables created in the temporary pg_temp namespace can now actually be referenced in queries and aren't lost to the aether.
- Fix a race condition in the group commit queue where a thread waiting for a sync to disk was notified before it started to wait. This could lead to deadlocks of bulk transactions
- Various bug fixes, stability, and performance improvements.
alpha/2024-12-16
16 Dec 2024New Features
- Add support for the serial, smallserial, and bigserial data types.
- Add trigonometric functions with degrees: acosd, asind, atand, cosd, cotd, sind, tand.
- Add hyperbolic trigonometric functions: sinh, cosh, tanh, asinh, acosh, atanh.
- Add support for generate_subscripts().
- Very basic support for the Drizzle ORM.
Performance
- Doing inserts in batches of 128 or more elements is now considerably faster.
- coalesce expressions with large number of arguments are now optimized in linear instead of quadratic time.
PostgreSQL Compatibility
- support parsing oids from namespace literals: select 'pg_temp'::regnamespace .
- calling json_array_elements() on null now returns an empty string.
- malformed protocol messages now return the ProtocolViolation error code instead of InternalError.
- Failing to authenticate now returns the correct error codes.
- It is now possible to bind up to 65535 parameters to a prepared statement, instead of the previous maximum of 32767.
- The pg_columnkeys column in the pg_constraint and pg_index system tables are now 1-indexed instead of 0-indexed.
- Add has_sequence_privilege() builtin function.
- Add pg_sequence_last_value() builtin function.
- Update the pg_sequence system view to return meaningful data.
- List sequences in the pg_class system table.
- Add stubbed pg_get_serial_sequence() builtin function.
- Add stubbed pg_stat_user_indexes system table.
- Add stubbed pg_stat_all_indexes system table.
Maintenance
- Fix an exception when parsing SET statements.
- Malformed client messages are now handed gracefully and close the connection instead of triggering an assertion failure.
- Automatically abort queries that run into a live lock. This could happen when trying to evict buffer pages while all buffer pages where pinned.
- Parsing alter role statements setting the connection limit to values lower than -1 now throws the expected error instead of triggering an assert.
- Various bug fixes, stability, and performance improvements.
alpha/2024-12-05
5 Dec 2024New Features
- The docker image is now compatible with external pg_isready health checks. Previously, CedarDB would be started and stopped multiple times during setup while being externally reachable. This caused pg_isready to prematurely declare CedarDB being up and subsequent connections to fail.
- Log messages are now prefixed with a timestamp.
- More detailed CSV import error messages: When the format is wrong, CedarDB now returns the offending column and the detailed issue.
PostgreSQL Compatibility
- Sequence names now automatically convert to oids. You can now write CREATE SEQUENCE serial; select nextval('serial');
- Support for factorial(n), in addition to the already existing n! and !!n.
- Subtracting two dates now returns an integer with the difference in days, instead of an interval.
- split_part now allows for negative arguments to search backward from the end and correctly returns null in some corner cases.
Maintenance
- Fixed a bug where docker containers would not start correctly on Windows.
- Removed a few spurious asserts which gave the impression something went wrong when everything was in fact fine.
- Fixed a crash for queries which would join at least two tables using the json_array_elements set generating function.
- Fixed a rare deadlock when creating indexes. This could happen when re-creating an index after dropping it.
- Fixed an issue where dropped indexes were wrongly restored when a concurrent transaction also modifying it was aborted.
- Fixed a case where CedarDB tried to truncate a log too early and subsequently failed an assert.
- Various bug fixes, stability, and performance improvements.
alpha/2024-11-21
21 Nov 2024New Features
- Add support for psql builtin describe commands \d table and \d+ table.
Performance
- Reduce transaction tail latency: When the overall write-ahead log size becomes too large, writing transactions are now throttled instead of paused.
PostgreSQL Compatibility
- Include attribute defaults in the pg_attrdef system table.
Maintenance
- Fix a rare deadlock during concurrent compression of inserts.
- Fix a crash when inserting strings just smaller than 64 KB.
- Various bug fixes, stability, and performance improvements.
alpha/2024-11-15
15 Nov 2024New Features
- This release comes with a new Docker image that more closely mirrors the behavior of the official Postgres image. You can now pass the superuser name and password as environment variabls at container startup instead of having to create them manually inside Docker! For a full list of changes and new features, check out our new Docker docs.
- The Docker image now correctly exports the PG_HOST environment variable. When using psql from inside the Docker container, you no longer need to write -h /tmp.
Performance
- More aggressive autocompression of tables. Previously, CedarDB only compressed tuples during bulk inserts, scan-intensive queries or when the user manually executed VACUUM. CedarDB now also autocompresses tuples after small inserts, which considerably improves table scan performance and significantly reduces storage consumption for write-intensive workloads
PostgreSQL Compatibility
- Constructing an array from empty input now returns an empty array instead of null, e.g. select array(select * from unnest(ARRAY[]::text[]));
- Mirror undocumented Postgres behavior regarding function and table aliases: select a from foo a now works.
Maintenance
- Fixed a race condition in the buffer manager where CedarDB could lose updates. This race condition caused the database to shut down and the recovery process to complain about an invalid system state. It was only triggered under heavy memory pressure when a page was incorrectly selected twice for eviction.
- User defined functions are now formatted correctly when printing with explain (analyze, format sql).
- Fixed a rare case where IN expressions with nullable inputs could cause a query to abort.
- Various bug fixes, stability, and performance improvements.
alpha/2024-11-05
5 Nov 2024New Features
- Improved internal memory allocation: CedarDB now tracks memory consumption during query execution and aborts queries consuming too much working memory.
- Add VACUUM statement. It manually triggers data compression of newly inserted data that hasn't been queried often yet.
Performance
- Greatly speed up queries of the pattern SELECT * FROM foo LIMIT 1.
- Improve estimates on tables with unique constraints.
- Reduce write-ahead log size. CedarDB now tries to prune the log much more eagerly to reduce disk space consumption.
PostgreSQL Compatibility
- Add name datatype to pg_type system table. Required by some ORMs using JDBC (e.g., "Exposed") to infer maximum length of table names and columns.
- Allow parsing dates from strings specifying a full timestamp. Used by some ORMs such as "Exposed" to construct dates.
Maintenance
- Fix case where created functions couldn't be dropped.
- Fix deadlock when client connection unexpectedly drops.
- Upgraded to LLVM 19.
- Various bug fixes, stability, and performance improvements.
alpha/2024-10-17
17 Oct 2024Maintenance
- Stability fix for replanning prepared statements with UPSERTs.
alpha/2024-10-16
16 Oct 2024Performance
- Lazily compile prepared statements.
PostgreSQL Compatibility
- Use PostgreSQL-compliant BigNumeric type truncation.
- Support regclass casts for system tables.
Maintenance
- Check for newer CedarDB versions on Docker startup.
- Fix rare cases of lost tuples in UPSERT queries.
- Use consistent sort order for BLOB types.
- Various bug fixes, stability, and performance improvements.
alpha/2024-10-11
11 Oct 2024New Features
- Added support for AsOf joins.
- Added support for upserts through ON CONFLICT DO UPDATE and ON CONFLICT DO NOTHING.
- Added support for additional aggregation functions.
Performance
- Improve join unnesting for dependent joins.
- Various cardinality estimation improvements.
- Add vectorization support for pg_vector-type cosine distance calcultions.
- Lazily compile user-defined functions.
PostgreSQL Compatibility
- Support array-constructing subqueries: select array(values(1),(1)); returns {1,1}.
- Added has_column_privilege() function.
- Added has_function_privilege() function.
- Improve output of pg_attribute system table.
- Improve output of pg_type system table.
- Full support for pg_timezone_names system table.
- Full support for pg_timezone_abbrevs system table.
- Added support for default keyword in INSERT statements.
- Use PostgreSQL-compliant sort order for bytea type.
- Fix output of current_schema() function.
Maintenance
- Update the timezone database to version 2024b.
- Fix daylight savings time handling for regions with daylight savings differences other than 1 hour.
- Various bug fixes, stability, and performance improvements.
alpha/2024-09-13
13 Sep 2024Please refer to the database upgrade guide for more information.
New Features
- Implemented the functionality of the pgvector extension. For a feature description take a look at the vector datatype reference, the pgvector extension compatibility docs, or follow our new vector tutorial.
- Restructured database file storage: All files of a given database are stored in the same directory to declutter your server. Existing database files will be converted to the new format automatically on startup, no manual intervention required.
- Added support for quantified expressions over subqueries and arrays:
with tmp(x) as (select array[1,2,3]) select 1 = ANY(x) from tmp. - Implicitly cast string constants in binary expressions: You can now, for example, write 123 + '456'.
- Better type deduction for unknown types: Parameters now seamlessly work in function calls. For example lower($1) now treats the parameter as a string.
- Added support for row results in subqueries and non constant arrays:
select (r.r)."2", (r.r)."1", (r.r)."0" from (select row('foo','bar','baz')) r(r)" returns baz bar foo .
Performance
- Optimizer: Improved cardinality estimation for very selective predicates. This sometimes improves execution plans, where we observed cases of 10x speedup
- Implemented a heuristic that inlines CTEs that materialize a large state but are cheap to recalculate. This improves TPC-DS Q95's performance by about 10x, for example.
- More aggressively use band joins where beneficial, even if the query does not contain between conditions.
- Optimize concat calls with single arguments: concat(x) becomes cast(x as text).
PostgreSQL Compatibility
- Honor Postgres AS NOT MATERIALIZED hint in CTEs.
- Timestamp calculations are now done in UTC instead of local time in accordance with the Postgres docs.
- When adding intervals to timestamps, the months, days, and microseconds fields of the interval value are handled in turn.
- Correctly output regclass and regtype names: For example, pg_typeof(42) now returns 'int4' instead of a cryptic identifier.
- trim() now allows for Postgres' alternative syntax: Instead of trim('x' from 'xfoox') you can now also write trim('xfoox','x').
- Added to_regtype() function.
- Added pg_typeof() function.
- Added nameconcatoid() function.
Maintenance
- Introduce recovery log versioning to reduce the likelihood of having to break backwards compatibility in the future.
- Various bug fixes, stability, and performance improvements.
alpha/2024-07-24
24 Jul 2024Please refer to the database upgrade guide for more information.
PostgreSQL Compatibility
- Full support for all PostgreSQL timezone abbreviations
- Parse (not-) materialized Common Table Expression hints
- Added for pg_proc system table
- Added pg_function_is_visible() function
Maintenance
- Split data file and schema version numbering to reduce the likelihood of having to break backwards compatibility in the future
- Various bug fixes and stability improvements
alpha/2024-07-12
12 Jul 2024New Features
- Support for SQL UDF table functions in SELECT statements
- Allow creating and releasing SAVEPOINTs within transactions
- Support quantified expressions over constant arrays
- Support 'ON CONFLICT DO NOTHING' for upserts
Performance
- 300x performance improvement for calculating table sizes via pg_total_relation_size()
PostgreSQL Compatibility
- Support for parsing 'COPY FREEZE' performance hint
- Support for compound date styles
- The pg_class system table now also shows views
- The pg_constraint system table now also shows indexes
- Added pg_relation_is_updateable() function
- Added pg_my_temp_schema()
- Added pg_description system table
- Added has_schema_privileges() function
- Added has_any_column_privilege() function
- Added pg_get_keywords() function
Maintenance
- Various bug fixes and stability improvements