All notable changes to this project will be documented in this file. It uses the Keep a Changelog format, and this project adheres to Semantic Versioning.
v0.1.5 — Unreleased
- Changed the http driver connection function to raise an error if the database name contains line ending characters to prevent HTTP header injection.
- Fixed a crash due to an unexpected EOF while the http driver parses a response. Thanks to @serprex for the fix (#153)
- Fixed a crash due to an unchecked memory allocation while the http driver reads a response. Thanks to @serprex for the fix (#154).
v0.1.4 — 2026-02-17
This release makes binary-only changes. Once installed, any existing use of
pg_clickhouse v0.1 will get its benefits on reload without needing to
ALTER EXTENSION UPDATE.
- Added support for the PostgreSQL
md5()function, mapped tolower(hex(MD5()))in ClickHouse. - Added support for mapping PostgreSQL BYTEA columns to ClickHouse String columns.
- Added explicit setting of
format_tsv_null_representationandoutput_format_tsv_crlf_end_of_lineto all http requests, as unexpected values will interfere with its operation. - Improved the error message from the binary driver when attempting to
insert a
NULLinto a column that is notNullable(T).
- Fixed binary driver errors when attempting to insert a
NULLvalue intoNullableNumeric, Text,Enum,UUID, andINETcolumns. Thanks to Rahul Mehta for the report (#140). - Fixed http driver array parsing, which previously did not properly parse
string values and would raise an error on values containing brackets
(
[]). Thanks to Philip Dubé for the spot (#142). - Fixed a bug where the binary driver would raise an error on an empty array.
- Refactored and improved the http engine's result processing, bringing it into closer alignment with the binary engine and removing double processing of row values.
- The http driver now ignores the following session settings from the
pg_clickhouse.session_settingsto prevent them from interfering with its operation:date_time_output_format,format_tsv_null_representation, andoutput_format_tsv_crlf_end_of_line.
v0.1.3 — 2026-01-23
This release makes binary-only changes. Once installed, any existing use of
pg_clickhouse v0.1 will get its benefits on reload without needing to
ALTER EXTENSION UPDATE.
- Changed the default mapping for
DateTimeandDateTime64values fromTIMESTAMPtoTIMESTAMPTZ, because ClickHouse storesDateTimes as a Unix timestamp, always normalized to UTC, even if it displays as a different time zone. As of the first bug fix listed below, pg_clickhouse (almost) always fetches these values in UTC, so can store them asTIMESTAMPTZvalues. - Implemented
INSERTsupport for the UUID and INET (IPv4 and IPv6) types. Thanks to Rahul Mehta for the report (#127)!
- Fixed time zone conversion in the http engine. Does not work with parameterized execution on ClickHouse versions prior to 25.8 due to ClickHouse Issue 88088; recommend using the binary engine for tables with timestamp values on earlier ClickHouse versions to avoid the issue.
- Fixed a server crash when attempting to insert types not yet supported by the binary engine.
- Added the security policy.
- Scripted the generation of the TPC-H results table and updated it in the README.
- Cleaned up some comments and old references to postgres_fdw left from the original fork in 2019.
- Added tests demonstrating subqueries that pg_clickhouse does not yet push down, to be improved in future releases.
- Added pre-commit hooks to lint the code, including for indentation
enforced by
pg_bsd_indent. A new workflow ensures consistency for these quality checks. Relatedly, a number of issues found by the linters have been corrected. - Configured
make installcheckto run the tests in parallel, resulting in far faster test execution on multi-core systems. Adjusted the schemas in which some of the tests work to ensure they don't stomp on each other.
v0.1.2 — 2026-01-07
This release makes binary-only changes. Once installed, any existing use of
pg_clickhouse v0.1 will get its benefits on reload without needing to
ALTER EXTENSION UPDATE.
- Added support for parameterized execution, including
PREPAREandEXECUTE, by converting PostgreSQL$1-style parameters to ClickHouse{param:type}-style parameters. - Added support for inserting arrays to the http engine.
- Fixed the http engine's parsing of UUID arrays selected from ClickHouse.
- Fixed the binary engine's conversion of Date values, which in arrays ended
up too large by several orders of magnitude (e.g.,
2025-12-05would be converted to10529827-09-17😱). Thanks to Tom Lane for the pointer to the proper function to easily convert epoch seconds to a date. - Fixed a binary engine bug where dates and timestamps for epoch 0
(
1970-01-01 00:00:00) rendered asNULL. - Added support for the
Date32ClickHouse type. - Fixed conversion of
array_agg()to support ClickHouse versions prior to 23.8. - Fixed the precision of fractional seconds in the binary engine's
conversion of ClickHouse
DateTime64values to PostgresTIMESTAMP(#114).
- Removed unused code designed to support custom PostgreSQL extensions: ajbool, ajtime, country, and istore.
- Tweaked cost estimation to encourage pushdown of
min()andmax().
- Documented
IMPORT FOREIGN SCHEMAidentifier case preservation behavior. - Fixed the Postgres Docker start and connect info in the tutorial.
- Fixed the commands to start and connect to the pg_clickhouse Docker image in the tutorial.
- Added complete DML documentation to the reference
docs, including the new
PREPARE/EXECUTEsupport andINSERT,SET,COPY, as well as shared library preloading. - Documented the Postgres aggregate functions known (via new tests) to push down to ClickHouse.
v0.1.1 — 2025-12-17
This release makes binary-only changes. Once installed, any existing use of
pg_clickhouse v0.1 will get its benefits on reload without needing to
ALTER EXTENSION UPDATE.
- Refactored the internal handling of the
pg_clickhouse.session_settingsGUC to parse the settings only once rather than for every query sent to ClickHouse
- Updated the SQL query rewriting to properly quote strings and identifiers
in SQL queries sent to ClickHouse, fixing potential SQL injection
vulnerabilities, notably via
IMPORT SCHEMA. This has the effect of preserving mixed-case and uppercase identifiers.
- Fixed a crash when sending an empty
COPY FROMvia the binary driver
- Updated vendored clickhouse-cpp library
- Fixed the
Makefiletargets so that callingmake installwithout first callingmakewill properly create the versioned SQL file.
- Added a versioning policy the documentation
- Fixed the badges and broken TPC-H links in README.md
- Added PGXN installation instructions to README.md
v0.1.0 — 2025-12-09
- Improved function and aggregate pushdown
- Added TLS support to both the http and binary engines
- Added pushdown aggregate functions:
uniq()uniqExact()uniqCombined()uniqCombined64()uniqExact()uniqHLL12()uniqTheta()
- Added pushdown functions:
toUInt8()toUInt16()toUInt32()toUInt64()toUInt128()quantile()quantileExact()
- Mapped PostgreSQL
regexp_like()to push down to ClickHousematch()function - Mapped PostgreSQL
extract()to push down to equivalent ClickHouse DateTime extraction functions (already mapped todate_part()) - Mapped PostgreSQL
percentile_cont()ordered set aggregate function to push down to ClickHousequantile()parametrized - Mapped the
COUNT()return value tobigint - Added the query text and, for the http engine, the status code to error messages
- Added
pg_clickhouse.session_settingsGUC, defaulting tojoin_use_nulls 1, group_by_use_nulls 1, final 1 - Added mappings and support for additional data types:
Bool=>booleanDecimal=>numericJSON=>jsonb(http engine only)
- Added the
dbnameoption to http engine connections, includingclickhouse_raw_query() - Added LEFT SEMI JOIN pushdown for
EXISTS()subqueries
- Ported from clickhouse_fdw
- Made lots of general code cleanup
- Added PGXS build pipeline
- Added PGXN and GitHub release workflows
- Added
pg_clickhouseOCI image workflow that publishes to ghcr.io/clickhouse/pg_clickhouse, with tags for PostgreSQL versions 13-18
- Added tutorial in doc/tutorial.md
- Added reference documentation in doc/pg_clickhouse.md
- Fixed
dictGet(),argMin(), andargMax() - Fixed bug in filtered
COUNT() - Fixed
AggregateFunctionoption to propagate to a nested aggregate function call - Improved unsigned integer support
- Updated vendored clickhouse-cpp library
- Reimplemented binary engine inserts with clickhouse-cpp improvements
- Support and tested against PostgreSQL 13-18
- Support and tested against ClickHouse 23-25
- Set full version in
PG_MODULE_MAGIC_EXT - Set to default ports to TLS for ClickHouse Cloud host names