@@ -9,7 +9,8 @@ pub mod int32;
9
9
pub mod int64;
10
10
pub mod int8;
11
11
pub mod null;
12
- pub mod time;
12
+ pub mod time32;
13
+ pub mod time64;
13
14
pub mod tuple;
14
15
pub mod uint16;
15
16
pub mod uint32;
@@ -30,7 +31,8 @@ use crate::types::evaluator::int32::*;
30
31
use crate :: types:: evaluator:: int64:: * ;
31
32
use crate :: types:: evaluator:: int8:: * ;
32
33
use crate :: types:: evaluator:: null:: NullBinaryEvaluator ;
33
- use crate :: types:: evaluator:: time:: * ;
34
+ use crate :: types:: evaluator:: time32:: * ;
35
+ use crate :: types:: evaluator:: time64:: * ;
34
36
use crate :: types:: evaluator:: tuple:: {
35
37
TupleEqBinaryEvaluator , TupleGtBinaryEvaluator , TupleGtEqBinaryEvaluator ,
36
38
TupleLtBinaryEvaluator , TupleLtEqBinaryEvaluator , TupleNotEqBinaryEvaluator ,
@@ -191,7 +193,28 @@ impl EvaluatorFactory {
191
193
LogicalType :: Double => numeric_binary_evaluator ! ( Float64 , op, LogicalType :: Double ) ,
192
194
LogicalType :: Date => numeric_binary_evaluator ! ( Date , op, LogicalType :: Date ) ,
193
195
LogicalType :: DateTime => numeric_binary_evaluator ! ( DateTime , op, LogicalType :: DateTime ) ,
194
- LogicalType :: Time => numeric_binary_evaluator ! ( Time , op, LogicalType :: Time ) ,
196
+ LogicalType :: Time ( _, _) => match op {
197
+ BinaryOperator :: Plus => Ok ( BinaryEvaluatorBox ( Arc :: new ( TimePlusBinaryEvaluator ) ) ) ,
198
+ BinaryOperator :: Minus => Ok ( BinaryEvaluatorBox ( Arc :: new ( TimeMinusBinaryEvaluator ) ) ) ,
199
+ BinaryOperator :: Gt => Ok ( BinaryEvaluatorBox ( Arc :: new ( TimeGtBinaryEvaluator ) ) ) ,
200
+ BinaryOperator :: GtEq => Ok ( BinaryEvaluatorBox ( Arc :: new ( TimeGtEqBinaryEvaluator ) ) ) ,
201
+ BinaryOperator :: Lt => Ok ( BinaryEvaluatorBox ( Arc :: new ( TimeLtBinaryEvaluator ) ) ) ,
202
+ BinaryOperator :: LtEq => Ok ( BinaryEvaluatorBox ( Arc :: new ( TimeLtEqBinaryEvaluator ) ) ) ,
203
+ BinaryOperator :: Eq => Ok ( BinaryEvaluatorBox ( Arc :: new ( TimeEqBinaryEvaluator ) ) ) ,
204
+ BinaryOperator :: NotEq => Ok ( BinaryEvaluatorBox ( Arc :: new ( TimeNotEqBinaryEvaluator ) ) ) ,
205
+ _ => Err ( DatabaseError :: UnsupportedBinaryOperator ( ty, op) ) ,
206
+ } ,
207
+ LogicalType :: TimeStamp ( _, _) => match op {
208
+ BinaryOperator :: Gt => Ok ( BinaryEvaluatorBox ( Arc :: new ( Time64GtBinaryEvaluator ) ) ) ,
209
+ BinaryOperator :: GtEq => Ok ( BinaryEvaluatorBox ( Arc :: new ( Time64GtEqBinaryEvaluator ) ) ) ,
210
+ BinaryOperator :: Lt => Ok ( BinaryEvaluatorBox ( Arc :: new ( Time64LtBinaryEvaluator ) ) ) ,
211
+ BinaryOperator :: LtEq => Ok ( BinaryEvaluatorBox ( Arc :: new ( Time64LtEqBinaryEvaluator ) ) ) ,
212
+ BinaryOperator :: Eq => Ok ( BinaryEvaluatorBox ( Arc :: new ( Time64EqBinaryEvaluator ) ) ) ,
213
+ BinaryOperator :: NotEq => {
214
+ Ok ( BinaryEvaluatorBox ( Arc :: new ( Time64NotEqBinaryEvaluator ) ) )
215
+ }
216
+ _ => Err ( DatabaseError :: UnsupportedBinaryOperator ( ty, op) ) ,
217
+ } ,
195
218
LogicalType :: Decimal ( _, _) => numeric_binary_evaluator ! ( Decimal , op, ty) ,
196
219
LogicalType :: Boolean => match op {
197
220
BinaryOperator :: And => Ok ( BinaryEvaluatorBox ( Arc :: new ( BooleanAndBinaryEvaluator ) ) ) ,
@@ -1032,6 +1055,164 @@ mod test {
1032
1055
Ok ( ( ) )
1033
1056
}
1034
1057
1058
+ #[ test]
1059
+ fn test_binary_op_time32_and_time64 ( ) -> Result < ( ) , DatabaseError > {
1060
+ let evaluator_time32 =
1061
+ EvaluatorFactory :: binary_create ( LogicalType :: Time ( None , false ) , BinaryOperator :: Plus ) ?;
1062
+ assert_eq ! (
1063
+ evaluator_time32. 0 . binary_eval(
1064
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1065
+ & DataValue :: Time32 ( 2621204256 , 4 , false ) ,
1066
+ ) ,
1067
+ DataValue :: Time32 ( 2618593017 , 4 , false )
1068
+ ) ;
1069
+ assert_eq ! (
1070
+ evaluator_time32. 0 . binary_eval(
1071
+ & DataValue :: Time32 ( 4190175696 , 3 , false ) ,
1072
+ & DataValue :: Time32 ( 2621224256 , 4 , false ) ,
1073
+ ) ,
1074
+ DataValue :: Null
1075
+ ) ;
1076
+
1077
+ let evaluator_time32 =
1078
+ EvaluatorFactory :: binary_create ( LogicalType :: Time ( None , false ) , BinaryOperator :: Minus ) ?;
1079
+ assert_eq ! (
1080
+ evaluator_time32. 0 . binary_eval(
1081
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1082
+ & DataValue :: Time32 ( 2621204256 , 4 , false ) ,
1083
+ ) ,
1084
+ DataValue :: Null
1085
+ ) ;
1086
+ assert_eq ! (
1087
+ evaluator_time32. 0 . binary_eval(
1088
+ & DataValue :: Time32 ( 2621204256 , 4 , false ) ,
1089
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1090
+ ) ,
1091
+ DataValue :: Time32 ( 2375496 , 4 , false )
1092
+ ) ;
1093
+
1094
+ let evaluator_time32 =
1095
+ EvaluatorFactory :: binary_create ( LogicalType :: Time ( None , false ) , BinaryOperator :: Gt ) ?;
1096
+ let evaluator_time64 = EvaluatorFactory :: binary_create (
1097
+ LogicalType :: TimeStamp ( None , false ) ,
1098
+ BinaryOperator :: Gt ,
1099
+ ) ?;
1100
+ assert_eq ! (
1101
+ evaluator_time32. 0 . binary_eval(
1102
+ & DataValue :: Time32 ( 2621204256 , 4 , false ) ,
1103
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1104
+ ) ,
1105
+ DataValue :: Boolean ( true )
1106
+ ) ;
1107
+ assert_eq ! (
1108
+ evaluator_time32. 0 . binary_eval(
1109
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1110
+ & DataValue :: Time32 ( 2621204256 , 4 , false ) ,
1111
+ ) ,
1112
+ DataValue :: Boolean ( false )
1113
+ ) ;
1114
+ assert_eq ! (
1115
+ evaluator_time64. 0 . binary_eval(
1116
+ & DataValue :: Time64 ( 1736055775154814 , 6 , false ) ,
1117
+ & DataValue :: Time64 ( 1738734177256 , 3 , false ) ,
1118
+ ) ,
1119
+ DataValue :: Boolean ( false )
1120
+ ) ;
1121
+ assert_eq ! (
1122
+ evaluator_time64. 0 . binary_eval(
1123
+ & DataValue :: Time64 ( 1738734177256 , 3 , false ) ,
1124
+ & DataValue :: Time64 ( 1736055775154814 , 6 , false ) ,
1125
+ ) ,
1126
+ DataValue :: Boolean ( true )
1127
+ ) ;
1128
+
1129
+ let evaluator_time32 =
1130
+ EvaluatorFactory :: binary_create ( LogicalType :: Time ( None , false ) , BinaryOperator :: GtEq ) ?;
1131
+ let evaluator_time64 = EvaluatorFactory :: binary_create (
1132
+ LogicalType :: TimeStamp ( None , false ) ,
1133
+ BinaryOperator :: GtEq ,
1134
+ ) ?;
1135
+ assert_eq ! (
1136
+ evaluator_time32. 0 . binary_eval(
1137
+ & DataValue :: Time32 ( 2621204256 , 4 , false ) ,
1138
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1139
+ ) ,
1140
+ DataValue :: Boolean ( true )
1141
+ ) ;
1142
+ assert_eq ! (
1143
+ evaluator_time32. 0 . binary_eval(
1144
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1145
+ & DataValue :: Time32 ( 2621204256 , 4 , false ) ,
1146
+ ) ,
1147
+ DataValue :: Boolean ( false )
1148
+ ) ;
1149
+ assert_eq ! (
1150
+ evaluator_time32. 0 . binary_eval(
1151
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1152
+ & DataValue :: Time32 ( 2618828760 , 4 , false ) ,
1153
+ ) ,
1154
+ DataValue :: Boolean ( true )
1155
+ ) ;
1156
+ assert_eq ! (
1157
+ evaluator_time64. 0 . binary_eval(
1158
+ & DataValue :: Time64 ( 1736055775154814 , 6 , false ) ,
1159
+ & DataValue :: Time64 ( 1738734177256 , 3 , false ) ,
1160
+ ) ,
1161
+ DataValue :: Boolean ( false )
1162
+ ) ;
1163
+ assert_eq ! (
1164
+ evaluator_time64. 0 . binary_eval(
1165
+ & DataValue :: Time64 ( 1738734177256 , 3 , false ) ,
1166
+ & DataValue :: Time64 ( 1736055775154814 , 6 , false ) ,
1167
+ ) ,
1168
+ DataValue :: Boolean ( true )
1169
+ ) ;
1170
+ assert_eq ! (
1171
+ evaluator_time64. 0 . binary_eval(
1172
+ & DataValue :: Time64 ( 1738734177256 , 3 , false ) ,
1173
+ & DataValue :: Time64 ( 1738734177256000 , 6 , false ) ,
1174
+ ) ,
1175
+ DataValue :: Boolean ( true )
1176
+ ) ;
1177
+
1178
+ let evaluator_time32 =
1179
+ EvaluatorFactory :: binary_create ( LogicalType :: Time ( None , false ) , BinaryOperator :: Eq ) ?;
1180
+ let evaluator_time64 = EvaluatorFactory :: binary_create (
1181
+ LogicalType :: TimeStamp ( None , false ) ,
1182
+ BinaryOperator :: Eq ,
1183
+ ) ?;
1184
+ assert_eq ! (
1185
+ evaluator_time32. 0 . binary_eval(
1186
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1187
+ & DataValue :: Time32 ( 2621204256 , 4 , false ) ,
1188
+ ) ,
1189
+ DataValue :: Boolean ( false )
1190
+ ) ;
1191
+ assert_eq ! (
1192
+ evaluator_time32. 0 . binary_eval(
1193
+ & DataValue :: Time32 ( 4190119896 , 3 , false ) ,
1194
+ & DataValue :: Time32 ( 2618828760 , 4 , false ) ,
1195
+ ) ,
1196
+ DataValue :: Boolean ( true )
1197
+ ) ;
1198
+ assert_eq ! (
1199
+ evaluator_time64. 0 . binary_eval(
1200
+ & DataValue :: Time64 ( 1738734177256 , 3 , false ) ,
1201
+ & DataValue :: Time64 ( 1736055775154814 , 6 , false ) ,
1202
+ ) ,
1203
+ DataValue :: Boolean ( false )
1204
+ ) ;
1205
+ assert_eq ! (
1206
+ evaluator_time64. 0 . binary_eval(
1207
+ & DataValue :: Time64 ( 1738734177256 , 3 , false ) ,
1208
+ & DataValue :: Time64 ( 1738734177256000 , 6 , false ) ,
1209
+ ) ,
1210
+ DataValue :: Boolean ( true )
1211
+ ) ;
1212
+
1213
+ Ok ( ( ) )
1214
+ }
1215
+
1035
1216
#[ test]
1036
1217
fn test_reference_serialization ( ) -> Result < ( ) , DatabaseError > {
1037
1218
let mut cursor = Cursor :: new ( Vec :: new ( ) ) ;
0 commit comments