1
- // Copyright 2022 CeresDB Project Authors. Licensed under Apache-2.0.
1
+ // Copyright 2022-2023 CeresDB Project Authors. Licensed under Apache-2.0.
2
2
3
3
//! Datum holds different kind of data
4
4
@@ -8,78 +8,78 @@ use arrow::temporal_conversions::{EPOCH_DAYS_FROM_CE, NANOSECONDS};
8
8
use ceresdbproto:: schema:: DataType as DataTypePb ;
9
9
use chrono:: { Datelike , Local , NaiveDate , NaiveTime , TimeZone , Timelike } ;
10
10
use serde:: ser:: { Serialize , Serializer } ;
11
- use snafu:: { Backtrace , ResultExt , Snafu } ;
11
+ use snafu:: { Backtrace , OptionExt , ResultExt , Snafu } ;
12
12
use sqlparser:: ast:: { DataType as SqlDataType , Value } ;
13
13
14
- use crate :: { bytes:: Bytes , hash:: hash64, string:: StringBytes , time:: Timestamp } ;
14
+ use crate :: { bytes:: Bytes , hash:: hash64, hex , string:: StringBytes , time:: Timestamp } ;
15
15
16
16
const DATE_FORMAT : & str = "%Y-%m-%d" ;
17
17
const TIME_FORMAT : & str = "%H:%M:%S%.3f" ;
18
18
19
19
#[ derive( Debug , Snafu ) ]
20
20
pub enum Error {
21
- #[ snafu( display(
22
- "Unsupported SQL data type, type:{}.\n Backtrace:\n {}" ,
23
- sql_type,
24
- backtrace
25
- ) ) ]
21
+ #[ snafu( display( "Unsupported SQL data type, type:{sql_type}.\n Backtrace:\n {backtrace}" ) ) ]
26
22
UnsupportedDataType {
27
23
sql_type : SqlDataType ,
28
24
backtrace : Backtrace ,
29
25
} ,
30
26
31
- #[ snafu( display( "Invalid double or float, err:{}.\n Backtrace:\n {}" , source , backtrace ) ) ]
27
+ #[ snafu( display( "Invalid double or float, err:{source }.\n Backtrace:\n {backtrace}" ) ) ]
32
28
InvalidDouble {
33
29
source : std:: num:: ParseFloatError ,
34
30
backtrace : Backtrace ,
35
31
} ,
36
32
37
33
#[ snafu( display(
38
- "Invalid insert value, kind:{}, value:{:?}.\n Backtrace:\n {}" ,
39
- kind,
40
- value,
41
- backtrace
34
+ "Invalid insert value, kind:{kind}, value:{value:?}.\n Backtrace:\n {backtrace}"
42
35
) ) ]
43
36
InvalidValueType {
44
37
kind : DatumKind ,
45
38
value : Value ,
46
39
backtrace : Backtrace ,
47
40
} ,
48
- #[ snafu( display( "Invalid timestamp, err:{}.\n Backtrace:\n {}" , source, backtrace) ) ]
41
+
42
+ #[ snafu( display( "Invalid timestamp, err:{source}.\n Backtrace:\n {backtrace}" ) ) ]
49
43
InvalidTimestamp {
50
44
source : std:: num:: ParseIntError ,
51
45
backtrace : Backtrace ,
52
46
} ,
53
47
54
- #[ snafu( display( "Invalid date, err:{}.\n Backtrace:\n {}" , source , backtrace ) ) ]
48
+ #[ snafu( display( "Invalid date, err:{source }.\n Backtrace:\n {backtrace}" ) ) ]
55
49
InvalidDate {
56
50
source : chrono:: ParseError ,
57
51
backtrace : Backtrace ,
58
52
} ,
59
53
60
- #[ snafu( display( "Invalid time, err:{}.\n Backtrace:\n {}" , source , backtrace ) ) ]
54
+ #[ snafu( display( "Invalid time, err:{source }.\n Backtrace:\n {backtrace}" ) ) ]
61
55
InvalidTimeCause {
62
56
source : chrono:: ParseError ,
63
57
backtrace : Backtrace ,
64
58
} ,
65
59
66
- #[ snafu( display( "Invalid time, err:{}.\n Backtrace:\n {}" , source , backtrace ) ) ]
60
+ #[ snafu( display( "Invalid time, err:{source }.\n Backtrace:\n {backtrace}" ) ) ]
67
61
InvalidTimeHourFormat {
68
62
source : std:: num:: ParseIntError ,
69
63
backtrace : Backtrace ,
70
64
} ,
71
65
72
- #[ snafu( display( "Invalid time, err:{}" , msg ) ) ]
73
- InvalidTimeNoCause { msg : String } ,
66
+ #[ snafu( display( "Invalid time, err:{msg}. \n Backtrace: \n {backtrace}" ) ) ]
67
+ InvalidTimeNoCause { msg : String , backtrace : Backtrace } ,
74
68
75
- #[ snafu( display( "Invalid integer, err:{}.\n Backtrace:\n {}" , source , backtrace ) ) ]
69
+ #[ snafu( display( "Invalid integer, err:{source }.\n Backtrace:\n {backtrace}" ) ) ]
76
70
InvalidInt {
77
71
source : std:: num:: ParseIntError ,
78
72
backtrace : Backtrace ,
79
73
} ,
80
74
81
- #[ snafu( display( "Invalid datum byte, byte:{}.\n Backtrace:\n {}" , value , backtrace ) ) ]
75
+ #[ snafu( display( "Invalid datum byte, byte:{value }.\n Backtrace:\n {backtrace}" ) ) ]
82
76
InvalidDatumByte { value : u8 , backtrace : Backtrace } ,
77
+
78
+ #[ snafu( display( "Invalid hex value, hex_val:{hex_val}.\n Backtrace:\n {backtrace}" ) ) ]
79
+ InvalidHexValue {
80
+ hex_val : String ,
81
+ backtrace : Backtrace ,
82
+ } ,
83
83
}
84
84
85
85
pub type Result < T > = std:: result:: Result < T , Error > ;
@@ -749,6 +749,10 @@ impl Datum {
749
749
( DatumKind :: Varbinary , Value :: DoubleQuotedString ( s) ) => {
750
750
Ok ( Datum :: Varbinary ( Bytes :: from ( s) ) )
751
751
}
752
+ ( DatumKind :: Varbinary , Value :: HexStringLiteral ( s) ) => {
753
+ let bytes = hex:: try_decode ( & s) . context ( InvalidHexValue { hex_val : s } ) ?;
754
+ Ok ( Datum :: Varbinary ( Bytes :: from ( bytes) ) )
755
+ }
752
756
( DatumKind :: String , Value :: DoubleQuotedString ( s) ) => {
753
757
Ok ( Datum :: String ( StringBytes :: from ( s) ) )
754
758
}
@@ -1478,4 +1482,49 @@ mod tests {
1478
1482
assert ! ( Datum :: parse_datum_time_from_str( source) . is_err( ) ) ;
1479
1483
}
1480
1484
}
1485
+
1486
+ #[ test]
1487
+ fn test_convert_from_sql_value ( ) {
1488
+ let cases = vec ! [
1489
+ (
1490
+ Value :: Boolean ( false ) ,
1491
+ DatumKind :: Boolean ,
1492
+ true ,
1493
+ Some ( Datum :: Boolean ( false ) ) ,
1494
+ ) ,
1495
+ (
1496
+ Value :: Number ( "100.1" . to_string( ) , false ) ,
1497
+ DatumKind :: Float ,
1498
+ true ,
1499
+ Some ( Datum :: Float ( 100.1 ) ) ,
1500
+ ) ,
1501
+ (
1502
+ Value :: SingleQuotedString ( "string_literal" . to_string( ) ) ,
1503
+ DatumKind :: String ,
1504
+ true ,
1505
+ Some ( Datum :: String ( StringBytes :: from_static( "string_literal" ) ) ) ,
1506
+ ) ,
1507
+ (
1508
+ Value :: HexStringLiteral ( "c70a0b" . to_string( ) ) ,
1509
+ DatumKind :: Varbinary ,
1510
+ true ,
1511
+ Some ( Datum :: Varbinary ( Bytes :: from( vec![ 199 , 10 , 11 ] ) ) ) ,
1512
+ ) ,
1513
+ (
1514
+ Value :: EscapedStringLiteral ( "string_literal" . to_string( ) ) ,
1515
+ DatumKind :: String ,
1516
+ false ,
1517
+ None ,
1518
+ ) ,
1519
+ ] ;
1520
+
1521
+ for ( input, kind, succeed, expect) in cases {
1522
+ let res = Datum :: try_from_sql_value ( & kind, input) ;
1523
+ if succeed {
1524
+ assert_eq ! ( res. unwrap( ) , expect. unwrap( ) ) ;
1525
+ } else {
1526
+ assert ! ( res. is_err( ) ) ;
1527
+ }
1528
+ }
1529
+ }
1481
1530
}
0 commit comments