@@ -1398,28 +1398,34 @@ TEST(TestLogicalTypeOperation, LogicalTypeRepresentation) {
13981398 R"( {"Type": "Time", "isAdjustedToUTC": false, "timeUnit": "nanoseconds"})" },
13991399 {LogicalType::Timestamp (true , LogicalType::TimeUnit::MILLIS),
14001400 " Timestamp(isAdjustedToUTC=true, timeUnit=milliseconds, "
1401- " force_set_converted_type=false)" ,
1402- R"( {"Type": "Timestamp", "isAdjustedToUTC": true, "timeUnit": "milliseconds", "force_set_converted_type": false})" },
1401+ " is_from_converted_type=false, force_set_converted_type=false)" ,
1402+ R"( {"Type": "Timestamp", "isAdjustedToUTC": true, "timeUnit": "milliseconds", )"
1403+ R"( "is_from_converted_type": false, "force_set_converted_type": false})" },
14031404 {LogicalType::Timestamp (true , LogicalType::TimeUnit::MICROS),
14041405 " Timestamp(isAdjustedToUTC=true, timeUnit=microseconds, "
1405- " force_set_converted_type=false)" ,
1406- R"( {"Type": "Timestamp", "isAdjustedToUTC": true, "timeUnit": "microseconds", "force_set_converted_type": false})" },
1406+ " is_from_converted_type=false, force_set_converted_type=false)" ,
1407+ R"( {"Type": "Timestamp", "isAdjustedToUTC": true, "timeUnit": "microseconds", )"
1408+ R"( "is_from_converted_type": false, "force_set_converted_type": false})" },
14071409 {LogicalType::Timestamp (true , LogicalType::TimeUnit::NANOS),
14081410 " Timestamp(isAdjustedToUTC=true, timeUnit=nanoseconds, "
1409- " force_set_converted_type=false)" ,
1410- R"( {"Type": "Timestamp", "isAdjustedToUTC": true, "timeUnit": "nanoseconds", "force_set_converted_type": false})" },
1411- {LogicalType::Timestamp (false , LogicalType::TimeUnit::MILLIS, true ),
1411+ " is_from_converted_type=false, force_set_converted_type=false)" ,
1412+ R"( {"Type": "Timestamp", "isAdjustedToUTC": true, "timeUnit": "nanoseconds", )"
1413+ R"( "is_from_converted_type": false, "force_set_converted_type": false})" },
1414+ {LogicalType::Timestamp (false , LogicalType::TimeUnit::MILLIS, true , true ),
14121415 " Timestamp(isAdjustedToUTC=false, timeUnit=milliseconds, "
1413- " force_set_converted_type=true)" ,
1414- R"( {"Type": "Timestamp", "isAdjustedToUTC": false, "timeUnit": "milliseconds", "force_set_converted_type": true})" },
1416+ " is_from_converted_type=true, force_set_converted_type=true)" ,
1417+ R"( {"Type": "Timestamp", "isAdjustedToUTC": false, "timeUnit": "milliseconds", )"
1418+ R"( "is_from_converted_type": true, "force_set_converted_type": true})" },
14151419 {LogicalType::Timestamp (false , LogicalType::TimeUnit::MICROS),
14161420 " Timestamp(isAdjustedToUTC=false, timeUnit=microseconds, "
1417- " force_set_converted_type=false)" ,
1418- R"( {"Type": "Timestamp", "isAdjustedToUTC": false, "timeUnit": "microseconds", "force_set_converted_type": false})" },
1421+ " is_from_converted_type=false, force_set_converted_type=false)" ,
1422+ R"( {"Type": "Timestamp", "isAdjustedToUTC": false, "timeUnit": "microseconds", )"
1423+ R"( "is_from_converted_type": false, "force_set_converted_type": false})" },
14191424 {LogicalType::Timestamp (false , LogicalType::TimeUnit::NANOS),
14201425 " Timestamp(isAdjustedToUTC=false, timeUnit=nanoseconds, "
1421- " force_set_converted_type=false)" ,
1422- R"( {"Type": "Timestamp", "isAdjustedToUTC": false, "timeUnit": "nanoseconds", "force_set_converted_type": false})" },
1426+ " is_from_converted_type=false, force_set_converted_type=false)" ,
1427+ R"( {"Type": "Timestamp", "isAdjustedToUTC": false, "timeUnit": "nanoseconds", )"
1428+ R"( "is_from_converted_type": false, "force_set_converted_type": false})" },
14231429 {LogicalType::Interval (), " Interval" , R"( {"Type": "Interval"})" },
14241430 {LogicalType::Int (8 , false ), " Int(bitWidth=8, isSigned=false)" ,
14251431 R"( {"Type": "Int", "bitWidth": 8, "isSigned": false})" },
@@ -1673,6 +1679,16 @@ struct SchemaElementConstructionArguments {
16731679 std::function<bool ()> check_logicalType;
16741680};
16751681
1682+ struct LegacySchemaElementConstructionArguments {
1683+ std::string name;
1684+ Type::type physical_type;
1685+ int physical_length;
1686+ bool expect_converted_type;
1687+ ConvertedType::type converted_type;
1688+ bool expect_logicalType;
1689+ std::function<bool ()> check_logicalType;
1690+ };
1691+
16761692class TestSchemaElementConstruction : public ::testing::Test {
16771693 public:
16781694 TestSchemaElementConstruction* Reconstruct (
@@ -1692,6 +1708,23 @@ class TestSchemaElementConstruction : public ::testing::Test {
16921708 return this ;
16931709 }
16941710
1711+ TestSchemaElementConstruction* LegacyReconstruct (
1712+ const LegacySchemaElementConstructionArguments& c) {
1713+ // Make node, create serializable Thrift object from it ...
1714+ node_ = PrimitiveNode::Make (c.name , Repetition::REQUIRED, c.physical_type ,
1715+ c.converted_type , c.physical_length );
1716+ element_.reset (new format::SchemaElement);
1717+ node_->ToParquet (element_.get ());
1718+
1719+ // ... then set aside some values for later inspection.
1720+ name_ = c.name ;
1721+ expect_converted_type_ = c.expect_converted_type ;
1722+ converted_type_ = c.converted_type ;
1723+ expect_logicalType_ = c.expect_logicalType ;
1724+ check_logicalType_ = c.check_logicalType ;
1725+ return this ;
1726+ }
1727+
16951728 void Inspect () {
16961729 ASSERT_EQ (element_->name , name_);
16971730 if (expect_converted_type_) {
@@ -1777,6 +1810,17 @@ TEST_F(TestSchemaElementConstruction, SimpleCases) {
17771810 for (const SchemaElementConstructionArguments& c : cases) {
17781811 this ->Reconstruct (c)->Inspect ();
17791812 }
1813+
1814+ std::vector<LegacySchemaElementConstructionArguments> legacy_cases = {
1815+ {" timestamp_ms" , Type::INT64, -1 , true , ConvertedType::TIMESTAMP_MILLIS, false ,
1816+ check_nothing},
1817+ {" timestamp_us" , Type::INT64, -1 , true , ConvertedType::TIMESTAMP_MICROS, false ,
1818+ check_nothing},
1819+ };
1820+
1821+ for (const LegacySchemaElementConstructionArguments& c : legacy_cases) {
1822+ this ->LegacyReconstruct (c)->Inspect ();
1823+ }
17801824}
17811825
17821826class TestDecimalSchemaElementConstruction : public TestSchemaElementConstruction {
@@ -1920,6 +1964,7 @@ TEST_F(TestTemporalSchemaElementConstruction, TemporalCases) {
19201964 Type::INT64, -1 , false , ConvertedType::NA, true , check_TIMESTAMP},
19211965 {" timestamp_F_ms_force" ,
19221966 LogicalType::Timestamp (false , LogicalType::TimeUnit::MILLIS,
1967+ /* is_from_converted_type=*/ false ,
19231968 /* force_set_converted_type=*/ true ),
19241969 Type::INT64, -1 , true , ConvertedType::TIMESTAMP_MILLIS, true , check_TIMESTAMP},
19251970 {" timestamp_T_us" , LogicalType::Timestamp (true , LogicalType::TimeUnit::MICROS),
@@ -1928,6 +1973,7 @@ TEST_F(TestTemporalSchemaElementConstruction, TemporalCases) {
19281973 Type::INT64, -1 , false , ConvertedType::NA, true , check_TIMESTAMP},
19291974 {" timestamp_F_us_force" ,
19301975 LogicalType::Timestamp (false , LogicalType::TimeUnit::MILLIS,
1976+ /* is_from_converted_type=*/ false ,
19311977 /* force_set_converted_type=*/ true ),
19321978 Type::INT64, -1 , true , ConvertedType::TIMESTAMP_MILLIS, true , check_TIMESTAMP},
19331979 {" timestamp_T_ns" , LogicalType::Timestamp (true , LogicalType::TimeUnit::NANOS),
0 commit comments