Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.

Commit 873d045

Browse files
fix filter pushdown bug
1 parent 89be889 commit 873d045

4 files changed

Lines changed: 11 additions & 5 deletions

File tree

bigframes/_config/experiment_options.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ class ExperimentOptions:
2727
def __init__(self):
2828
self._semantic_operators: bool = False
2929
self._ai_operators: bool = False
30-
# TODO: DO NOT SUBMIT, revert before submitting
31-
self._sql_compiler: Literal["legacy", "stable", "experimental"] = "experimental"
30+
self._sql_compiler: Literal["legacy", "stable", "experimental"] = "stable"
3231

3332
@property
3433
def semantic_operators(self) -> bool:

bigframes/core/compile/sqlglot/expressions/generic_ops.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def _(*operands: TypedExpr, op: ops.SqlScalarOp) -> sge.Expression:
9494

9595
@register_unary_op(ops.isnull_op)
9696
def _(expr: TypedExpr) -> sge.Expression:
97-
return sge.Is(this=expr.expr, expression=sge.Null())
97+
return sge.Is(this=sge.paren(expr.expr), expression=sge.Null())
9898

9999

100100
@register_unary_op(ops.MapOp, pass_op=True)
@@ -125,7 +125,7 @@ def _(expr: TypedExpr, op: ops.MapOp) -> sge.Expression:
125125

126126
@register_unary_op(ops.notnull_op)
127127
def _(expr: TypedExpr) -> sge.Expression:
128-
return sge.Not(this=sge.Is(this=expr.expr, expression=sge.Null()))
128+
return sge.Not(this=sge.Is(this=sge.paren(expr.expr), expression=sge.Null()))
129129

130130

131131
@register_ternary_op(ops.where_op)

bigframes/core/rewrite/as_sql.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ def _add_cdefs(
105105
def _try_add_filter(
106106
select: sql_nodes.SqlSelectNode, predicates: Sequence[expression.Expression]
107107
) -> Optional[sql_nodes.SqlSelectNode]:
108+
# Filter implicitly happens first, so merging it into ths select will modify non-scalar col expressions
109+
if not all(cdef.expression.is_scalar_expr for cdef in select.selections):
110+
return None
111+
if not all(
112+
sort_expr.scalar_expression.is_scalar_expr for sort_expr in select.sorting
113+
):
114+
return None
108115
# Constraint: filters can only be merged if they are scalar expression after binding
109116
new_predicates = []
110117
# bind variables, merge predicates

tests/unit/_config/test_experiment_options.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def test_ai_operators_set_true_shows_warning():
5151
def test_sql_compiler_default_stable():
5252
options = experiment_options.ExperimentOptions()
5353

54-
assert options.sql_compiler == "experimental"
54+
assert options.sql_compiler == "stable"
5555

5656

5757
def test_sql_compiler_set_experimental_shows_warning():

0 commit comments

Comments
 (0)