Fokko commented on code in PR #36846:
URL: https://github.com/apache/arrow/pull/36846#discussion_r1295870468


##########
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);
+}
+
+TEST_F(TestUnifySchemas, Binary) {
+  auto options = Field::MergeOptions::Defaults();
+  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_binary = false;
+  CheckUnifyFailsInvalid({utf8(), binary()}, {large_utf8(), large_binary()});
+  CheckUnifyFailsInvalid(fixed_size_binary(2), BaseBinaryTypes());
+  CheckUnifyFailsInvalid(utf8(), {binary(), large_binary(), 
fixed_size_binary(2)});
+}
+
+TEST_F(TestUnifySchemas, List) {
+  auto options = Field::MergeOptions::Defaults();
+  options.promote_numeric_width = true;
+  CheckUnifyFailsTypeError(fixed_size_list(int8(), 2), 
{fixed_size_list(int8(), 3)},
+                           options);
+
+  options.promote_binary = true;

Review Comment:
   No idea, removed it



-- 
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]

Reply via email to