Перейти к основному содержанию
ClickHouse использует сторонние библиотеки для различных целей, например для подключения к другим базам данных, декодирования/кодирования данных при загрузке с диска и сохранении на диск, а также для реализации некоторых специализированных SQL-функций. Чтобы не зависеть от библиотек, доступных в целевой системе, каждая сторонняя библиотека импортируется в дерево исходного кода ClickHouse как Git-подмодуль, а затем компилируется и линкуется вместе с ClickHouse. Список сторонних библиотек и их лицензий можно получить с помощью следующего запроса:
SELECT library_name, license_type, license_path FROM system.licenses ORDER BY library_name COLLATE 'en';
Обратите внимание, что перечисленные библиотеки находятся в каталоге contrib/ репозитория ClickHouse. В зависимости от параметров сборки некоторые из этих библиотек могли не скомпилироваться, и в результате их функциональность может быть недоступна при выполнении. Пример

Добавление и сопровождение сторонних библиотек

Каждая сторонняя библиотека должна находиться в отдельном каталоге внутри каталога contrib/ репозитория ClickHouse. Не стоит просто складывать копии внешнего кода в каталог библиотеки. Вместо этого создайте Git-подмодуль, чтобы подтягивать сторонний код из внешнего upstream-репозитория. Все submodule, используемые в ClickHouse, перечислены в файле .gitmodule.
  • Если библиотеку можно использовать как есть (это вариант по умолчанию), можно напрямую ссылаться на upstream-репозиторий.
  • Если библиотека требует патчей, создайте fork upstream-репозитория в организации ClickHouse на GitHub.
Во втором случае мы стремимся максимально изолировать собственные патчи от коммитов upstream-репозитория. Для этого создайте branch с prefix ClickHouse/ от branch или tag, который вы хотите интегрировать, например ClickHouse/2024_2 (для branch 2024_2) или ClickHouse/release/vX.Y.Z (для tag release/vX.Y.Z). Не используйте ветки разработки upstream-репозитория master/ main / dev (то есть ветки с префиксом ClickHouse/master / ClickHouse/main / ClickHouse/dev в fork-репозитории). Такие ветки постоянно меняются, что затрудняет корректное управление версиями. «Ветки с префиксом» гарантируют, что pulls из upstream-репозитория в fork не затронут собственные ветки ClickHouse/. Submodule в contrib/ должны отслеживать только ветки ClickHouse/ в fork-репозиториях сторонних библиотек. Патчи применяются только к веткам ClickHouse/ внешних библиотек. Это можно сделать двумя способами:
  • если вы хотите внести новое исправление в ветку с префиксом ClickHouse/ в fork-репозитории, например исправление для sanitizer, отправьте его как branch с prefix ClickHouse/, например ClickHouse/fix-sanitizer-disaster. Затем создайте PR из новой ветки в пользовательскую ветку отслеживания, например ClickHouse/2024_2 <-- ClickHouse/fix-sanitizer-disaster, и выполните merge PR.
  • если вы обновляете submodule и вам нужно повторно применить более ранние патчи, заново создавать старые PR будет излишне. Вместо этого просто выполните cherry-pick старых коммитов в новую ветку ClickHouse/ (соответствующую новой версии). При необходимости можно сделать squash коммитов из PR, где было несколько коммитов. В идеале мы уже отправили собственные патчи обратно в upstream и можем не переносить их в новую версию.
После обновления submodule обновите ссылку на submodule в ClickHouse так, чтобы она указывала на новый hash в fork. Создавайте патчи для сторонних библиотек с прицелом на официальный репозиторий и по возможности отправляйте их обратно в upstream-репозиторий. Это позволит и другим воспользоваться патчем и снизит нагрузку на сопровождение для команды ClickHouse.
Последнее изменение 10 июня 2026 г.