diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 275cc0cdbf4e..d7d6a3651b57 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -523,6 +523,13 @@ def filter_values_handler( # pylint: disable=too-many-arguments # noqa: C901 def handle_single_value(value: FilterValue | None) -> FilterValue | None: if operator == utils.FilterOperator.TEMPORAL_RANGE: return value + + if ( + isinstance(value, (float, int)) + and target_generic_type == utils.GenericDataType.NUMERIC + ): + value = float(value) + if ( isinstance(value, (float, int)) and target_generic_type == utils.GenericDataType.TEMPORAL @@ -548,6 +555,10 @@ def handle_single_value(value: FilterValue | None) -> FilterValue | None: ): # For backwards compatibility and edge cases # where a column data type might have changed + try: + value = float(value) + except ValueError: + logger.warning(f"Unable to convert {value} to float") return utils.cast_to_num(value) if value == NULL_STRING: return None diff --git a/superset/models/helpers.py b/superset/models/helpers.py index db05b415848a..d3d404f30d53 100644 --- a/superset/models/helpers.py +++ b/superset/models/helpers.py @@ -1162,6 +1162,12 @@ def filter_values_handler( # pylint: disable=too-many-arguments # noqa: C901 def handle_single_value(value: Optional[FilterValue]) -> Optional[FilterValue]: if operator == utils.FilterOperator.TEMPORAL_RANGE: return value + + if ( + isinstance(value, (float, int)) + and target_generic_type == utils.GenericDataType.NUMERIC + ): + value = float(value) if ( isinstance(value, (float, int)) and target_generic_type == utils.GenericDataType.TEMPORAL @@ -1187,6 +1193,10 @@ def handle_single_value(value: Optional[FilterValue]) -> Optional[FilterValue]: ): # For backwards compatibility and edge cases # where a column data type might have changed + try: + value = float(value) + except ValueError: + logger.warning(f"Unable to convert {value} to number") return utils.cast_to_num(value) if value == NULL_STRING: return None diff --git a/tests/integration_tests/sqla_models_tests.py b/tests/integration_tests/sqla_models_tests.py index 80ada22e0aac..27b213b207bd 100644 --- a/tests/integration_tests/sqla_models_tests.py +++ b/tests/integration_tests/sqla_models_tests.py @@ -295,8 +295,10 @@ def test_where_operators(self): FilterTestCase("num", FilterOperator.LESS_THAN_OR_EQUALS, 0, "<= 0"), FilterTestCase("num", FilterOperator.EQUALS, 0, "= 0"), FilterTestCase("num", FilterOperator.NOT_EQUALS, 0, "!= 0"), - FilterTestCase("num", FilterOperator.IN, ["1", "2"], "IN (1, 2)"), - FilterTestCase("num", FilterOperator.NOT_IN, ["1", "2"], "NOT IN (1, 2)"), + FilterTestCase("num", FilterOperator.IN, ["1", "2"], "IN (1.0, 2.0)"), + FilterTestCase( + "num", FilterOperator.NOT_IN, ["1", "2"], "NOT IN (1.0, 2.0)" + ), FilterTestCase( "ds", FilterOperator.TEMPORAL_RANGE, "2020 : 2021", "2020-01-01" ),