@@ -29,6 +29,7 @@ use vortex_array::expr::Expression;
2929use vortex_array:: expr:: forms:: conjuncts;
3030use vortex_array:: expr:: stats:: Precision ;
3131use vortex_array:: expr:: stats:: Stat ;
32+ use vortex_array:: expr:: transform:: coerce_expression;
3233use vortex_array:: extension:: datetime:: AnyTemporal ;
3334use vortex_array:: scalar:: Scalar ;
3435use vortex_array:: scalar:: ScalarValue ;
@@ -360,7 +361,8 @@ impl ScanPlanDataSource {
360361 scan_request : DataSourceScanRequest ,
361362 target_partitions : usize ,
362363 ) -> VortexResult < DataSourceScanRef > {
363- let dtype = scan_request. projection . return_dtype ( & self . dtype ) ?;
364+ let dtype = normalize_scan_expr ( scan_request. projection . clone ( ) , & self . dtype ) ?
365+ . return_dtype ( & self . dtype ) ?;
364366
365367 let meta = ScanMeta {
366368 label : Some ( "scan2" . to_string ( ) ) ,
@@ -483,7 +485,8 @@ impl DataSource for ScanPlanDataSource {
483485 let provider = self . session . scan_scheduler_provider ( ) ;
484486 let scheduler = provider. scheduler_for_scan ( & meta) ;
485487
486- let dtype = scan_request. projection . return_dtype ( & self . dtype ) ?;
488+ let dtype = normalize_scan_expr ( scan_request. projection . clone ( ) , & self . dtype ) ?
489+ . return_dtype ( & self . dtype ) ?;
487490 let limit_remaining = scan_request. limit . map ( AtomicU64 :: new) . map ( Arc :: new) ;
488491
489492 Ok ( Arc :: new ( ScanPlanDataSourceScan {
@@ -706,7 +709,8 @@ fn scan_plan_binding_stream(
706709 session : VortexSession ,
707710 request : DataSourceScanRequest ,
708711) -> VortexResult < SendableArrayStream > {
709- let output_dtype = request. projection . return_dtype ( binding. root ( ) . dtype ( ) ) ?;
712+ let output_dtype = normalize_scan_expr ( request. projection . clone ( ) , binding. root ( ) . dtype ( ) ) ?
713+ . return_dtype ( binding. root ( ) . dtype ( ) ) ?;
710714 let meta = ScanMeta {
711715 label : Some ( "scan2" . to_string ( ) ) ,
712716 } ;
@@ -2245,12 +2249,12 @@ impl PreparedScanPlan {
22452249 request : & DataSourceScanRequest ,
22462250 ) -> VortexResult < Self > {
22472251 let dtype = binding. root ( ) . dtype ( ) ;
2248- let return_dtype = request. projection . return_dtype ( dtype) ?;
2249- let projection = request . projection . optimize_recursive ( dtype) ?;
2252+ let projection = normalize_scan_expr ( request. projection . clone ( ) , dtype) ?;
2253+ let return_dtype = projection. return_dtype ( dtype) ?;
22502254 let filter = request
22512255 . filter
22522256 . clone ( )
2253- . map ( |filter| filter . optimize_recursive ( dtype) )
2257+ . map ( |filter| normalize_scan_expr ( filter , dtype) )
22542258 . transpose ( ) ?;
22552259
22562260 let root = binding. root ( ) ;
@@ -3002,6 +3006,10 @@ fn push_expr(
30023006 . ok_or_else ( || vortex_err ! ( "scan2 could not push expression {expr}" ) )
30033007}
30043008
3009+ fn normalize_scan_expr ( expr : Expression , dtype : & DType ) -> VortexResult < Expression > {
3010+ coerce_expression ( expr, dtype) ?. optimize_recursive ( dtype)
3011+ }
3012+
30053013fn validate_temporal_comparisons ( expr : & Expression , scope : & DType ) -> VortexResult < ( ) > {
30063014 for child in expr. children ( ) . iter ( ) {
30073015 validate_temporal_comparisons ( child, scope) ?;
0 commit comments