@@ -591,7 +591,12 @@ std::shared_ptr<const LogicalType> LogicalType::FromThrift(
591591
592592 return GeographyLogicalType::Make (std::move (crs), algorithm);
593593 } else if (type.__isset .VARIANT ) {
594- return VariantLogicalType::Make ();
594+ int8_t specVersion = VARIANT_SPEC_VERSION;
595+ if (type.VARIANT .__isset .specification_version ) {
596+ specVersion = type.VARIANT .specification_version ;
597+ }
598+
599+ return VariantLogicalType::Make (specVersion);
595600 } else {
596601 // Sentinel type for one we do not recognize
597602 return UndefinedLogicalType::Make ();
@@ -659,8 +664,8 @@ std::shared_ptr<const LogicalType> LogicalType::Geography(
659664 return GeographyLogicalType::Make (std::move (crs), algorithm);
660665}
661666
662- std::shared_ptr<const LogicalType> LogicalType::Variant () {
663- return VariantLogicalType::Make ();
667+ std::shared_ptr<const LogicalType> LogicalType::Variant (int8_t specVersion ) {
668+ return VariantLogicalType::Make (specVersion );
664669}
665670
666671std::shared_ptr<const LogicalType> LogicalType::None () { return NoLogicalType::Make (); }
@@ -1958,24 +1963,53 @@ class LogicalType::Impl::Variant final : public LogicalType::Impl::Incompatible,
19581963 public:
19591964 friend class VariantLogicalType ;
19601965
1961- OVERRIDE_TOSTRING (Variant)
1966+ std::string ToString () const override ;
1967+ std::string ToJSON () const override ;
1968+ format::LogicalType ToThrift () const override ;
19621969
1963- format::LogicalType ToThrift () const override {
1964- format::LogicalType type;
1965- format::VariantType variant_type;
1966- variant_type.__set_specification_version (kSpecificationVersion );
1967- type.__set_VARIANT (variant_type);
1968- return type;
1969- }
1970+ int8_t spec_version () const { return specVersion_; }
19701971
19711972 private:
1972- Variant ()
1973+ explicit Variant (const int8_t specVersion )
19731974 : LogicalType::Impl(LogicalType::Type::VARIANT, SortOrder::UNKNOWN),
1974- LogicalType::Impl::Inapplicable () {}
1975- static constexpr int8_t kSpecificationVersion = 1 ;
1975+ LogicalType::Impl::Inapplicable() {
1976+ this ->specVersion_ = specVersion;
1977+ }
1978+
1979+ int8_t specVersion_;
19761980};
19771981
1978- GENERATE_MAKE (Variant)
1982+ int8_t VariantLogicalType::spec_version () const {
1983+ return (dynamic_cast <const LogicalType::Impl::Variant&>(*impl_)).spec_version ();
1984+ }
1985+
1986+ std::string LogicalType::Impl::Variant::ToString () const {
1987+ std::stringstream type;
1988+ type << " Variant(" << static_cast <int >(specVersion_) << " )" ;
1989+ return type.str ();
1990+ }
1991+
1992+ std::string LogicalType::Impl::Variant::ToJSON () const {
1993+ std::stringstream json;
1994+ json << R"( {"Type": "Variant", "SpecVersion": )" << static_cast <int >(specVersion_)
1995+ << " }" ;
1996+
1997+ return json.str ();
1998+ }
1999+
2000+ format::LogicalType LogicalType::Impl::Variant::ToThrift () const {
2001+ format::LogicalType type;
2002+ format::VariantType variant_type;
2003+ variant_type.__set_specification_version (specVersion_);
2004+ type.__set_VARIANT (variant_type);
2005+ return type;
2006+ }
2007+
2008+ std::shared_ptr<const LogicalType> VariantLogicalType::Make (const int8_t specVersion) {
2009+ auto logical_type = std::shared_ptr<VariantLogicalType>(new VariantLogicalType ());
2010+ logical_type->impl_ .reset (new LogicalType::Impl::Variant (specVersion));
2011+ return logical_type;
2012+ }
19792013
19802014class LogicalType ::Impl::No final : public LogicalType::Impl::SimpleCompatible,
19812015 public LogicalType::Impl::UniversalApplicable {
0 commit comments