@@ -23,14 +23,26 @@ use serde::Deserialize;
23
23
use serde:: Serialize ;
24
24
25
25
use crate :: types:: decimal:: DecimalScalar ;
26
+ use crate :: types:: i256;
26
27
use crate :: types:: number:: NumberScalar ;
28
+ use crate :: types:: DecimalSize ;
27
29
use crate :: Scalar ;
28
30
31
+ #[ derive( Clone , Serialize , Deserialize , Debug , PartialEq , Eq , EnumAsInner ) ]
32
+ pub enum IndexDecimalScalar {
33
+ // For compatibility reason
34
+ // The old version only support Decimal128 and Decimal256
35
+ // We don't store decimal64 in index scalar, this is only used for compatibility reading
36
+ Decimal64 ( i64 , DecimalSize ) ,
37
+ Decimal128 ( i128 , DecimalSize ) ,
38
+ Decimal256 ( i256 , DecimalSize ) ,
39
+ }
40
+
29
41
#[ derive( Clone , Serialize , Deserialize , Debug , PartialEq , Eq , EnumAsInner ) ]
30
42
pub enum IndexScalar {
31
43
Null ,
32
44
Number ( NumberScalar ) ,
33
- Decimal ( DecimalScalar ) ,
45
+ Decimal ( IndexDecimalScalar ) ,
34
46
Timestamp ( i64 ) ,
35
47
Date ( i32 ) ,
36
48
Interval ( months_days_micros ) ,
@@ -50,7 +62,21 @@ impl TryFrom<IndexScalar> for Scalar {
50
62
Ok ( match value {
51
63
IndexScalar :: Null => Scalar :: Null ,
52
64
IndexScalar :: Number ( num_scalar) => Scalar :: Number ( num_scalar) ,
53
- IndexScalar :: Decimal ( dec_scalar) => Scalar :: Decimal ( dec_scalar) ,
65
+ IndexScalar :: Decimal ( dec_scalar) => match dec_scalar {
66
+ IndexDecimalScalar :: Decimal128 ( v, size) => {
67
+ if size. can_carried_by_64 ( ) {
68
+ Scalar :: Decimal ( DecimalScalar :: Decimal64 ( v as i64 , size) )
69
+ } else {
70
+ Scalar :: Decimal ( DecimalScalar :: Decimal128 ( v, size) )
71
+ }
72
+ }
73
+ IndexDecimalScalar :: Decimal256 ( v, size) => {
74
+ Scalar :: Decimal ( DecimalScalar :: Decimal256 ( v, size) )
75
+ }
76
+ IndexDecimalScalar :: Decimal64 ( v, size) => {
77
+ Scalar :: Decimal ( DecimalScalar :: Decimal64 ( v, size) )
78
+ }
79
+ } ,
54
80
IndexScalar :: Timestamp ( ts) => Scalar :: Timestamp ( ts) ,
55
81
IndexScalar :: Date ( date) => Scalar :: Date ( date) ,
56
82
IndexScalar :: Interval ( interval) => Scalar :: Interval ( interval) ,
@@ -77,7 +103,16 @@ impl TryFrom<Scalar> for IndexScalar {
77
103
Ok ( match value {
78
104
Scalar :: Null => IndexScalar :: Null ,
79
105
Scalar :: Number ( num_scalar) => IndexScalar :: Number ( num_scalar) ,
80
- Scalar :: Decimal ( dec_scalar) => IndexScalar :: Decimal ( dec_scalar) ,
106
+ Scalar :: Decimal ( dec_scalar) => {
107
+ match dec_scalar {
108
+ // still save as old format for compatibility
109
+ DecimalScalar :: Decimal64 ( v, size) => {
110
+ IndexScalar :: Decimal ( IndexDecimalScalar :: Decimal128 ( v as i128 , size) )
111
+ }
112
+ DecimalScalar :: Decimal128 ( v, size) => IndexScalar :: Decimal ( IndexDecimalScalar :: Decimal128 ( v, size) ) ,
113
+ DecimalScalar :: Decimal256 ( v, size) => IndexScalar :: Decimal ( IndexDecimalScalar :: Decimal256 ( v, size) ) ,
114
+ }
115
+ }
81
116
Scalar :: Timestamp ( ts) => IndexScalar :: Timestamp ( ts) ,
82
117
Scalar :: Date ( date) => IndexScalar :: Date ( date) ,
83
118
Scalar :: Interval ( interval) => IndexScalar :: Interval ( interval) ,
0 commit comments