You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by ru...@apache.org on 2026/07/07 23:40:12 UTC

(superset) 01/01: fix(clickhouse): use equality for boolean filters instead of IS

This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch fix/issue-33235-clickhouse-boolean-equality
in repository https://gitbox.apache.org/repos/asf/superset.git

commit 5147a6423249e970864eb7d540196166e098af2e
Author: Evan Rusackas <ev...@rusackas.com>
AuthorDate: Tue Jul 7 16:38:46 2026 -0700

    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 <no...@anthropic.com>
---
 superset/db_engine_specs/clickhouse.py             |  3 ++
 .../unit_tests/db_engine_specs/test_clickhouse.py  | 40 ++++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/superset/db_engine_specs/clickhouse.py b/superset/db_engine_specs/clickhouse.py
index a998dce75e5..ae200ce831a 100644
--- a/superset/db_engine_specs/clickhouse.py
+++ b/superset/db_engine_specs/clickhouse.py
@@ -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}))",
diff --git a/tests/unit_tests/db_engine_specs/test_clickhouse.py b/tests/unit_tests/db_engine_specs/test_clickhouse.py
index 5f56554e82d..9706d5bf4fc 100644
--- a/tests/unit_tests/db_engine_specs/test_clickhouse.py
+++ b/tests/unit_tests/db_engine_specs/test_clickhouse.py
@@ -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