@@ -20,22 +20,21 @@ use crate::cursor_ext::{
2020} ;
2121use crate :: error:: { ConvertError , Result } ;
2222use chrono:: { Datelike , NaiveDate } ;
23- use chrono_tz:: Tz ;
2423use databend_client:: schema:: { DataType , DecimalDataType , DecimalSize , NumberDataType } ;
2524use ethnum:: i256;
2625use hex;
27- use jiff:: { civil:: DateTime as JiffDateTime , Zoned } ;
26+ use jiff:: { civil:: DateTime as JiffDateTime , tz :: TimeZone , Zoned } ;
2827use std:: io:: { BufRead , Cursor } ;
2928use std:: str:: FromStr ;
3029
3130const NULL_VALUE : & str = "NULL" ;
3231const TRUE_VALUE : & str = "1" ;
3332const FALSE_VALUE : & str = "0" ;
3433
35- impl TryFrom < ( & DataType , Option < String > , Tz ) > for Value {
34+ impl TryFrom < ( & DataType , Option < String > , & TimeZone ) > for Value {
3635 type Error = Error ;
3736
38- fn try_from ( ( t, v, tz) : ( & DataType , Option < String > , Tz ) ) -> Result < Self > {
37+ fn try_from ( ( t, v, tz) : ( & DataType , Option < String > , & TimeZone ) ) -> Result < Self > {
3938 match v {
4039 Some ( v) => Self :: try_from ( ( t, v, tz) ) ,
4140 None => match t {
@@ -49,10 +48,10 @@ impl TryFrom<(&DataType, Option<String>, Tz)> for Value {
4948 }
5049}
5150
52- impl TryFrom < ( & DataType , String , Tz ) > for Value {
51+ impl TryFrom < ( & DataType , String , & TimeZone ) > for Value {
5352 type Error = Error ;
5453
55- fn try_from ( ( t, v, tz) : ( & DataType , String , Tz ) ) -> Result < Self > {
54+ fn try_from ( ( t, v, tz) : ( & DataType , String , & TimeZone ) ) -> Result < Self > {
5655 match t {
5756 DataType :: Null => Ok ( Self :: Null ) ,
5857 DataType :: EmptyArray => Ok ( Self :: EmptyArray ) ,
@@ -114,7 +113,9 @@ impl TryFrom<(&DataType, String, Tz)> for Value {
114113 DataType :: Interval => Ok ( Self :: Interval ( v) ) ,
115114 DataType :: Array ( _) | DataType :: Map ( _) | DataType :: Tuple ( _) | DataType :: Vector ( _) => {
116115 let mut reader = Cursor :: new ( v. as_str ( ) ) ;
117- let decoder = ValueDecoder { timezone : tz } ;
116+ let decoder = ValueDecoder {
117+ timezone : tz. clone ( ) ,
118+ } ;
118119 decoder. read_field ( t, & mut reader)
119120 }
120121 DataType :: Nullable ( inner) => match inner. as_ref ( ) {
@@ -134,7 +135,7 @@ impl TryFrom<(&DataType, String, Tz)> for Value {
134135}
135136
136137struct ValueDecoder {
137- pub timezone : Tz ,
138+ pub timezone : TimeZone ,
138139}
139140
140141impl ValueDecoder {
@@ -299,7 +300,7 @@ impl ValueDecoder {
299300 let mut buf = Vec :: new ( ) ;
300301 reader. read_quoted_text ( & mut buf, b'\'' ) ?;
301302 let v = unsafe { std:: str:: from_utf8_unchecked ( & buf) } ;
302- parse_timestamp ( v, self . timezone )
303+ parse_timestamp ( v, & self . timezone )
303304 }
304305
305306 fn read_timestamp_tz < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
@@ -453,10 +454,12 @@ impl ValueDecoder {
453454 }
454455}
455456
456- fn parse_timestamp ( ts_string : & str , tz : Tz ) -> Result < Value > {
457+ fn parse_timestamp ( ts_string : & str , tz : & TimeZone ) -> Result < Value > {
457458 let local = JiffDateTime :: strptime ( TIMESTAMP_FORMAT , ts_string) ?;
458- let dt_with_tz = local. in_tz ( tz. name ( ) ) . map_err ( |e| {
459- Error :: Parsing ( format ! ( "time {ts_string} not exists in timezone {tz}: {e}" ) )
459+ let dt_with_tz = local. to_zoned ( tz. clone ( ) ) . map_err ( |e| {
460+ Error :: Parsing ( format ! (
461+ "time {ts_string} not exists in timezone {tz:?}: {e}"
462+ ) )
460463 } ) ?;
461464 Ok ( Value :: Timestamp ( dt_with_tz) )
462465}
0 commit comments