@@ -1729,11 +1729,18 @@ mod tests {
17291729 free_scan, scan_builder, scan_builder_build, scan_builder_with_predicate,
17301730 scan_declarative_metadata_plan, EnginePredicate ,
17311731 } ;
1732+ use crate :: error:: EngineExecResult ;
17321733 use crate :: expressions:: kernel_visitor:: {
17331734 visit_expression_literal_bool, KernelExpressionVisitorState ,
17341735 } ;
1735- use crate :: ffi_test_utils:: { ok_or_panic, setup_snapshot} ;
1736- use crate :: { free_engine, free_snapshot, OptionalValue } ;
1736+ use crate :: ffi_test_utils:: { allocate_err, ok_or_panic, setup_snapshot} ;
1737+ use crate :: handle:: Handle ;
1738+ use crate :: plans:: result:: CPlanResult ;
1739+ use crate :: plans:: { get_plan_based_engine, get_plan_executor} ;
1740+ use crate :: {
1741+ free_engine, free_snapshot, KernelBytesSlice , NullableCvoid , OptionalValue ,
1742+ SharedExternEngine ,
1743+ } ;
17371744
17381745 extern "C" fn visit_false (
17391746 _predicate : * mut c_void ,
@@ -1742,6 +1749,22 @@ mod tests {
17421749 visit_expression_literal_bool ( state, false )
17431750 }
17441751
1752+ extern "C" fn unreachable_executor (
1753+ _context : NullableCvoid ,
1754+ _plan_proto : KernelBytesSlice ,
1755+ _out : * mut EngineExecResult < CPlanResult > ,
1756+ ) {
1757+ unreachable ! ( "plan executor does not run: these tables have no checkpoint" ) ;
1758+ }
1759+
1760+ /// Wrap a fallback engine in a `PlanBasedEngine` so it exposes a `PlanExecutor`.
1761+ unsafe fn plan_based_engine (
1762+ fallback : & Handle < SharedExternEngine > ,
1763+ ) -> Handle < SharedExternEngine > {
1764+ let executor = unsafe { get_plan_executor ( None , unreachable_executor) } ;
1765+ unsafe { get_plan_based_engine ( executor, fallback. shallow_copy ( ) , allocate_err) }
1766+ }
1767+
17451768 #[ tokio:: test]
17461769 async fn returns_query_plan_bytes ( ) {
17471770 let ( engine, snapshot) = setup_snapshot ( actions_to_string ( vec ! [
@@ -1753,9 +1776,10 @@ mod tests {
17531776
17541777 let builder = unsafe { scan_builder ( snapshot. shallow_copy ( ) ) } ;
17551778 let scan = unsafe { ok_or_panic ( scan_builder_build ( builder, engine. shallow_copy ( ) ) ) } ;
1779+ let plan_engine = unsafe { plan_based_engine ( & engine) } ;
17561780
17571781 let result = unsafe {
1758- scan_declarative_metadata_plan ( scan. shallow_copy ( ) , engine . shallow_copy ( ) )
1782+ scan_declarative_metadata_plan ( scan. shallow_copy ( ) , plan_engine . shallow_copy ( ) )
17591783 } ;
17601784 let bytes = match ok_or_panic ( result) {
17611785 OptionalValue :: Some ( bytes) => unsafe { bytes. into_vec ( ) } ,
@@ -1770,6 +1794,7 @@ mod tests {
17701794
17711795 unsafe { free_scan ( scan) } ;
17721796 unsafe { free_snapshot ( snapshot) } ;
1797+ unsafe { free_engine ( plan_engine) } ;
17731798 unsafe { free_engine ( engine) } ;
17741799 }
17751800
@@ -1795,9 +1820,10 @@ mod tests {
17951820 ) )
17961821 } ;
17971822 let scan = unsafe { ok_or_panic ( scan_builder_build ( builder, engine. shallow_copy ( ) ) ) } ;
1823+ let plan_engine = unsafe { plan_based_engine ( & engine) } ;
17981824
17991825 let result = unsafe {
1800- scan_declarative_metadata_plan ( scan. shallow_copy ( ) , engine . shallow_copy ( ) )
1826+ scan_declarative_metadata_plan ( scan. shallow_copy ( ) , plan_engine . shallow_copy ( ) )
18011827 } ;
18021828 assert ! (
18031829 matches!( ok_or_panic( result) , OptionalValue :: None ) ,
@@ -1806,6 +1832,7 @@ mod tests {
18061832
18071833 unsafe { free_scan ( scan) } ;
18081834 unsafe { free_snapshot ( snapshot) } ;
1835+ unsafe { free_engine ( plan_engine) } ;
18091836 unsafe { free_engine ( engine) } ;
18101837 }
18111838 }
0 commit comments