@@ -24,6 +24,8 @@ use databend_client::schema::{DataType, DecimalDataType, DecimalSize, NumberData
2424use ethnum:: i256;
2525use hex;
2626use jiff:: { civil:: DateTime as JiffDateTime , tz:: TimeZone , Zoned } ;
27+ use serde:: Deserialize ;
28+ use serde_json:: { value:: RawValue , Deserializer } ;
2729use std:: io:: { BufRead , Cursor } ;
2830use std:: str:: FromStr ;
2931
@@ -281,7 +283,9 @@ impl ValueDecoder {
281283
282284 fn read_string < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
283285 let mut buf = Vec :: new ( ) ;
284- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
286+ if reader. read_quoted_text ( & mut buf, b'"' ) . is_err ( ) {
287+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
288+ }
285289 Ok ( Value :: String ( unsafe { String :: from_utf8_unchecked ( buf) } ) )
286290 }
287291
@@ -295,54 +299,78 @@ impl ValueDecoder {
295299
296300 fn read_date < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
297301 let mut buf = Vec :: new ( ) ;
298- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
302+ if reader. read_quoted_text ( & mut buf, b'"' ) . is_err ( ) {
303+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
304+ }
299305 let v = unsafe { std:: str:: from_utf8_unchecked ( & buf) } ;
300306 let days = NaiveDate :: parse_from_str ( v, "%Y-%m-%d" ) ?. num_days_from_ce ( ) - DAYS_FROM_CE ;
301307 Ok ( Value :: Date ( days) )
302308 }
303309
304310 fn read_timestamp < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
305311 let mut buf = Vec :: new ( ) ;
306- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
312+ if reader. read_quoted_text ( & mut buf, b'"' ) . is_err ( ) {
313+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
314+ }
307315 let v = unsafe { std:: str:: from_utf8_unchecked ( & buf) } ;
308316 parse_timestamp ( v, & self . timezone )
309317 }
310318
311319 fn read_timestamp_tz < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
312320 let mut buf = Vec :: new ( ) ;
313- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
321+ if reader. read_quoted_text ( & mut buf, b'"' ) . is_err ( ) {
322+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
323+ }
314324 let v = unsafe { std:: str:: from_utf8_unchecked ( & buf) } ;
315325 let t = Zoned :: strptime ( TIMESTAMP_TIMEZONE_FORMAT , v) ?;
316326 Ok ( Value :: TimestampTz ( t) )
317327 }
318328
319329 fn read_interval < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
320330 let mut buf = Vec :: new ( ) ;
321- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
331+ if reader. read_quoted_text ( & mut buf, b'"' ) . is_err ( ) {
332+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
333+ }
322334 Ok ( Value :: Interval ( unsafe { String :: from_utf8_unchecked ( buf) } ) )
323335 }
324336
325337 fn read_bitmap < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
326338 let mut buf = Vec :: new ( ) ;
327- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
339+ if reader. read_quoted_text ( & mut buf, b'"' ) . is_err ( ) {
340+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
341+ }
328342 Ok ( Value :: Bitmap ( unsafe { String :: from_utf8_unchecked ( buf) } ) )
329343 }
330344
331345 fn read_variant < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
332- let mut buf = Vec :: new ( ) ;
333- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
334- Ok ( Value :: Variant ( unsafe { String :: from_utf8_unchecked ( buf) } ) )
346+ if let Ok ( val) = self . read_json ( reader) {
347+ Ok ( Value :: Variant ( val) )
348+ } else {
349+ let mut buf = Vec :: new ( ) ;
350+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
351+ Ok ( Value :: Variant ( unsafe { String :: from_utf8_unchecked ( buf) } ) )
352+ }
335353 }
336354
337355 fn read_geometry < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
338356 let mut buf = Vec :: new ( ) ;
339- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
357+ if reader. read_quoted_text ( & mut buf, b'"' ) . is_err ( ) {
358+ if let Ok ( val) = self . read_json ( reader) {
359+ return Ok ( Value :: Variant ( val) ) ;
360+ }
361+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
362+ }
340363 Ok ( Value :: Geometry ( unsafe { String :: from_utf8_unchecked ( buf) } ) )
341364 }
342365
343366 fn read_geography < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < Value > {
344367 let mut buf = Vec :: new ( ) ;
345- reader. read_quoted_text ( & mut buf, b'\'' ) ?;
368+ if reader. read_quoted_text ( & mut buf, b'"' ) . is_err ( ) {
369+ if let Ok ( val) = self . read_json ( reader) {
370+ return Ok ( Value :: Variant ( val) ) ;
371+ }
372+ reader. read_quoted_text ( & mut buf, b'\'' ) ?;
373+ }
346374 Ok ( Value :: Geography ( unsafe {
347375 String :: from_utf8_unchecked ( buf)
348376 } ) )
@@ -457,6 +485,15 @@ impl ValueDecoder {
457485 reader. must_ignore_byte ( b')' ) ?;
458486 Ok ( Value :: Tuple ( vals) )
459487 }
488+
489+ fn read_json < R : AsRef < [ u8 ] > > ( & self , reader : & mut Cursor < R > ) -> Result < String > {
490+ let start = reader. position ( ) as usize ;
491+ let data = reader. get_ref ( ) . as_ref ( ) ;
492+ let mut deserializer = Deserializer :: from_slice ( & data[ start..] ) ;
493+ let raw: Box < RawValue > = Box :: < RawValue > :: deserialize ( & mut deserializer) ?;
494+ reader. set_position ( ( start + raw. get ( ) . len ( ) ) as u64 ) ;
495+ Ok ( raw. to_string ( ) )
496+ }
460497}
461498
462499fn parse_timestamp ( ts_string : & str , tz : & TimeZone ) -> Result < Value > {
0 commit comments