From 42b76652420b702f79134e88192f250cb8c772ac Mon Sep 17 00:00:00 2001 From: Luke Manley Date: Fri, 7 Feb 2025 20:56:39 -0500 Subject: [PATCH] fix: Fix `Expr.over` applying scale incorrectly for Decimal types --- crates/polars-expr/src/expressions/window.rs | 2 +- py-polars/tests/unit/datatypes/test_decimal.py | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/crates/polars-expr/src/expressions/window.rs b/crates/polars-expr/src/expressions/window.rs index 2e72eedba127..ae41d8c8f9b6 100644 --- a/crates/polars-expr/src/expressions/window.rs +++ b/crates/polars-expr/src/expressions/window.rs @@ -699,7 +699,7 @@ fn set_by_groups( }}; } downcast_as_macro_arg_physical!(&s, dispatch) - .map(|s| s.cast(dtype).unwrap()) + .map(|s| unsafe { s.from_physical_unchecked(dtype) }.unwrap()) .map(Column::from) } else { None diff --git a/py-polars/tests/unit/datatypes/test_decimal.py b/py-polars/tests/unit/datatypes/test_decimal.py index 012e3a393486..dfda89b3e224 100644 --- a/py-polars/tests/unit/datatypes/test_decimal.py +++ b/py-polars/tests/unit/datatypes/test_decimal.py @@ -712,3 +712,9 @@ def test_cast_float_to_decimal_12775() -> None: # default scale = 0 assert s.cast(pl.Decimal).to_list() == [D("1")] assert s.cast(pl.Decimal(scale=1)).to_list() == [D("1.5")] + + +def test_decimal_min_over_21096() -> None: + df = pl.Series("x", [1, 2], pl.Decimal(scale=2)).to_frame() + result = df.select(pl.col("x").min().over("x")) + assert result["x"].to_list() == [D("1.00"), D("2.00")]