← All database systems

ClickHouse is supported by SQLancer — the main repository ships a testing implementation for it. SQLancer is credited with 48 bugs in it, reported between 2020-06-24 and 2026-09-12. Its source is at ClickHouse/ClickHouse.

A further 1 report was filed and rejected by the developers as invalid or duplicate. Those are kept in the dataset for transparency and are excluded from every count here.

How the project uses SQLancer

Official ci

The ClickHouse project runs SQLancer from its own repository (.github/workflows/nightly_sqlancer.yml).

PYTHONUNBUFFERED=1 python3 -m praktika run 'Dockers Build (amd)' --workflow "NightlySQLancer" --ci --timestamp
.github/workflows/nightly_sqlancer.yml in the ClickHouse repository invokes SQLancer.
.github/workflows/nightly_sqlancer.yml last verified 2026-09-13

Official testing

The ClickHouse project maintains its own SQLancer fork, 209 commit(s) ahead of upstream, last updated 2026-09-02.

# `clickhouse/sqlancer-test` image (ci/docker/sqlancer-test/Dockerfile) installs
ci/jobs/sqlancer_pp_job.sh in the ClickHouse repository invokes SQLancer.
ci/jobs/sqlancer_pp_job.sh last verified 2026-09-13
# `ci/docker/sqlancer-test/Dockerfile`), but that image is only rebuilt when its
ci/jobs/sqlancer_job.sh in the ClickHouse repository invokes SQLancer.
ci/jobs/sqlancer_job.sh last verified 2026-09-13
ClickHouse/sqlancer is a fork of sqlancer/sqlancer under the ClickHouse project's own GitHub organisation, 209 commit(s) ahead of upstream.
/github.com/ClickHouse/sqlancer last verified 2026-09-13

How the bugs break down

By year reported

2020
5
2021
4
2022
2
2023
2
2024
2
2025
3
2026
29
Year not recorded
1

Who found them

Found by the SQLancer project
7
Found by someone outside the project
41

By status

Fixed
36
Confirmed
1
Open
11

By symptom

Unclassified
48

By technique

Technique not recorded
32
Ternary Logic Partitioning (TLP)
11
Differential Query Plans (DQP)
2
Non-optimizing Reference Engine Construction (NoREC)
2
Constant-Optimization-Driven Testing (CODDTest)
1

Why each bug counts

The report names SQLancer
26
The reproducer carries SQLancer's generated schema
10
The report names a SQLancer oracle
8
Filed by someone who runs SQLancer campaigns
4

Who reported them (8)

qoega
20
fm4v
12
wanteatfruit
3
Algunenano
2
alexey-milovidov
2
suyZhong
2
zlareb1
2
123lpygithub
1

Every bug on record (49)

One row per report, newest first, each linking to the report itself. Rejected reports are marked and are not part of any count above.

