Clickhouse Logs Queries
supabase/supabase
Write, review, and migrate Supabase logs queries against the ClickHouse-backed logs table (the logs.all.otel analytics endpoint).
Update a ClickHouse third-party library (contrib submodule) to a new version.
$ npx skills add ClickHouse/ClickHouse --skill update-contrib -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ClickHouse/ClickHouse update-contrib --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/update-contrib .claude/skills/update-contrib && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "update-contrib" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/update-contrib into .claude/skills/update-contrib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-contrib", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/update-contribType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ClickHouse/ClickHouse --skill update-contrib -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ClickHouse/ClickHouse update-contrib --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/update-contrib .agents/skills/update-contrib && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "update-contrib" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/update-contrib into .agents/skills/update-contrib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-contrib", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ClickHouse/ClickHouse --skill update-contrib -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ClickHouse/ClickHouse update-contrib --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/update-contrib .cursor/skills/update-contrib && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "update-contrib" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/update-contrib into .cursor/skills/update-contrib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-contrib", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ClickHouse/ClickHouse.git --path .claude/skills/update-contrib--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ClickHouse/ClickHouse --skill update-contrib -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ClickHouse/ClickHouse update-contrib --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/update-contrib .gemini/skills/update-contrib && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "update-contrib" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/update-contrib into .gemini/skills/update-contrib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-contrib", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ClickHouse/ClickHouse update-contribInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ClickHouse/ClickHouse --skill update-contrib -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/update-contrib .github/skills/update-contrib && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "update-contrib" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/update-contrib into .github/skills/update-contrib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-contrib", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ClickHouse/ClickHouse --skill update-contrib -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ClickHouse/ClickHouse update-contrib --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ClickHouse/ClickHouse.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/update-contrib .opencode/skills/update-contrib && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "update-contrib" agent skill from https://github.com/ClickHouse/ClickHouse/tree/master/.claude/skills/update-contrib into .opencode/skills/update-contrib/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "update-contrib", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
update-contribUpdate a ClickHouse third-party library (contrib submodule) to a new version.
Update Contrib is an agent skill from ClickHouse/ClickHouse. Update a ClickHouse third-party library (contrib submodule) to a new version. Handles fork management, submodule pointer bumps, CMake adaptation, and source code fixes. Use when the user wants to bump a dependency.
Its SKILL.md is about 5.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `rust.md`).
It sits in Databases, covering Data warehousing. It works with ClickHouse, C++ and Git. The repository describes itself as: ClickHouse® is a real-time analytics database management system. The licence is Apache-2.0.
12 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit cd023af. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
AgentTaskBashReadWriteEditGlobGrepWebFetchAskUserQuestionFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitghcmakeFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
github.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Update Contrib loads about 5.3k tokens when it runs. Until then it costs about 57 tokens; SKILL.md has 2,416 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Agent, Task, Bash, Read, Write, Edit, Glob, Grep, WebFetch, AskUserQuestionAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ClickHouse/ClickHouse at commit cd023af, republished under its Apache-2.0 licence (© ClickHouse). 2,416 words, ~5,324 tokens.
.claude/skills/update-contrib/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Bump a git submodule under contrib/ to a new version, adapting CMake build files and ClickHouse source code as needed.
$0 (required): Library name as it appears under contrib/ (e.g., curl, openssl, arrow)$1 (optional): Target version — a git tag, branch, or commit SHA. If omitted, the latest upstream release tag is used.Interactive (a human runs /update-contrib): follow every step below, including the confirmations.
Non-interactive / pipeline mode: the invoking prompt states that the run is automated and passes the target, the branch name, the build directory and often a facts block (submodule URL, current pin, target commit, fork branch, CVE list). In that mode:
AskUserQuestion;gh; the pipeline pushes and opens the PR;BLOCKED.md path named in the prompt instead of improvising;REPORT.md) with an explicit "Open concerns" section
("none" when there are none).ClickHouse vendors all third-party libraries as git submodules under contrib/. Each library has:
contrib/<lib>/ — the submodule (upstream repo or a ClickHouse fork)contrib/<lib>-cmake/ — ClickHouse's own CMake build filescontrib/update-submodules.sh deletes the upstream CMakeLists.txt files after checkout; ClickHouse relies
exclusively on its own *-cmake/ files. Consequences: git -C contrib/<lib> status normally shows deleted
upstream CMake files — that is expected, do not restore them and do not re-run the deletion by hand; ninja does not
need it either.
Submodule URLs point to either upstream directly (unpatched) or a fork at github.com/ClickHouse/<repo> (when
patches are needed; the repo name may differ from the contrib name, e.g. contrib/cassandra → ClickHouse/cpp-driver).
Fork branches are named ClickHouse/<version> — usually the bare upstream tag (ClickHouse/v1.52.1,
ClickHouse/2.17.1), sometimes with the upstream's own prefix (ClickHouse/openssl-3.5.8,
ClickHouse/release-2.14.1) — never ClickHouse/master or ClickHouse/main. A pin can also sit on a fork branch
while .gitmodules still names the upstream URL (GitHub serves fork-network objects through the parent repo); check
the fork's branches before assuming a pin is a plain upstream commit.
Submodules are cloned shallow in most checkouts. git describe and git log OLD..NEW then report nonsense or fail;
run git -C contrib/<lib> fetch --unshallow --tags origin first (the pipeline does this for you).
A few libraries are built through cargo instead of a plain CMake file list — either from rust/workspace/<lib>/
(wasmtime) or from a contrib/<lib>-cmake/ file that drives cargo (chdig, delta-kernel-rs); they export
ch_rust::* targets. See rust.md for those.
Throughout this skill, $LIB refers to the library name passed as $0 and $VERSION to the target version once
resolved (step 2). Both must match [A-Za-z0-9._-]+ so they are safe to use unquoted in paths and branch names;
reject anything else.
Skip whatever the prompt already states. Otherwise:
git config --file .gitmodules --get "submodule.contrib/$LIB.url" # upstream or ClickHouse fork?
git -C "contrib/$LIB" rev-parse HEAD # current pin
git -C "contrib/$LIB" fetch --unshallow --tags origin 2>/dev/null || git -C "contrib/$LIB" fetch --tags origin
git -C "contrib/$LIB" describe --tags --abbrev=0 2>/dev/null || echo "no tags"Then locate the integration file(s) and keep them in $INTEGRATION; every later step works from that variable.
Three shapes exist:
INTEGRATION=$(ls contrib/${LIB}-cmake/CMakeLists.txt rust/workspace/${LIB}/CMakeLists.txt 2>/dev/null)
# Shared wrapper: no directory of its own, built by another contrib's CMake file
# (aws-c-auth → contrib/aws-cmake/, the aws-c-* family; individual boost libs → contrib/boost-cmake/).
[ -n "$INTEGRATION" ] || INTEGRATION=$(grep -rl "contrib/${LIB}\b" contrib/*-cmake/CMakeLists.txt)
echo "$INTEGRATION"; [ -n "$INTEGRATION" ] || echo "no integration file found — stop and report"
grep -n "\b${LIB}\b" contrib/CMakeLists.txt rust/workspace/CMakeLists.txt # where it is addedcontrib/<lib>-cmake/CMakeLists.txt;rust/workspace/<lib>/CMakeLists.txt (wasmtime) or a contrib/<lib>-cmake/ file that drives
cargo (chdig, delta-kernel-rs) — see rust.md;ch_contrib::aws_s3 for every
aws-c-* library) are what steps 8, 9 and 11 must use.Do not assume the exported target is ch_contrib::${LIB}. Take the actual alias names from $INTEGRATION
and grep for those — Rust-backed libraries export ch_rust::* (ch_rust::wasmtime, ch_rust::chdig,
ch_rust::delta_kernel_rs), a few keep upstream-style names (OpenSSL::SSL, boost::filesystem), and one
library can export several:
ALIASES=$(grep -ho 'add_library *( *[A-Za-z0-9_:.-]*::[A-Za-z0-9_.-]* *ALIAS' $INTEGRATION \
| sed -E 's/add_library *\( *//; s/ *ALIAS$//' | sort -u)
echo "$ALIASES"
for a in $ALIASES; do grep -rl --include=CMakeLists.txt -F "$a" src programs base rust; done | sort -u # consumersRead $INTEGRATION once; it tells you which sources are compiled, which defines and generated headers exist, and
whether the library is header-only (add_library(... INTERFACE) — then nothing of it is compiled and only its
consumers can break). The consumer list is what steps 9 and 11 work from.
If $1 was provided, use it. Otherwise, find the latest release:
git -C "contrib/$LIB" tag -l --sort=-v:refname | head -20
# For ClickHouse forks, also check the upstream repo: git ls-remote --tags <upstream-url>Interactive mode only: present the current and target versions to the user with AskUserQuestion for confirmation
before proceeding. VERSION is whatever was confirmed (or $1). Verify it matches the charset above before using it
in branch names or commits.
First decide whether the pin is a plain upstream commit. Do not rely on the .gitmodules URL alone: origin is
the upstream repo when the URL names upstream, and ls-remote --heads origin 'ClickHouse/*' then returns nothing
even if the pin sits on a fork branch. Check that HEAD is reachable from an upstream ref, and probe the fork
separately (pipeline mode: the facts block names the fork URL and branch — use them):
git -C "contrib/$LIB" fetch --tags origin '+refs/heads/*:refs/remotes/origin/*' # full upstream refs (step 1)
git -C "contrib/$LIB" branch -r --contains HEAD | head -3 # empty: not an upstream commit
git -C "contrib/$LIB" tag --contains HEAD | head -3
UPSTREAM_URL=$(git config --file .gitmodules --get "submodule.contrib/$LIB.url")
FORK_URL="https://github.com/ClickHouse/$(basename "$UPSTREAM_URL" .git)" # guess; may differ (cassandra → cpp-driver)
git -C "contrib/$LIB" fetch "$FORK_URL" '+refs/heads/ClickHouse/*:refs/remotes/ch-fork/ClickHouse/*' 2>/dev/null
git -C "contrib/$LIB" branch -r --contains HEAD 'ch-fork/*' # non-empty: pin lives on a fork branchClassify:
HEAD is on an upstream branch or tag and on no ch-fork/ClickHouse/* branch → unpatched upstream pin; skip
the rest of this step.HEAD is on a ch-fork/ClickHouse/* branch → forked, patched pin (even when .gitmodules names upstream; step 5
fixes the URL). Continue below.HEAD is on neither and the fork guess failed (fetch errored or the repo name differs) → do not conclude
"unpatched". Interactive mode: ask the user for the fork URL. Pipeline mode: stop and record the reason in
BLOCKED.md.For a forked pin, identify the patches that must survive the bump:
UPSTREAM_TAG=$(git -C "contrib/$LIB" describe --tags --abbrev=0) # needs full history (step 1)
git -C "contrib/$LIB" log --oneline "$UPSTREAM_TAG"..HEAD # ClickHouse-specific commitsReport the patches found. A patch is obsolete only when upstream now contains an equivalent fix — verify in the code, not by commit subject.
git checkout -b "bump-${LIB}-${VERSION}" # pipeline mode: use the branch name given in the promptIf the library uses a ClickHouse fork and has patches, the new branch ClickHouse/<new-version> must exist in the
fork with the patches rebased onto the upstream tag before the ClickHouse-side bump:
cherry-pick -x the patches in
order (authors preserved), resolve conflicts from the new upstream code, drop only patches that upstream has
absorbed. Do not push until the build is validated and the user confirms.If the library has no ClickHouse patches but uses a fork, switch the submodule to the upstream URL instead of
creating a new fork branch (update .gitmodules, see step 6). Conversely, if step 3 found the pin on a fork branch
while .gitmodules names upstream, fix the URL to the fork in the same commit. Never rewrite a URL to upstream
unless step 3 positively classified the pin as an unpatched upstream commit.
git -C "contrib/$LIB" fetch origin # plus the fork URL / branch when the target lives there
git -C "contrib/$LIB" checkout <target-commit>
git add "contrib/$LIB"If the submodule URL changes (fork → upstream, or a fork whose URL was wrong), also update .gitmodules and run
git submodule sync -- "contrib/$LIB":
git config --file .gitmodules "submodule.contrib/$LIB.url" "<new-url>"
git add .gitmodulesgit submodule status must show no + line for the library when you are done (a + means the working tree is
not at the recorded commit).
This is the step that determines what CMake and source changes are needed:
OLD_COMMIT=$(git rev-parse "HEAD:contrib/$LIB"); NEW_COMMIT=$(git -C "contrib/$LIB" rev-parse HEAD)
git -C "contrib/$LIB" diff --stat "$OLD_COMMIT..$NEW_COMMIT"
git -C "contrib/$LIB" diff --name-status "$OLD_COMMIT..$NEW_COMMIT" -- '*.c' '*.cpp' '*.cc' '*.h' '*.hpp' '*.in' 'CMakeLists.txt'Pay attention to:
src/*.in templates / generated headers — regenerate the delta, never overwrite a checked-in generated
header wholesale (diff generator(old) vs generator(new) and apply only that)Read the changelog/release notes for API and behaviour changes (stored formats, output changes, dependency version floors that force co-bumps).
Update the file(s) in $INTEGRATION from step 1 (contrib/<lib>-cmake/CMakeLists.txt, a shared wrapper such as
contrib/aws-cmake/CMakeLists.txt, or the Rust files — see rust.md) to reflect the new version:
find_package/find_path/find_library,
check_c_compiler_flag, check_cxx_compiler_flag, check_c_source_compiles, check_include_file,
check_symbol_exists, check_type_size, cmake_push_check_state, CMAKE_REQUIRED_FLAGS, or any Check* CMake
module — these are forbidden by CI style checks (ci/jobs/scripts/check_style/check_cpp.sh) for hermetic,
cross-compiled builds. Use hardcoded feature flags instead of runtime detection.contrib/<lib>-cmake/ carries config headers (config.h.in, hardcoded *_config.h), update them for new
version strings, defines or feature flags.protoc or flatc) must be a native host tool: register
it with add_native_target, use the IMPORTED_LOCATION under native/ for cross builds, and add its directory
from the block in contrib/CMakeLists.txt where disable_dummy_launchers_if_needed restores the real toolchain
(clang-tidy builds otherwise produce an empty, non-executable binary)..spec), re-run cmake after the bump;
otherwise incremental builds keep a stale generated version header.Find the consumers (step 1's alias grep — ch_contrib::*, ch_rust::* or whatever the integration file exports)
and, if the public API changed, the includes:
grep -rl "#include.*[<\"]$LIB" src/ --include='*.h' --include='*.cpp'Common adaptation patterns: renamed functions or classes, changed signatures, removed deprecated API, new required initialisation calls, changed header paths, missing feature guards in copied public headers.
Build to find compilation errors, using the existing build directory ($BUILD_DIR, the one named in the prompt or an
existing build*/ directory; configure one with cmake -S . -B <dir> only if none exists — see
docs/resources/develop-contribute/build/build.mdx):
ninja -C "$BUILD_DIR" <lib-target> > "$BUILD_DIR/build_bump_${LIB}_lib.log" 2>&1; echo "exit=$?"
ninja -C "$BUILD_DIR" clickhouse > "$BUILD_DIR/build_bump_${LIB}.log" 2>&1; echo "exit=$?"
grep ' error:' "$BUILD_DIR/build_bump_${LIB}.log" | head -20 || true # grep exits 1 on a clean log: not a failureRun builds in the foreground and wait for them; never start them in the background and poll, and never use
pgrep -f/kill -0 loops on a pattern that matches your own shell. The ninja exit code decides whether the build
passed (exit=0); the grep only lists the errors to fix, and its own exit status is 1 when there are none, so
do not chain it with && or run it under set -e. Do not spawn a sub-agent to read the log. For a header-only library the clickhouse
target is the only thing that can break. Fix errors iteratively, committing each logical fix separately.
Do not run unit-test or gtest binaries unless the task asks for it, and never run any binary with the repository
root as the working directory (it litters the checkout with store/, access/, preprocessed_configs/, test_*);
use the build directory or /tmp.
After all fixes, rebuild the library target and clickhouse once more and check the exit codes as above. Common
issues: missing source files in CMake, changed include paths, API changes requiring source adaptation,
platform-specific issues (macOS, FreeBSD, musl, cross-compilation) that only CI can show, stale generated headers.
Interactive mode: only after the build is validated ask the user whether it is ok to push. Until then, keep both the ClickHouse branch and any fork branch local-only.
If the library's output is user-visible (formatting, hashing, compression, geometry, text processing), compare a few representative queries between the previous binary and the new one. Byte-identical output is required for text formatting and hashes; for floating-point, geometry and compressor libraries a difference is acceptable only when the decoded data round-trips identically, every difference is explained by a named upstream change, and the affected stateless test references are updated. A stored/on-disk/wire format change (codec frame version, serialisation) is a compatibility break: state exactly what becomes unreadable and which setting gates the feature.
Then find the stateless tests that exercise the library and run them if a server is available to you (pipeline mode: the pipeline runs them, just list them in the report):
grep -rl "$LIB" tests/queries/0_stateless/ --include='*.sql' --include='*.sh' | head -20Use the title format Bump \<lib>` from <old_version> to <new_version> for straightforward bumps, or a more descriptive title if the update has a specific motivation. Stage every affected integration artifact, not just the submodule pointer (.gitmodules, contrib/<lib>-cmake/, src/` fixes, test references). Do not amend or rebase;
iterative "Fix build" / "Fix darwin" / "Fix MSan" commits are normal.
Examples of good commit messages from past PRs:
Bump \curl` to 8.12.1`Update Boost from 1.83 to 1.90Update librdkafka to fix lock-order-inversion in queue refcountBefore creating the PR, make sure every required branch has been pushed with the user's confirmation: the
ClickHouse branch, any ClickHouse/<version> branch in a contrib fork (opened as a PR against that fork's base
branch first), and any rust_vendor branch.
Use the PR template at .github/PULL_REQUEST_TEMPLATE.md. Keep the description short and structured: one sentence
of what and why; bullets for CVEs with their applicability; bullets for the ClickHouse-side changes; bullets for
user-visible behaviour changes (a stored-format change is a compatibility warning); for forks, which patches are
carried. Never enumerate what did not change. Changelog category for contrib bumps is
Build/Testing/Packaging Improvement with the entry Update `<lib>` to <version>.; use Bug Fix only when the
PR exists to fix a specific user-visible bug.
gh pr create --draft --title "<title>" --body-file <body.md>Some libraries require co-bumping dependencies. contrib/CMakeLists.txt documents them in # requires: comments
(the list below reflects it as of 2026-09; check the file, it is the source of truth):
arrow requires: snappy, thrift, double-conversion, xsimd (and regenerates its flatbuffers bindings)avro requires: snappyAMQP-CPP requires: libuvcassandra requires: libuvlibrdkafka requires: libgsasllibhdfs3 requires: google-protobuf, krb5, isa-lhive-metastore requires: thrift, avro, arrow, libhdfs3rocksdb requires: jemalloc, snappy, zlib, lz4, zstd, liburingmongo-c-driver requires: zlib; mongo-cxx-driver requires mongo-c-driver (libmongoc, libbson) at a
minimum version stated in its CMakeLists.txt — bump both in one PR when the floor movesusearch requires: FP16, SimSIMDsubstrait requires: google-protobufgoogle-protobuf and grpc are coupled (gRPC bundles its own upb; both copies must not end up in one binary)aws, aws-c-auth, aws-c-cal, aws-c-common, aws-c-compression, aws-c-event-stream,
aws-c-http, aws-c-io, aws-c-mqtt, aws-c-s3, aws-c-sdkutils, aws-checksums, aws-crt-cppIf the target library appears in a chain, check whether its dependencies also need updating.
After pushing, CI will automatically:
submodule changed labelcheck_submodules.sh: every .gitmodules entry has a directory, URLs start with https://github.com/,
submodule name equals its path, no recursive submodules (no [submodule entries inside submodules)check_cpp.sh: contrib/*-cmake/ must not use the forbidden CMake patterns listed in step 8.gitmodules file must not use branch = ... tagsgit -C contrib/<lib> status are expected (see Background)© ClickHouse, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .claude/skills/update-contrib of ClickHouse/ClickHouse.
Open the folder on GitHubat commit cd023af
Update Contrib next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Update Contrib this skillClickHouse/ClickHouse | 50k | — | ~5.3k | Automated safety check: Notes | Apache-2.0 | |
| Clickhouse Logs Queriessupabase/supabase | 111k | — | ~2.4k | Automated safety check: Pass | Apache-2.0 | |
| Chdb SQLvemetric/vemetric | 394 | 1 repos | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| Clickhouse Architecture Advisorvemetric/vemetric | 394 | 2 repos | ~791 | Automated safety check: Pass | Apache-2.0 | |
| Observal AdminObserval/Observal | 4.2k | — | ~774 | Automated safety check: Pass | Apache-2.0 | |
| ClickHouse RowBinary for Node.jsClickHouse/agent-skills | 544 | — | ~1.3k | Automated safety check: Pass | Apache-2.0 |
supabase/supabase
Write, review, and migrate Supabase logs queries against the ClickHouse-backed logs table (the logs.all.otel analytics endpoint).
vemetric/vemetric
A skill your agent uses when the user wants to run SQL — especially analytical SQL — on local files (parquet/csv/json), URLs, S3 paths, or remote databases (Postgres, MySQL, MongoDB, ClickHouse…
vemetric/vemetric
MUST USE when designing ClickHouse architectures, selecting between ingestion or modeling patterns, or translating best practices into workload-specific system designs.
Observal/Observal
Administers Observal users, settings, diagnostics, review queues, security events, audit logs, SAML, SCIM, the local Observal server, its upgrades and rollback, and its own PostgreSQL and ClickHouse…
ClickHouse/agent-skills
Generates TypeScript or JavaScript readers and writers for ClickHouse's RowBinary formats over HTTP in Node.js, after checking that RowBinary suits the data.
vemetric/vemetric
MUST USE when reviewing ClickHouse schemas, queries, or configurations.
ClickHouse/ClickHouse
Analyze ClickHouse Keeper stress-test results from play.clickhouse.com / keeperstresstests data warehouse.
ClickHouse/ClickHouse
Evaluate ClickHouse performance test results from existing CI/dashboard data or local perf.py runs.
ClickHouse/ClickHouse
Check whether ClickHouse's supported versions (last 3 majors + latest LTS) have recent stable patch releases, diagnose why the scheduled AutoReleases pipeline failed, and identify which releases…
ClickHouse/ClickHouse
Analyze a jemalloc (or other) allocation profile in collapsed stack format.
ClickHouse/ClickHouse
Bisect a ClickHouse regression using pre-built master binaries from CI.
ClickHouse/ClickHouse
Generate PR descriptions for ClickHouse/ClickHouse that match maintainer expectations.
Works with
Categories
Update a ClickHouse third-party library (contrib submodule) to a new version. Update Contrib is an agent skill from ClickHouse/ClickHouse. Update a ClickHouse third-party library (contrib submodule) to a new version.
Update Contrib fits situations like: the user wants to bump a dependency; tasks that involve Data warehousing.
Run `npx skills add ClickHouse/ClickHouse --skill update-contrib -a claude-code`. Or copy the skill folder (.claude/skills/update-contrib in ClickHouse/ClickHouse) into .claude/skills/update-contrib in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ClickHouse/ClickHouse --skill update-contrib -a codex`. Or copy the skill folder (.claude/skills/update-contrib in ClickHouse/ClickHouse) into .agents/skills/update-contrib in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ClickHouse/ClickHouse --skill update-contrib -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/update-contrib, .gemini/skills/update-contrib, .github/skills/update-contrib and .opencode/skills/update-contrib in your project.
Going by SKILL.md and its folder, Update Contrib needs the command-line tools its instructions call (git, gh and cmake). Its frontmatter pre-approves these tools: Agent, Task, Bash, Read, Write, Edit, Glob, Grep, WebFetch, AskUserQuestion.
SKILL.md names 1 domain. In commands or code: github.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Update Contrib is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.3k tokens (SKILL.md is roughly 21k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Update Contrib: Clickhouse Logs Queries (supabase/supabase, 111k stars), Chdb SQL (vemetric/vemetric, 394 stars), Clickhouse Architecture Advisor (vemetric/vemetric, 394 stars) and Observal Admin (Observal/Observal, 4.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ClickHouse (a GitHub organization) maintains it in ClickHouse/ClickHouse, which has 50,288 GitHub stars. The repository holds 24 skills in this directory. The repository was last updated on October 8, 2026.
Source: ClickHouse/ClickHouse on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.