From c2948c6263139f1446bf1aa6ca86f1a130f4d1da Mon Sep 17 00:00:00 2001 From: Rossi Sun Date: Fri, 5 Jun 2026 12:42:09 -0700 Subject: [PATCH] Add decimal dispatch regression tests --- cpp/src/arrow/compute/expression_test.cc | 39 +++++++++++++++++++ .../compute/kernels/scalar_if_else_test.cc | 4 ++ 2 files changed, 43 insertions(+) diff --git a/cpp/src/arrow/compute/expression_test.cc b/cpp/src/arrow/compute/expression_test.cc index 5e1f3c093ee2..b041a6a2910c 100644 --- a/cpp/src/arrow/compute/expression_test.cc +++ b/cpp/src/arrow/compute/expression_test.cc @@ -938,6 +938,45 @@ TEST(Expression, BindWithImplicitCastsForCaseWhenOnDecimal) { /*bound_out=*/nullptr, *exciting_schema); } +TEST(Expression, BindWithImplicitCastsForIfElseOnDecimal) { + auto schema = arrow::schema({field("cond", boolean()), + field("dec128_3_2", decimal128(3, 2)), + field("dec128_4_3", decimal128(4, 3))}); + + ExpectBindsTo( + call("if_else", + {field_ref("cond"), field_ref("dec128_3_2"), field_ref("dec128_4_3")}), + call("if_else", + {field_ref("cond"), cast(field_ref("dec128_3_2"), decimal128(4, 3)), + field_ref("dec128_4_3")}), + /*bound_out=*/nullptr, *schema); +} + +TEST(Expression, BindWithImplicitCastsForCoalesceOnDecimal) { + auto schema = arrow::schema({field("dec128_3_2", decimal128(3, 2)), + field("dec128_4_3", decimal128(4, 3))}); + + ExpectBindsTo( + call("coalesce", {field_ref("dec128_3_2"), field_ref("dec128_4_3")}), + call("coalesce", {cast(field_ref("dec128_3_2"), decimal128(4, 3)), + field_ref("dec128_4_3")}), + /*bound_out=*/nullptr, *schema); +} + +TEST(Expression, BindWithImplicitCastsForChooseOnDecimal) { + auto schema = arrow::schema({field("indices", int64()), + field("dec128_3_2", decimal128(3, 2)), + field("dec128_4_3", decimal128(4, 3))}); + + ExpectBindsTo( + call("choose", + {field_ref("indices"), field_ref("dec128_3_2"), field_ref("dec128_4_3")}), + call("choose", + {field_ref("indices"), cast(field_ref("dec128_3_2"), decimal128(4, 3)), + field_ref("dec128_4_3")}), + /*bound_out=*/nullptr, *schema); +} + TEST(Expression, BindNestedCall) { auto expr = add(field_ref("a"), call("subtract", {call("multiply", {field_ref("b"), field_ref("c")}), diff --git a/cpp/src/arrow/compute/kernels/scalar_if_else_test.cc b/cpp/src/arrow/compute/kernels/scalar_if_else_test.cc index 4bd32cce68cc..726b44a4f39a 100644 --- a/cpp/src/arrow/compute/kernels/scalar_if_else_test.cc +++ b/cpp/src/arrow/compute/kernels/scalar_if_else_test.cc @@ -3651,6 +3651,8 @@ TEST(TestCoalesce, DispatchBest) { {large_binary(), large_binary()}); CheckDispatchBest("coalesce", {int32(), decimal128(3, 2)}, {decimal128(12, 2), decimal128(12, 2)}); + CheckDispatchBest("coalesce", {decimal128(3, 2), decimal128(4, 3)}, + {decimal128(4, 3), decimal128(4, 3)}); CheckDispatchBest("coalesce", {float32(), decimal128(3, 2)}, {float64(), float64()}); CheckDispatchBest("coalesce", {decimal128(3, 2), decimal256(3, 2)}, {decimal256(3, 2), decimal256(3, 2)}); @@ -3910,6 +3912,8 @@ TEST(TestChooseKernel, DispatchBest) { // Other arguments promoted separately from index EXPECT_EQ((std::vector{int64(), int32(), int32()}), Check({int8(), int32(), uint8()})); + EXPECT_EQ((std::vector{int64(), decimal128(4, 3), decimal128(4, 3)}), + Check({int8(), decimal128(3, 2), decimal128(4, 3)})); } TEST(TestChooseKernel, Errors) {