Fokko commented on code in PR #36846:
URL: https://github.com/apache/arrow/pull/36846#discussion_r1302657996
##########
cpp/src/arrow/type_test.cc:
##########
@@ -983,6 +1127,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_to_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);
+ CheckUnifyFailsInvalid(uint8(), {int8(), int16(), int32(), int64()},
options);
+ CheckUnify(uint16(), {uint32(), uint64()}, options);
+ CheckUnify(int16(), {int32(), int64()}, options);
+ CheckUnifyFailsInvalid(uint16(), {int16(), int32(), int64()}, options);
+ CheckUnify(uint32(), {uint64()}, options);
+ CheckUnify(int32(), {int64()}, options);
+ CheckUnifyFailsInvalid(uint32(), {int32(), int64()}, options);
+ CheckUnifyFailsInvalid(uint64(), {int64()}, options);
+
+ options.promote_integer_sign = true;
+ options.promote_integer_to_float = false;
+ CheckUnifyFailsInvalid(IntTypes(), FloatingPointTypes(), options);
+
+ options.promote_integer_to_float = true;
+ options.promote_numeric_width = false;
+ CheckUnifyFailsInvalid(int8(), {int16(), int32(), int64()}, options);
+ CheckUnifyFailsInvalid(int16(), {int32(), int64()}, options);
+ CheckUnifyFailsInvalid(int32(), {int64()}, options);
+ CheckUnify(int32(), {float32()}, options);
+ CheckUnify(int64(), {float64()}, options);
+ CheckUnify(int32(), float16(), float32(), options);
+}
+
+TEST_F(TestUnifySchemas, Decimal) {
+ auto options = Field::MergeOptions::Defaults();
+
+ options.promote_decimal_to_float = true;
+ CheckUnify(decimal128(3, 2), {float32(), float64()}, options);
+ CheckUnify(decimal256(3, 2), {float32(), float64()}, options);
+
+ options.promote_integer_to_decimal = true;
+ CheckUnify(int32(), decimal128(3, 2), decimal128(12, 2), options);
+ CheckUnify(int32(), decimal128(3, -2), decimal128(10, 0), 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);
+ CheckUnify(decimal128(38, 10), decimal128(38, 5), decimal256(43, 10),
options);
+
+ CheckUnify(decimal256(3, 2), decimal256(5, 2), decimal256(5, 2), options);
+ CheckUnify(decimal256(3, 2), decimal256(5, 3), decimal256(5, 3), options);
+ CheckUnify(decimal256(3, 2), decimal256(5, 1), decimal256(6, 2), options);
+ CheckUnify(decimal256(3, 2), decimal256(5, -2), decimal256(9, 2), options);
+ CheckUnify(decimal256(3, -2), decimal256(5, -2), decimal256(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);
+ CheckUnify(int64(), decimal128(38, 37), decimal256(56, 37), options);
+
+ CheckUnifyFailsTypeError(decimal256(1, 0), decimal128(1, 0), options);
+
+ options.promote_numeric_width = true;
+ CheckUnify(decimal128(3, 2), decimal256(5, 2), decimal256(5, 2), options);
+ CheckUnify(int32(), decimal128(38, 37), decimal256(47, 37), options);
+ CheckUnifyFailsInvalid(decimal128(38, 10), decimal256(76, 5), options);
+
+ CheckUnifyFailsInvalid(int64(), decimal256(76, 75), options);
+}
+
+TEST_F(TestUnifySchemas, Temporal) {
+ auto options = Field::MergeOptions::Defaults();
+
+ options.promote_temporal_unit = true;
+ CheckUnify(date32(), {date64()}, options);
+
+ CheckUnify(time32(TimeUnit::SECOND),
+ {time32(TimeUnit::MILLI), time64(TimeUnit::MICRO),
time64(TimeUnit::NANO)},
+ options);
+ CheckUnify(time32(TimeUnit::MILLI), {time64(TimeUnit::MICRO),
time64(TimeUnit::NANO)},
+ options);
+ CheckUnify(time64(TimeUnit::MICRO), {time64(TimeUnit::NANO)}, options);
+
+ CheckUnify(
+ duration(TimeUnit::SECOND),
+ {duration(TimeUnit::MILLI), duration(TimeUnit::MICRO),
duration(TimeUnit::NANO)},
+ options);
+ CheckUnify(duration(TimeUnit::MILLI),
+ {duration(TimeUnit::MICRO), duration(TimeUnit::NANO)}, options);
+ CheckUnify(duration(TimeUnit::MICRO), {duration(TimeUnit::NANO)}, options);
+
+ CheckUnify(
+ timestamp(TimeUnit::SECOND),
+ {timestamp(TimeUnit::MILLI), timestamp(TimeUnit::MICRO),
timestamp(TimeUnit::NANO)},
+ options);
+ CheckUnify(timestamp(TimeUnit::MILLI),
+ {timestamp(TimeUnit::MICRO), timestamp(TimeUnit::NANO)}, options);
+ CheckUnify(timestamp(TimeUnit::MICRO), {timestamp(TimeUnit::NANO)}, options);
+
+ CheckUnifyFailsTypeError(timestamp(TimeUnit::SECOND),
+ timestamp(TimeUnit::SECOND, "UTC"), options);
+ CheckUnifyFailsTypeError(timestamp(TimeUnit::SECOND, "America/New_York"),
+ timestamp(TimeUnit::SECOND, "UTC"), options);
+
+ options.promote_temporal_unit = false;
+ CheckUnifyFailsInvalid(timestamp(TimeUnit::MICRO),
timestamp(TimeUnit::NANO), options);
Review Comment:
Even with the `promote_temporal_unit = False`?
--
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]