@@ -938,6 +938,62 @@ TEST(Expression, BindWithImplicitCastsForCaseWhenOnDecimal) {
938938 /* bound_out=*/ nullptr , *exciting_schema);
939939}
940940
941+ TEST (Expression, BindWithImplicitCastsForCoalesceOnDecimal) {
942+ auto exciting_schema = schema (
943+ {field (" dec128_3_2" , decimal128 (3 , 2 )), field (" dec128_4_1" , decimal128 (4 , 1 )),
944+ field (" dec128_4_2" , decimal128 (4 , 2 )), field (" dec128_4_3" , decimal128 (4 , 3 )),
945+ field (" dec256_3_2" , decimal256 (3 , 2 ))});
946+
947+ ExpectBindsTo (call (" coalesce" , {field_ref (" dec128_3_2" ), field_ref (" dec128_4_2" )}),
948+ call (" coalesce" , {cast (field_ref (" dec128_3_2" ), decimal128 (4 , 2 )),
949+ field_ref (" dec128_4_2" )}),
950+ /* bound_out=*/ nullptr , *exciting_schema);
951+ ExpectBindsTo (call (" coalesce" , {field_ref (" dec128_4_2" ), field_ref (" dec128_3_2" )}),
952+ call (" coalesce" , {field_ref (" dec128_4_2" ),
953+ cast (field_ref (" dec128_3_2" ), decimal128 (4 , 2 ))}),
954+ /* bound_out=*/ nullptr , *exciting_schema);
955+ ExpectBindsTo (call (" coalesce" , {field_ref (" dec128_4_1" ), field_ref (" dec128_3_2" )}),
956+ call (" coalesce" , {cast (field_ref (" dec128_4_1" ), decimal128 (5 , 2 )),
957+ cast (field_ref (" dec128_3_2" ), decimal128 (5 , 2 ))}),
958+ /* bound_out=*/ nullptr , *exciting_schema);
959+ ExpectBindsTo (call (" coalesce" , {field_ref (" dec128_3_2" ), field_ref (" dec128_4_1" )}),
960+ call (" coalesce" , {cast (field_ref (" dec128_3_2" ), decimal128 (5 , 2 )),
961+ cast (field_ref (" dec128_4_1" ), decimal128 (5 , 2 ))}),
962+ /* bound_out=*/ nullptr , *exciting_schema);
963+ ExpectBindsTo (call (" coalesce" , {field_ref (" dec128_3_2" ), field_ref (" dec128_4_3" )}),
964+ call (" coalesce" , {cast (field_ref (" dec128_3_2" ), decimal128 (4 , 3 )),
965+ field_ref (" dec128_4_3" )}),
966+ /* bound_out=*/ nullptr , *exciting_schema);
967+ ExpectBindsTo (call (" coalesce" , {field_ref (" dec128_4_3" ), field_ref (" dec128_3_2" )}),
968+ call (" coalesce" , {field_ref (" dec128_4_3" ),
969+ cast (field_ref (" dec128_3_2" ), decimal128 (4 , 3 ))}),
970+ /* bound_out=*/ nullptr , *exciting_schema);
971+ ExpectBindsTo (call (" coalesce" , {field_ref (" dec128_3_2" ), field_ref (" dec256_3_2" )}),
972+ call (" coalesce" , {cast (field_ref (" dec128_3_2" ), decimal256 (3 , 2 )),
973+ field_ref (" dec256_3_2" )}),
974+ /* bound_out=*/ nullptr , *exciting_schema);
975+ ExpectBindsTo (call (" coalesce" , {field_ref (" dec256_3_2" ), field_ref (" dec128_3_2" )}),
976+ call (" coalesce" , {field_ref (" dec256_3_2" ),
977+ cast (field_ref (" dec128_3_2" ), decimal256 (3 , 2 ))}),
978+ /* bound_out=*/ nullptr , *exciting_schema);
979+ }
980+
981+ TEST (Expression, ExecuteCoalesceOnMixedDecimalTypes) {
982+ ASSERT_OK_AND_ASSIGN (
983+ auto input,
984+ StructArray::Make ({ArrayFromJSON (decimal128 (3 , 2 ), R"( ["1.23", null])" ),
985+ ArrayFromJSON (decimal128 (4 , 3 ), R"( [null, "2.345"])" )},
986+ {" left" , " right" }));
987+ Schema input_schema (input->type ()->fields ());
988+ auto expr = call (" coalesce" , {field_ref (" left" ), field_ref (" right" )});
989+
990+ ASSERT_OK_AND_ASSIGN (expr, expr.Bind (input_schema));
991+ ASSERT_OK_AND_ASSIGN (auto actual,
992+ ExecuteScalarExpression (expr, input_schema, Datum (input)));
993+
994+ AssertDatumsEqual (actual, ArrayFromJSON (decimal128 (4 , 3 ), R"( ["1.230", "2.345"])" ));
995+ }
996+
941997TEST (Expression, BindNestedCall) {
942998 auto expr = add (field_ref (" a" ),
943999 call (" subtract" , {call (" multiply" , {field_ref (" b" ), field_ref (" c" )}),
0 commit comments