Compare commits

...

1 Commits

Author SHA1 Message Date
Evan Rusackas
5147a64232 fix(clickhouse): use equality for boolean filters instead of IS
ClickHouse rejects the `column IS true/false` syntax that Superset
generates for boolean filters, producing queries like
`WHERE is_cancelled IS false` that fail to execute.

Set `use_equality_for_boolean_filters = True` on
`ClickHouseBaseEngineSpec` so boolean filters render as
`= true`/`= false`, reusing the engine-spec toggle already added for
Snowflake in #34199 (also used by Athena and Presto).

Fixes #33235

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-07 16:38:46 -07:00
2 changed files with 43 additions and 0 deletions

View File

@@ -56,6 +56,9 @@ class ClickHouseBaseEngineSpec(BaseEngineSpec):
time_groupby_inline = True
supports_multivalues_insert = True
# ClickHouse doesn't support IS true/false syntax, use = true/false instead
use_equality_for_boolean_filters = True
_time_grain_expressions = {
None: "{col}",
"PT1M": "toStartOfMinute(toDateTime({col}))",

View File

@@ -233,3 +233,43 @@ def test_adjust_engine_params_fully_qualified(
uri = spec.adjust_engine_params(url, {}, None, schema)[0]
assert str(uri) == expected_result
def test_handle_boolean_filter() -> None:
"""
Test that ClickHouse uses equality operators for boolean filters instead of IS.
ClickHouse rejects the ``column IS true/false`` form, so boolean filters must
render as ``column = true/false``.
"""
from sqlalchemy import Boolean, Column
from superset.db_engine_specs.clickhouse import ClickHouseBaseEngineSpec
from superset.utils.core import FilterOperator
bool_col = Column("test_col", Boolean)
result_true = ClickHouseBaseEngineSpec.handle_boolean_filter(
bool_col, FilterOperator.IS_TRUE, True
)
assert (
str(result_true.compile(compile_kwargs={"literal_binds": True}))
== "test_col = true"
)
result_false = ClickHouseBaseEngineSpec.handle_boolean_filter(
bool_col, FilterOperator.IS_FALSE, False
)
assert (
str(result_false.compile(compile_kwargs={"literal_binds": True}))
== "test_col = false"
)
def test_use_equality_for_boolean_filters_property() -> None:
"""
Test that ClickHouse has the use_equality_for_boolean_filters property set.
"""
from superset.db_engine_specs.clickhouse import ClickHouseBaseEngineSpec
assert ClickHouseBaseEngineSpec.use_equality_for_boolean_filters is True