Reported Report Status Technique Reporter
2026-09-12 `STREAM BOUNDED CURSOR` read reports rows to `count()` but returns no column values (`sum`, `GROUP BY` and ... open TLP alexey-milovidov
2026-09-12 Correlated scalar subquery `(SELECT nan_col) IS NULL` returns wrong result under default `query_plan_enable... open DQP qoega
2026-09-11 AST fuzzer: TLP Aggregate oracle mismatch with `STREAM BOUNDED UNORDERED CURSOR` open TLP JasonLi-cn
2026-09-08 Wrong results: per-partition `GROUP BY` / `DISTINCT` / window skip the cross-partition merge for `date_col ... open fm4v
2026-08-16 NightlySQLancer: LIMIT 1 BY returned the same key twice under ORDER BY (not reproduced) open alexey-milovidov
2026-08-10 LOGICAL_ERROR (Code 49) in a three-way join with a VIEW fixed wanteatfruit
2026-08-10 Code 10 `NOT_FOUND_COLUMN_IN_BLOCK` for a right-side join column inside a lambda in `PREWHERE` fixed wanteatfruit
2026-08-01 Unexpected results with a minmax index and a NULL-containing `SOME` comparison open suyZhong
2026-07-30 `RANK()` / `DENSE_RANK()` with an explicit `ROWS` frame silently degenerate into `ROW_NUMBER()` open wanteatfruit
2026-06-15 LOGICAL_ERROR "Not-ready Set ... for function 'in'": IN-subquery inside an expression on a PARTITION BY tab... fixed fm4v
2026-06-12 Wrong results: ORDER BY col DESC LIMIT 1 returns 0 rows — TopK granule skip-index (use_skip_indexes_for_top... fixed fm4v
2026-06-10 `DISTINCT` over `GROUP BY ... WITH CUBE/ROLLUP/GROUPING SETS` returns duplicates (`query_plan_remove_redund... fixed DQP qoega
2026-06-10 Join reordering returns a different result for a LEFT ANTI / RIGHT SEMI / INNER join chain closed not a bug fm4v
2026-06-10 Block structure mismatch in `UnionStep` stream when `UNION ALL` branches differ only in `WHERE` and one bra... fixed TLP qoega
2026-06-05 Wrong results: GROUP BY on the partition key with a WHERE filter is served from _minmax_count_projection an... fixed fm4v
2026-06-05 TLP partitioning over a mixed `RIGHT JOIN` + comma join tree can produce rows from an empty result set fixed TLP 123lpygithub
2026-06-04 Wrong result: WHERE toStartOfYear(Date32) < const returns 0 rows after merge when column has pre-1970 values fixed fm4v
2026-06-04 LOGICAL_ERROR "Join restriction violated" in JoinOrderOptimizer on comma-join + LEFT JOIN with IS NULL in O... fixed NOREC fm4v
2026-06-01 Wrong results: equality predicate (col = const) drops rows when ORDER BY key is a NaN-producing function (s... fixed fm4v
2026-05-29 Wrong results: partition pruning with intDiv/divide by a negative constant drops rows for range predicates fixed CODDTEST fm4v
2026-05-29 Wrong results: SummingMergeTree FINAL drops a present row when reading only a summation column that is 0 fo... open fm4v
2026-05-29 Row policy with a bare-column USING expression: LOGICAL_ERROR "Duplicate column name ... in row policy acti... fixed fm4v
2026-05-19 `__bitWrapperFunc` internal assertion ("It's a bug!") on Float WHERE predicate against a `TYPE set(N)` skip... fixed TLP fm4v
2026-05-15 `WHERE x OR x` silently drops rows whose low byte is 0 on non-UInt8 columns fixed NOREC fm4v
2026-05-08 `WHERE p AND ` returns zero rows on `MergeTree` fixed qoega
2026-05-06 `QueryConditionCache` is poisoned by AST fuzzer queries — subsequent normal `WHERE` queries return zero rows fixed TLP qoega
2026-04-17 WHERE x AND toNullable(N) returns 0 rows for any N >= 256 fixed TLP qoega
2026-03-30 `(2147483648 > b) AND 2147483648` is not the same result as `(2147483648 > b)` fixed qoega
2026-03-18 MIN/MAX produces non-deterministic results when input contains NaN fixed TLP zlareb1
2026-03-18 LEFT ANTI JOIN right-table columns contain left key values instead of default values fixed TLP zlareb1
2025-05-25 Equivalent semi join but the second form produces Cannot clone ReadFromStorage plan step fixed Zhaokun Xiang
2025-02-25 Crash after Logical error: 'sign's argument does not match the expected data type'. fixed qoega
2025-02-04 SQLancer: No equality condition found in JOIN ON expression fixed Algunenano
2024-09-13 Inconsistent representation of bool values open suyZhong
2024-07-25 Adding condition that is true we get no result from a table fixed qoega
2023-12-28 Flaky result of the expression open qoega
2023-07-13 LOGICAL_ERROR: Arguments of 'lcm' have incorrect data types fixed Algunenano
2022-11-30 [sqlancer] "Cannot convert NULL value to non-Nullable type" or corrupted sum() value. fixed qoega
2022-11-09 Sigsegv Interpreters/Aggregator.cpp in memory sanitiser build fixed qoega
2021-05-11 Cannot convert column `less(c0, c1)` because it is non constant in source stream but must be constant in re... fixed qoega
2021-04-13 Logical error: Block structure mismatch in QueryPipeline::unitePipelines stream: different columns fixed TLP songenjie
2021-01-20 UndefinedBehaviorSanitizer AggregateFunctionAvg.h:153: runtime error: signed integer overflow: ... cannot b... fixed qoega
2021-01-20 Logical error: 'Constraint `x0` does not return a value of type UInt8 fixed qoega
2020-08-19 MAX over empty set should return NULL according to standard SQL fixed qoega
2020-07-10 Invalid number of rows in Chunk column Int32: expected 99, got 5: While executing TinyLog fixed qoega
2020-07-07 HAVING clause can change result of aggregation fixed TLP qoega
2020-06-24 Not obvious error message [Attempt to read after eof: while converting '' to Int32] open qoega
2020-06-24 Non-trivial error if Int is used in WHERE expression[DB::Exception: Bad get: has Int64, requested UInt64] fixed qoega
Unexpected result when comparing IN expression and integer verified Suyang Zhong

Every figure on this page is computed from _data/impact/. The attribution policy explains what has to be true for a bug to be counted.