diff --git a/superset/db_engine_specs/base.py b/superset/db_engine_specs/base.py index 7eadb4a94d56..c7d9633b6ed2 100644 --- a/superset/db_engine_specs/base.py +++ b/superset/db_engine_specs/base.py @@ -469,6 +469,11 @@ def normalize_custom_sql_metric(cls, expression: str) -> str: types.SmallInteger(), GenericDataType.NUMERIC, ), + ( + re.compile(r"^tinyint", re.IGNORECASE), + types.SmallInteger(), + GenericDataType.NUMERIC, + ), ( re.compile(r"^int(eger)?", re.IGNORECASE), types.Integer(), diff --git a/tests/unit_tests/db_engine_specs/test_base.py b/tests/unit_tests/db_engine_specs/test_base.py index 6eba3e68af1e..c51f12288985 100644 --- a/tests/unit_tests/db_engine_specs/test_base.py +++ b/tests/unit_tests/db_engine_specs/test_base.py @@ -168,6 +168,7 @@ def test_cte_query_parsing(original: types.TypeEngine, expected: str) -> None: "native_type,sqla_type,attrs,generic_type,is_dttm", [ ("SMALLINT", types.SmallInteger, None, GenericDataType.NUMERIC, False), + ("TINYINT", types.SmallInteger, None, GenericDataType.NUMERIC, False), ("INTEGER", types.Integer, None, GenericDataType.NUMERIC, False), ("BIGINT", types.BigInteger, None, GenericDataType.NUMERIC, False), ("DECIMAL", types.Numeric, None, GenericDataType.NUMERIC, False), diff --git a/tests/unit_tests/db_engine_specs/test_duckdb.py b/tests/unit_tests/db_engine_specs/test_duckdb.py index 7ba1413f5034..41c77fedeab8 100644 --- a/tests/unit_tests/db_engine_specs/test_duckdb.py +++ b/tests/unit_tests/db_engine_specs/test_duckdb.py @@ -142,6 +142,7 @@ def test_column_type_recognition() -> None: "INTEGER", "BIGINT", "SMALLINT", + "TINYINT", # DuckDB-specific unsigned types "HUGEINT", "UBIGINT", @@ -158,12 +159,6 @@ def test_column_type_recognition() -> None: f"got {col_spec.generic_type}" ) - # Test that TINYINT (non-unsigned) is also recognized - # Note: TINYINT is not in the default mappings, but should be handled - col_spec = DuckDBEngineSpec.get_column_spec("TINYINT") - # TINYINT matches the pattern "^int" so it should be recognized - assert col_spec is None, "TINYINT doesn't match any patterns" - def test_motherduck_impersonation(mocker: MockerFixture) -> None: """