Fokko commented on code in PR #36846:
URL: https://github.com/apache/arrow/pull/36846#discussion_r1274891472
##########
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);
+
+ 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);
+
+ CheckUnifyFails(int64(), decimal256(76, 75), options);
+}
+
+TEST_F(TestUnifySchemas, Temporal) {
+ auto options = Field::MergeOptions::Defaults();
+
+ options.promote_date = true;
+ CheckUnify(date32(), {date64()}, options);
+
+ options.promote_time = true;
+ 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);
+
+ options.promote_duration = true;
+ 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);
+
+ options.promote_timestamp = true;
+ 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);
+
+ CheckUnifyFails(timestamp(TimeUnit::SECOND), timestamp(TimeUnit::SECOND,
"UTC"),
+ options);
+ CheckUnifyFails(timestamp(TimeUnit::SECOND, "America/New_York"),
+ timestamp(TimeUnit::SECOND, "UTC"), options);
+}
+
+TEST_F(TestUnifySchemas, Binary) {
+ auto options = Field::MergeOptions::Defaults();
+ options.promote_large = true;
+ options.promote_binary = true;
+ CheckUnify(utf8(), {large_utf8(), binary(), large_binary()}, options);
+ CheckUnify(binary(), {large_binary()}, options);
+ CheckUnify(fixed_size_binary(2), {fixed_size_binary(2), binary(),
large_binary()},
+ options);
+ CheckUnify(fixed_size_binary(2), fixed_size_binary(4), binary(), options);
+
+ options.promote_large = false;
+ CheckUnifyFails({utf8(), binary()}, {large_utf8(), large_binary()});
+ CheckUnifyFails(fixed_size_binary(2), BaseBinaryTypes());
+
+ options.promote_binary = false;
+ CheckUnifyFails(utf8(), {binary(), large_binary(), fixed_size_binary(2)});
+}
+
+TEST_F(TestUnifySchemas, List) {
+ auto options = Field::MergeOptions::Defaults();
+ options.promote_numeric_width = true;
+ CheckUnifyFails(fixed_size_list(int8(), 2),
+ {fixed_size_list(int8(), 3), list(int8()),
large_list(int8())},
+ options);
+
+ options.promote_large = true;
+ CheckUnify(list(int8()), {large_list(int8())}, options);
+ CheckUnify(fixed_size_list(int8(), 2), {list(int8()), large_list(int8())},
options);
+
+ options.promote_nested = true;
+ CheckUnify(list(int8()), {list(int16()), list(int32()), list(int64())},
options);
+ CheckUnify(fixed_size_list(int8(), 2),
+ {fixed_size_list(int16(), 2), list(int16()), list(int32()),
list(int64())},
+ options);
+
+ auto ty = list(field("foo", int8(), /*nullable=*/false));
+ CheckUnifyAsymmetric(ty, list(int8()), list(field("foo", int8(),
/*nullable=*/true)),
+ options);
+ CheckUnifyAsymmetric(ty, list(field("bar", int16(), /*nullable=*/false)),
+ list(field("foo", int16(), /*nullable=*/false)),
options);
+}
+
+TEST_F(TestUnifySchemas, Map) {
+ auto options = Field::MergeOptions::Defaults();
+ options.promote_nested = true;
Review Comment:
I've removed promote nested
##########
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);
+
+ 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);
+
+ CheckUnifyFails(int64(), decimal256(76, 75), options);
+}
+
+TEST_F(TestUnifySchemas, Temporal) {
+ auto options = Field::MergeOptions::Defaults();
+
+ options.promote_date = true;
+ CheckUnify(date32(), {date64()}, options);
+
+ options.promote_time = true;
+ 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);
+
+ options.promote_duration = true;
+ 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);
+
+ options.promote_timestamp = true;
+ 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);
+
+ CheckUnifyFails(timestamp(TimeUnit::SECOND), timestamp(TimeUnit::SECOND,
"UTC"),
+ options);
+ CheckUnifyFails(timestamp(TimeUnit::SECOND, "America/New_York"),
+ timestamp(TimeUnit::SECOND, "UTC"), options);
+}
+
+TEST_F(TestUnifySchemas, Binary) {
+ auto options = Field::MergeOptions::Defaults();
+ options.promote_large = true;
+ options.promote_binary = true;
+ CheckUnify(utf8(), {large_utf8(), binary(), large_binary()}, options);
+ CheckUnify(binary(), {large_binary()}, options);
+ CheckUnify(fixed_size_binary(2), {fixed_size_binary(2), binary(),
large_binary()},
+ options);
+ CheckUnify(fixed_size_binary(2), fixed_size_binary(4), binary(), options);
+
+ options.promote_large = false;
+ CheckUnifyFails({utf8(), binary()}, {large_utf8(), large_binary()});
+ CheckUnifyFails(fixed_size_binary(2), BaseBinaryTypes());
+
+ options.promote_binary = false;
+ CheckUnifyFails(utf8(), {binary(), large_binary(), fixed_size_binary(2)});
+}
+
+TEST_F(TestUnifySchemas, List) {
+ auto options = Field::MergeOptions::Defaults();
+ options.promote_numeric_width = true;
+ CheckUnifyFails(fixed_size_list(int8(), 2),
+ {fixed_size_list(int8(), 3), list(int8()),
large_list(int8())},
+ options);
+
+ options.promote_large = true;
+ CheckUnify(list(int8()), {large_list(int8())}, options);
+ CheckUnify(fixed_size_list(int8(), 2), {list(int8()), large_list(int8())},
options);
+
+ options.promote_nested = true;
+ CheckUnify(list(int8()), {list(int16()), list(int32()), list(int64())},
options);
Review Comment:
I've removed promote nested
--
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]