@@ -471,6 +471,26 @@ impl<E: 'static, F: 'static> EvalExprWrapper<E, F> {
471
471
let expr = ArgCheckEvalExpr :: < STRICT , N , _ , ArgC > :: new ( types, args, expr) ;
472
472
Ok ( Box :: new ( expr) )
473
473
}
474
+
475
+ #[ inline]
476
+ pub ( crate ) fn create_checked_with_ctx <
477
+ const STRICT : bool ,
478
+ const N : usize ,
479
+ ArgC : ' static + ArgChecker ,
480
+ > (
481
+ ident : E ,
482
+ types : [ PartiqlShape ; N ] ,
483
+ args : Vec < Box < dyn EvalExpr > > ,
484
+ f : F ,
485
+ ) -> Result < Box < dyn EvalExpr > , BindError >
486
+ where
487
+ EvalExprWrapper < E , F > : ExecuteEvalExpr < N > ,
488
+ {
489
+ let args = unwrap_args ( args) ?;
490
+ let expr = Self { ident, f } ;
491
+ let expr = ArgCheckEvalExpr :: < STRICT , N , _ , ArgC > :: new ( types, args, expr) ;
492
+ Ok ( Box :: new ( expr) )
493
+ }
474
494
}
475
495
476
496
/// An [`ExecuteEvalExpr`] over a single [`Value`] argument
@@ -479,19 +499,19 @@ pub(crate) struct UnaryValueExpr {}
479
499
480
500
impl < F > ExecuteEvalExpr < 1 > for EvalExprWrapper < UnaryValueExpr , F >
481
501
where
482
- F : Fn ( & Value ) -> Value ,
502
+ F : Fn ( & Value , & dyn EvalContext ) -> Value ,
483
503
{
484
504
#[ inline]
485
505
fn evaluate < ' a , ' c , ' o > (
486
506
& ' a self ,
487
507
args : [ Cow < ' a , Value > ; 1 ] ,
488
- _ctx : & ' c dyn EvalContext ,
508
+ ctx : & ' c dyn EvalContext ,
489
509
) -> Cow < ' a , Value >
490
510
where
491
511
' c : ' a ,
492
512
{
493
513
let [ arg] = args;
494
- Cow :: Owned ( ( self . f ) ( arg. borrow ( ) ) )
514
+ Cow :: Owned ( ( self . f ) ( arg. borrow ( ) , ctx ) )
495
515
}
496
516
}
497
517
@@ -517,9 +537,22 @@ impl UnaryValueExpr {
517
537
) -> Result < Box < dyn EvalExpr > , BindError >
518
538
where
519
539
F : ' static + Fn ( & Value ) -> Value ,
540
+ {
541
+ Self :: create_typed_with_ctx :: < { STRICT } , _ > ( types, args, move |val, _| f ( val) )
542
+ }
543
+
544
+ #[ allow( dead_code) ]
545
+ #[ inline]
546
+ pub ( crate ) fn create_typed_with_ctx < const STRICT : bool , F > (
547
+ types : [ PartiqlShape ; 1 ] ,
548
+ args : Vec < Box < dyn EvalExpr > > ,
549
+ f : F ,
550
+ ) -> Result < Box < dyn EvalExpr > , BindError >
551
+ where
552
+ F : ' static + Fn ( & Value , & dyn EvalContext ) -> Value ,
520
553
{
521
554
type Check < const STRICT : bool > = DefaultArgChecker < STRICT , PropagateMissing < true > > ;
522
- Self :: create_checked :: < { STRICT } , Check < STRICT > , F > ( types, args, f)
555
+ Self :: create_checked_with_ctx :: < { STRICT } , Check < STRICT > , F > ( types, args, f)
523
556
}
524
557
525
558
#[ allow( dead_code) ]
@@ -533,7 +566,26 @@ impl UnaryValueExpr {
533
566
F : ' static + Fn ( & Value ) -> Value ,
534
567
ArgC : ' static + ArgChecker ,
535
568
{
536
- EvalExprWrapper :: create_checked :: < { STRICT } , 1 , ArgC > ( Self :: default ( ) , types, args, f)
569
+ Self :: create_checked_with_ctx :: < { STRICT } , ArgC , _ > ( types, args, move |val, _| f ( val) )
570
+ }
571
+
572
+ #[ allow( dead_code) ]
573
+ #[ inline]
574
+ pub ( crate ) fn create_checked_with_ctx < const STRICT : bool , ArgC , F > (
575
+ types : [ PartiqlShape ; 1 ] ,
576
+ args : Vec < Box < dyn EvalExpr > > ,
577
+ f : F ,
578
+ ) -> Result < Box < dyn EvalExpr > , BindError >
579
+ where
580
+ F : ' static + Fn ( & Value , & dyn EvalContext ) -> Value ,
581
+ ArgC : ' static + ArgChecker ,
582
+ {
583
+ EvalExprWrapper :: create_checked_with_ctx :: < { STRICT } , 1 , ArgC > (
584
+ Self :: default ( ) ,
585
+ types,
586
+ args,
587
+ f,
588
+ )
537
589
}
538
590
}
539
591
@@ -543,19 +595,19 @@ pub(crate) struct BinaryValueExpr {}
543
595
544
596
impl < F > ExecuteEvalExpr < 2 > for EvalExprWrapper < BinaryValueExpr , F >
545
597
where
546
- F : Fn ( & Value , & Value ) -> Value ,
598
+ F : Fn ( & Value , & Value , & dyn EvalContext ) -> Value ,
547
599
{
548
600
#[ inline]
549
601
fn evaluate < ' a , ' c , ' o > (
550
602
& ' a self ,
551
603
args : [ Cow < ' a , Value > ; 2 ] ,
552
- _ctx : & ' c dyn EvalContext ,
604
+ ctx : & ' c dyn EvalContext ,
553
605
) -> Cow < ' a , Value >
554
606
where
555
607
' c : ' a ,
556
608
{
557
609
let [ arg1, arg2] = args;
558
- Cow :: Owned ( ( self . f ) ( arg1. borrow ( ) , arg2. borrow ( ) ) )
610
+ Cow :: Owned ( ( self . f ) ( arg1. borrow ( ) , arg2. borrow ( ) , ctx ) )
559
611
}
560
612
}
561
613
@@ -597,7 +649,12 @@ impl BinaryValueExpr {
597
649
F : ' static + Fn ( & Value , & Value ) -> Value ,
598
650
ArgC : ' static + ArgChecker ,
599
651
{
600
- EvalExprWrapper :: create_checked :: < { STRICT } , 2 , ArgC > ( Self :: default ( ) , types, args, f)
652
+ EvalExprWrapper :: create_checked :: < { STRICT } , 2 , ArgC > (
653
+ Self :: default ( ) ,
654
+ types,
655
+ args,
656
+ move |v1, v2, _| f ( v1, v2) ,
657
+ )
601
658
}
602
659
}
603
660
@@ -607,19 +664,19 @@ pub(crate) struct TernaryValueExpr {}
607
664
608
665
impl < F > ExecuteEvalExpr < 3 > for EvalExprWrapper < TernaryValueExpr , F >
609
666
where
610
- F : Fn ( & Value , & Value , & Value ) -> Value ,
667
+ F : Fn ( & Value , & Value , & Value , & dyn EvalContext ) -> Value ,
611
668
{
612
669
#[ inline]
613
670
fn evaluate < ' a , ' c , ' o > (
614
671
& ' a self ,
615
672
args : [ Cow < ' a , Value > ; 3 ] ,
616
- _ctx : & ' c dyn EvalContext ,
673
+ ctx : & ' c dyn EvalContext ,
617
674
) -> Cow < ' a , Value >
618
675
where
619
676
' c : ' a ,
620
677
{
621
678
let [ arg1, arg2, arg3] = args;
622
- Cow :: Owned ( ( self . f ) ( arg1. borrow ( ) , arg2. borrow ( ) , arg3. borrow ( ) ) )
679
+ Cow :: Owned ( ( self . f ) ( arg1. borrow ( ) , arg2. borrow ( ) , arg3. borrow ( ) , ctx ) )
623
680
}
624
681
}
625
682
@@ -661,7 +718,12 @@ impl TernaryValueExpr {
661
718
F : ' static + Fn ( & Value , & Value , & Value ) -> Value ,
662
719
ArgC : ' static + ArgChecker ,
663
720
{
664
- EvalExprWrapper :: create_checked :: < { STRICT } , 3 , ArgC > ( Self :: default ( ) , types, args, f)
721
+ EvalExprWrapper :: create_checked :: < { STRICT } , 3 , ArgC > (
722
+ Self :: default ( ) ,
723
+ types,
724
+ args,
725
+ move |v1, v2, v3, _| f ( v1, v2, v3) ,
726
+ )
665
727
}
666
728
}
667
729
@@ -671,13 +733,13 @@ pub(crate) struct QuaternaryValueExpr {}
671
733
672
734
impl < F > ExecuteEvalExpr < 4 > for EvalExprWrapper < QuaternaryValueExpr , F >
673
735
where
674
- F : Fn ( & Value , & Value , & Value , & Value ) -> Value ,
736
+ F : Fn ( & Value , & Value , & Value , & Value , & dyn EvalContext ) -> Value ,
675
737
{
676
738
#[ inline]
677
739
fn evaluate < ' a , ' c , ' o > (
678
740
& ' a self ,
679
741
args : [ Cow < ' a , Value > ; 4 ] ,
680
- _ctx : & ' c dyn EvalContext ,
742
+ ctx : & ' c dyn EvalContext ,
681
743
) -> Cow < ' a , Value >
682
744
where
683
745
' c : ' a ,
@@ -688,6 +750,7 @@ where
688
750
arg2. borrow ( ) ,
689
751
arg3. borrow ( ) ,
690
752
arg4. borrow ( ) ,
753
+ ctx,
691
754
) )
692
755
}
693
756
}
@@ -730,6 +793,11 @@ impl QuaternaryValueExpr {
730
793
F : ' static + Fn ( & Value , & Value , & Value , & Value ) -> Value ,
731
794
ArgC : ' static + ArgChecker ,
732
795
{
733
- EvalExprWrapper :: create_checked :: < { STRICT } , 4 , ArgC > ( Self :: default ( ) , types, args, f)
796
+ EvalExprWrapper :: create_checked :: < { STRICT } , 4 , ArgC > (
797
+ Self :: default ( ) ,
798
+ types,
799
+ args,
800
+ move |v1, v2, v3, v4, _| f ( v1, v2, v3, v4) ,
801
+ )
734
802
}
735
803
}
0 commit comments