@@ -9,7 +9,8 @@ pub mod int32;
99pub mod int64;
1010pub mod int8;
1111pub mod null;
12- pub mod time;
12+ pub mod time32;
13+ pub mod time64;
1314pub mod tuple;
1415pub mod uint16;
1516pub mod uint32;
@@ -30,7 +31,8 @@ use crate::types::evaluator::int32::*;
3031use crate :: types:: evaluator:: int64:: * ;
3132use crate :: types:: evaluator:: int8:: * ;
3233use crate :: types:: evaluator:: null:: NullBinaryEvaluator ;
33- use crate :: types:: evaluator:: time:: * ;
34+ use crate :: types:: evaluator:: time32:: * ;
35+ use crate :: types:: evaluator:: time64:: * ;
3436use crate :: types:: evaluator:: tuple:: {
3537 TupleEqBinaryEvaluator , TupleGtBinaryEvaluator , TupleGtEqBinaryEvaluator ,
3638 TupleLtBinaryEvaluator , TupleLtEqBinaryEvaluator , TupleNotEqBinaryEvaluator ,
@@ -191,7 +193,28 @@ impl EvaluatorFactory {
191193 LogicalType :: Double => numeric_binary_evaluator ! ( Float64 , op, LogicalType :: Double ) ,
192194 LogicalType :: Date => numeric_binary_evaluator ! ( Date , op, LogicalType :: Date ) ,
193195 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+ } ,
195218 LogicalType :: Decimal ( _, _) => numeric_binary_evaluator ! ( Decimal , op, ty) ,
196219 LogicalType :: Boolean => match op {
197220 BinaryOperator :: And => Ok ( BinaryEvaluatorBox ( Arc :: new ( BooleanAndBinaryEvaluator ) ) ) ,
@@ -1032,6 +1055,164 @@ mod test {
10321055 Ok ( ( ) )
10331056 }
10341057
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+
10351216 #[ test]
10361217 fn test_reference_serialization ( ) -> Result < ( ) , DatabaseError > {
10371218 let mut cursor = Cursor :: new ( Vec :: new ( ) ) ;
0 commit comments