diff --git a/packages/bigframes/bigframes/core/compile/sqlglot/sql/base.py b/packages/bigframes/bigframes/core/compile/sqlglot/sql/base.py index 8b5eb748f575..f77dcbee4d93 100644 --- a/packages/bigframes/bigframes/core/compile/sqlglot/sql/base.py +++ b/packages/bigframes/bigframes/core/compile/sqlglot/sql/base.py @@ -69,6 +69,8 @@ def literal(value: typing.Any, dtype: dtypes.Dtype | None = None) -> sge.Express return sge.Null() if value is None: + if str(sqlglot_type).upper() == "NULL": + return sge.Null() return cast(sge.Null(), sqlglot_type) if dtypes.is_struct_like(dtype): items = [ diff --git a/packages/bigframes/tests/unit/core/compile/sqlglot/sql/test_base.py b/packages/bigframes/tests/unit/core/compile/sqlglot/sql/test_base.py index 5ba77d925d0f..617f3636d403 100644 --- a/packages/bigframes/tests/unit/core/compile/sqlglot/sql/test_base.py +++ b/packages/bigframes/tests/unit/core/compile/sqlglot/sql/test_base.py @@ -159,3 +159,15 @@ def test_literal_explicit_dtype(value, dtype, expected): def test_literal_for_list(value: list, expected: str): got = sql.to_sql(sql.literal(value)) assert got == expected + + +def test_literal_null_type(): + import unittest.mock as mock + + mock_dtype = mock.Mock() + with mock.patch( + "bigframes.core.compile.sqlglot.sql.base.sgt.from_bigframes_dtype", + return_value="NULL", + ): + got = sql.to_sql(sql.literal(None, dtype=mock_dtype)) + assert got == "NULL"