使用的第三方库
ClickHouse 利用第三方库来实现各种目的,例如连接其他数据库,在从磁盘加载/保存数据时解码/编码数据,或实现某些专门的 SQL 函数。为了独立于目标系统中可用的库,每个第三方库都被导入为 Git 子模块到 ClickHouse 的源代码树中,并与 ClickHouse 编译和链接。可以使用以下查询获取第三方库及其许可证的列表
SELECT library_name, license_type, license_path FROM system.licenses ORDER BY library_name COLLATE 'en';
请注意,列出的库位于 ClickHouse 存储库的 contrib/
目录中。根据构建选项,某些库可能尚未编译,因此,其功能可能在运行时不可用。
添加和维护第三方库
每个第三方库都必须位于 ClickHouse 存储库的 contrib/
目录下的专用目录中。避免将外部代码的副本转储到库目录中。而是创建一个 Git 子模块以从外部上游存储库拉取第三方代码。
ClickHouse 使用的所有子模块都列在 .gitmodule
文件中。
- 如果库可以直接使用(默认情况),您可以直接引用上游存储库。
- 如果库需要修补,请在 GitHub 上的 ClickHouse 组织 中创建上游存储库的分支。
在后一种情况下,我们的目标是尽可能将自定义补丁与上游提交隔离。为此,从您要集成的分支或标签中创建一个前缀为 ClickHouse/
的分支,例如 ClickHouse/2024_2
(对于分支 2024_2
)或 ClickHouse/release/vX.Y.Z
(对于标签 release/vX.Y.Z
)。避免跟踪上游开发分支 master
/ main
/ dev
(即,在前叉存储库中添加前缀分支 ClickHouse/master
/ ClickHouse/main
/ ClickHouse/dev
)。此类分支是移动的目标,这使得正确版本控制变得更加困难。“前缀分支”确保从上游存储库到分叉的拉取不会影响自定义 ClickHouse/
分支。contrib/
中的子模块只能跟踪分叉的第三方存储库的 ClickHouse/
分支。
补丁只针对外部库的 ClickHouse/
分支应用。
有两种方法可以做到这一点
- 您希望针对分叉存储库中的
ClickHouse/
前缀分支进行新的修复,例如清理程序修复。在这种情况下,将修复程序推送到一个前缀为ClickHouse/
的分支,例如ClickHouse/fix-sanitizer-disaster
。然后从新的分支到自定义跟踪分支创建一个 PR,例如ClickHouse/2024_2 <-- ClickHouse/fix-sanitizer-disaster
并合并 PR。 - 您更新子模块并需要重新应用以前的补丁。在这种情况下,重新创建旧的 PR 太繁琐了。相反,只需将较早的提交 cherry-pick 到新的
ClickHouse/
分支(对应于新版本)。您可以随意压缩具有多个提交的 PR 的提交。在最好的情况下,我们确实将自定义补丁贡献回上游,并且可以在新版本中省略补丁。
子模块更新后,将 ClickHouse 中的子模块提升到指向分叉中的新哈希值。
使用官方存储库创建第三方库的补丁,并考虑将补丁贡献回上游存储库。这将确保其他人也能从补丁中受益,并且不会给 ClickHouse 团队带来维护负担。