Skip to content

Commit c58acfa

Browse files
committed
refactor: fix ops.ZfillOp
1 parent b9226b6 commit c58acfa

File tree

2 files changed

+13
-11
lines changed
  • bigframes/core/compile/sqlglot/expressions
  • tests/unit/core/compile/sqlglot/expressions/snapshots/test_string_ops/test_zfill

2 files changed

+13
-11
lines changed

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -288,27 +288,29 @@ def _(left: TypedExpr, right: TypedExpr) -> sge.Expression:
288288

289289
@register_unary_op(ops.ZfillOp, pass_op=True)
290290
def _(expr: TypedExpr, op: ops.ZfillOp) -> sge.Expression:
291+
length_expr = sge.Greatest(
292+
expressions=[sge.Length(this=expr.expr), sge.convert(op.width)]
293+
)
291294
return sge.Case(
292295
ifs=[
293296
sge.If(
294-
this=sge.EQ(
295-
this=sge.Substring(
296-
this=expr.expr, start=sge.convert(1), length=sge.convert(1)
297-
),
298-
expression=sge.convert("-"),
297+
this=sge.func(
298+
"STARTS_WITH",
299+
expr.expr,
300+
sge.convert("-"),
299301
),
300302
true=sge.Concat(
301303
expressions=[
302304
sge.convert("-"),
303305
sge.func(
304306
"LPAD",
305-
sge.Substring(this=expr.expr, start=sge.convert(1)),
306-
sge.convert(op.width - 1),
307+
sge.Substring(this=expr.expr, start=sge.convert(2)),
308+
length_expr - 1,
307309
sge.convert("0"),
308310
),
309311
]
310312
),
311313
)
312314
],
313-
default=sge.func("LPAD", expr.expr, sge.convert(op.width), sge.convert("0")),
315+
default=sge.func("LPAD", expr.expr, length_expr, sge.convert("0")),
314316
)

tests/unit/core/compile/sqlglot/expressions/snapshots/test_string_ops/test_zfill/out.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ WITH `bfcte_0` AS (
66
SELECT
77
*,
88
CASE
9-
WHEN SUBSTRING(`string_col`, 1, 1) = '-'
10-
THEN CONCAT('-', LPAD(SUBSTRING(`string_col`, 1), 9, '0'))
11-
ELSE LPAD(`string_col`, 10, '0')
9+
WHEN STARTS_WITH(`string_col`, '-')
10+
THEN CONCAT('-', LPAD(SUBSTRING(`string_col`, 2), GREATEST(LENGTH(`string_col`), 10) - 1, '0'))
11+
ELSE LPAD(`string_col`, GREATEST(LENGTH(`string_col`), 10), '0')
1212
END AS `bfcol_1`
1313
FROM `bfcte_0`
1414
)

0 commit comments

Comments
 (0)