pitrou commented on code in PR #36846:
URL: https://github.com/apache/arrow/pull/36846#discussion_r1274894812
##########
cpp/src/arrow/type_test.cc:
##########
@@ -983,6 +1091,242 @@ TEST_F(TestUnifySchemas, MoreSchemas) {
utf8_field->WithNullable(true)}));
}
+TEST_F(TestUnifySchemas, Numeric) {
+ auto options = Field::MergeOptions::Defaults();
+ options.promote_numeric_width = true;
+ options.promote_integer_float = true;
+ options.promote_integer_sign = true;
+ CheckUnify(uint8(),
+ {int8(), uint16(), int16(), uint32(), int32(), uint64(), int64(),
float32(),
+ float64()},
+ options);
+ CheckUnify(int8(), {int16(), int32(), int64(), float32(), float64()},
options);
+ CheckUnify(uint16(),
+ {int16(), uint32(), int32(), uint64(), int64(), float32(),
float64()},
+ options);
+ CheckUnify(int16(), {int32(), int64(), float32(), float64()}, options);
+ CheckUnify(uint32(), {int32(), uint64(), int64(), float32(), float64()},
options);
+ CheckUnify(int32(), {int64(), float32(), float64()}, options);
+ CheckUnify(uint64(), {int64(), float64()}, options);
+ CheckUnify(int64(), {float64()}, options);
+ CheckUnify(float16(), {float32(), float64()}, options);
+ CheckUnify(float32(), {float64()}, options);
+ CheckUnify(uint64(), float32(), float64(), options);
+ CheckUnify(int64(), float32(), float64(), options);
+
+ options.promote_integer_sign = false;
+ CheckUnify(uint8(), {uint16(), uint32(), uint64()}, options);
+ CheckUnify(int8(), {int16(), int32(), int64()}, options);
+ CheckUnifyFails(uint8(), {int8(), int16(), int32(), int64()}, options);
+ CheckUnify(uint16(), {uint32(), uint64()}, options);
+ CheckUnify(int16(), {int32(), int64()}, options);
+ CheckUnifyFails(uint16(), {int16(), int32(), int64()}, options);
+ CheckUnify(uint32(), {uint64()}, options);
+ CheckUnify(int32(), {int64()}, options);
+ CheckUnifyFails(uint32(), {int32(), int64()}, options);
+ CheckUnifyFails(uint64(), {int64()}, options);
+
+ options.promote_integer_sign = true;
+ options.promote_integer_float = false;
+ CheckUnifyFails(IntTypes(), FloatingPointTypes(), options);
+
+ options.promote_integer_float = true;
+ options.promote_numeric_width = false;
+ CheckUnifyFails(int8(), {int16(), int32(), int64()}, options);
+ CheckUnifyFails(int16(), {int32(), int64()}, options);
+ CheckUnifyFails(int32(), {int64()}, options);
+}
+
+TEST_F(TestUnifySchemas, Decimal) {
+ auto options = Field::MergeOptions::Defaults();
+
+ options.promote_decimal_float = true;
+ CheckUnify(decimal128(3, 2), {float32(), float64()}, options);
+ CheckUnify(decimal256(3, 2), {float32(), float64()}, options);
+
+ options.promote_integer_decimal = true;
+ CheckUnify(int32(), decimal128(3, 2), decimal128(3, 2), options);
+ CheckUnify(int32(), decimal128(3, -2), decimal128(3, -2), options);
+
+ options.promote_decimal = true;
+ CheckUnify(decimal128(3, 2), decimal128(5, 2), decimal128(5, 2), options);
+ CheckUnify(decimal128(3, 2), decimal128(5, 3), decimal128(5, 3), options);
+ CheckUnify(decimal128(3, 2), decimal128(5, 1), decimal128(6, 2), options);
+ CheckUnify(decimal128(3, 2), decimal128(5, -2), decimal128(9, 2), options);
+ CheckUnify(decimal128(3, -2), decimal128(5, -2), decimal128(5, -2), options);
+
+ // int32() is essentially decimal128(10, 0)
+ CheckUnify(int32(), decimal128(3, 2), decimal128(12, 2), options);
+ CheckUnify(int32(), decimal128(3, -2), decimal128(10, 0), options);
+
+ CheckUnifyFails(decimal256(1, 0), decimal128(1, 0), options);
+ CheckUnifyFails(int64(), decimal128(38, 37), options);
Review Comment:
No, because the required precision (57 = 37+20) would be higher than what
decimal128 allows.
However, perhaps it could upcast to decimal256 if the corresponding option
is activated.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]