4
4
5
5
namespace clickhouse {
6
6
7
- Type::Type (const Code code) : code_(code) {
8
- }
7
+ Type::Type (const Code code) : code_(code) {}
9
8
10
9
std::string Type::GetName () const {
11
10
switch (code_) {
@@ -44,7 +43,9 @@ std::string Type::GetName() const {
44
43
case IPv6:
45
44
return " IPv6" ;
46
45
case DateTime:
47
- return " DateTime" ;
46
+ {
47
+ return As<DateTimeType>()->GetName ();
48
+ }
48
49
case DateTime64:
49
50
return As<DateTime64Type>()->GetName ();
50
51
case Date:
@@ -79,12 +80,12 @@ TypeRef Type::CreateDate() {
79
80
return TypeRef (new Type (Type::Date));
80
81
}
81
82
82
- TypeRef Type::CreateDateTime () {
83
- return TypeRef (new Type (Type::DateTime ));
83
+ TypeRef Type::CreateDateTime (std::string timezone ) {
84
+ return TypeRef (new DateTimeType ( std::move (timezone) ));
84
85
}
85
86
86
- TypeRef Type::CreateDateTime64 (size_t precision) {
87
- return TypeRef (new DateTime64Type (precision));
87
+ TypeRef Type::CreateDateTime64 (size_t precision, std::string timezone ) {
88
+ return TypeRef (new DateTime64Type (precision, std::move (timezone) ));
88
89
}
89
90
90
91
TypeRef Type::CreateDecimal (size_t precision, size_t scale) {
@@ -183,7 +184,7 @@ std::string EnumType::GetName() const {
183
184
result = " Enum16(" ;
184
185
}
185
186
186
- for (auto ei = value_to_name_.begin ();;) {
187
+ for (auto ei = value_to_name_.begin (); ei != value_to_name_. end () ;) {
187
188
result += " '" ;
188
189
result += ei->second ;
189
190
result += " ' = " ;
@@ -225,10 +226,36 @@ EnumType::ValueToNameIterator EnumType::EndValueToName() const {
225
226
return value_to_name_.end ();
226
227
}
227
228
229
+
230
+ namespace details
231
+ {
232
+ TypeWithTimeZoneMixin::TypeWithTimeZoneMixin (std::string timezone)
233
+ : timezone_(std::move(timezone)) {
234
+ }
235
+
236
+ const std::string & TypeWithTimeZoneMixin::Timezone () const {
237
+ return timezone_;
238
+ }
239
+ }
240
+
241
+ // / class DateTimeType
242
+ DateTimeType::DateTimeType (std::string timezone)
243
+ : Type(DateTime), details::TypeWithTimeZoneMixin(std::move(timezone)) {
244
+ }
245
+
246
+ std::string DateTimeType::GetName () const {
247
+ std::string datetime_representation = " DateTime" ;
248
+ const auto & timezone = Timezone ();
249
+ if (!timezone.empty ())
250
+ datetime_representation += " ('" + timezone + " ')" ;
251
+
252
+ return datetime_representation;
253
+ }
254
+
228
255
// / class DateTime64Type
229
256
230
- DateTime64Type::DateTime64Type (size_t precision)
231
- : Type(DateTime64), precision_(precision) {
257
+ DateTime64Type::DateTime64Type (size_t precision, std::string timezone )
258
+ : Type(DateTime64), details::TypeWithTimeZoneMixin(std::move(timezone)), precision_(precision) {
232
259
233
260
if (precision_ > 18 ) {
234
261
throw std::runtime_error (" DateTime64 precision is > 18" );
@@ -240,6 +267,12 @@ std::string DateTime64Type::GetName() const {
240
267
datetime64_representation.reserve (14 );
241
268
datetime64_representation += " DateTime64(" ;
242
269
datetime64_representation += std::to_string (precision_);
270
+
271
+ const auto & timezone = Timezone ();
272
+ if (!timezone.empty ()) {
273
+ datetime64_representation += " , '" + timezone + " '" ;
274
+ }
275
+
243
276
datetime64_representation += " )" ;
244
277
return datetime64_representation;
245
278
}
@@ -262,8 +295,9 @@ TupleType::TupleType(const std::vector<TypeRef>& item_types) : Type(Tuple), item
262
295
// / class LowCardinalityType
263
296
LowCardinalityType::LowCardinalityType (TypeRef nested_type) : Type(LowCardinality), nested_type_(nested_type) {
264
297
}
265
- LowCardinalityType::~LowCardinalityType ()
266
- {}
298
+
299
+ LowCardinalityType::~LowCardinalityType () {
300
+ }
267
301
268
302
std::string TupleType::GetName () const {
269
303
std::string result (" Tuple(" );
0 commit comments