ClickHouse (Bulk)
This page contains the latest information of the releases of RepoDb.ClickHouse.BulkOperations library.
View the NuGet package here or download it directly here.
RepoDb.ClickHouse.BulkOperations (v1.17.0-alpha1)
Released: October 1, 2026
- Adopted the Roslyn and Meziantou static code analyzers across the codebase and applied the resulting fixes — including
ConfigureAwait(false)on async calls,ArgumentNullExceptionoverNullReferenceException, and other code-quality corrections. #1328 #1331 - Updated the NuGet package icon to the new logo and refreshed the
READMEwith a consistent header, description and a link to the get started tutorial. - Introduced ClickHouseBulkColumnMappingsBehavior (
Automatic,Strict,StrictBypass) and the newBulkColumnMappingsBehaviorproperty on ClickHouseBulkDbSetting — opt into fail-fast validation of the source-to-destination column mapping for BulkInsert, BulkMerge, BulkUpdate and BulkDelete when no explicitmappingsare passed. #1360 - Referenced the
RepoDbpackagev1.17.0-alpha3. - Referenced the
RepoDb.ClickHousepackagev1.17.0-alpha1.
RepoDb.ClickHouse.BulkOperations (v1.16.0)
Released: September 9, 2026
Version bump only, aligning with the RepoDB ecosystem-wide v1.16.0 release — no functional changes since v1.0.0.
- Referenced the
RepoDbpackagev1.16.0. - Referenced the
RepoDb.ClickHousepackagev1.16.0.
RepoDb.ClickHouse.BulkOperations (v1.0.0)
Released: September 8, 2026
First general availability (non-preview) release of the ClickHouse Bulk Operations package, promoting the preview below to stable v1.0.0. No functional changes since the preview — see that entry for the full feature set and known limitations.
RepoDb.ClickHouse.BulkOperations - Preview
Released: 2026-08-30
New
First release of the bulk operations extension for RepoDb.ClickHouse, providing BulkInsert, BulkMerge, BulkUpdate, BulkDelete, and BulkDeleteByKey, each with an Async overload, callable against a ClickHouseConnection, a table name, or a DataTable. #1242
What’s included
- BulkInsert, BulkMerge, BulkUpdate, BulkDelete, and BulkDeleteByKey — matched by qualifiers or primary key; see Operations (ClickHouse) for the full SQL generated by each.
- An internal
ClickHouseBulkCopyclass, adapting ClickHouse.Driver’s own nativeCopy.ClickHouseBulkCopyto theColumnMappings-based API the rest of the library expects. - ClickHouseBulkImportIdentityBehavior (
KeepIdentitydefault;ReturnIdentityalways throwsNotSupportedException, since ClickHouse has no identity/scope-identity mechanism). - ClickHouseBulkImportPseudoTableType (
Auto,Memory,Physical) — selects the staging-table strategy backingBulkMerge/BulkUpdate/BulkDelete/BulkDeleteByKey.BulkInsertnever uses a pseudo table. - ClickHouseBulkInsertMapItem — explicit source-to-destination column mapping for
BulkInsert/BulkMerge/BulkUpdate, with an optional explicit ClickHouse type name override. - ClickHouseBulkDbSetting and IClickHouseBulkDbSetting — a ClickHouseDbSetting subclass (and its interface) adding
IsWaitForMutationsEnabled, whichBulkMerge/BulkUpdate/BulkDeleteconsult to decide whether to block until theirALTER TABLEmutation completes. Not registered by default — pass an instance toUseClickHouse()or register it via DbSettingMapper to opt in. - Referenced the
RepoDbpackage. - Referenced the
RepoDb.ClickHousepackage. - Referenced the
ClickHouse.Driverpackagev1.3.0.
Known limitations (v1)
- ClickHouseBulkImportPseudoTableType.Auto and
Memoryboth currently resolve toPhysicalregardless of row count — the internal resolution logic returnsPhysicalon every outcome, so the session-privateMemory-engine staging path is implemented but not yet exercised. BulkMerge,BulkUpdate,BulkDeleteandBulkDeleteByKeyreport the number of rows staged into the pseudo table, not a confirmed post-mutation count —ALTER TABLE ... UPDATE/DELETEare asynchronous mutations, and neither they nor a plainINSERTreport a reliable affected-row figure throughClickHouse.Driver.- Every bulk call against
BulkMerge/BulkUpdate/BulkDelete/BulkDeleteByKeycreates its own physical staging table (DROP TABLE IF EXISTS+CREATE TABLE ... ENGINE = MergeTree ORDER BY tuple() AS SELECT ... WHERE (1 = 0)) and drops it once the call completes, rather than reusing one across calls. BulkInsert/BulkMergenever return generated identity values —identityBehavior: ReturnIdentityalways throwsNotSupportedException.