| 132 | } |
| 133 | |
| 134 | unsafe extern "C" fn call_with_args_wrapper( |
| 135 | udtf: &FFI_TableFunction, |
| 136 | args: SVec<u8>, |
| 137 | session: FFI_SessionRef, |
| 138 | ) -> FFI_Result<FFI_TableProvider> { |
| 139 | let runtime = udtf.runtime(); |
| 140 | let udtf_inner = udtf.inner(); |
| 141 | |
| 142 | let ctx: Arc<TaskContext> = |
| 143 | sresult_return!((&udtf.logical_codec.task_ctx_provider).try_into()); |
| 144 | let codec: Arc<dyn LogicalExtensionCodec> = (&udtf.logical_codec).into(); |
| 145 | |
| 146 | let proto_filters = sresult_return!(LogicalExprList::decode(args.as_ref())); |
| 147 | |
| 148 | let args = sresult_return!(parse_exprs( |
| 149 | proto_filters.expr.iter(), |
| 150 | ctx.as_ref(), |
| 151 | codec.as_ref() |
| 152 | )); |
| 153 | |
| 154 | let mut foreign_session = None; |
| 155 | let session = sresult_return!( |
| 156 | session |
| 157 | .as_local() |
| 158 | .map(Ok::<&(dyn Session + Send + Sync), DataFusionError>) |
| 159 | .unwrap_or_else(|| { |
| 160 | foreign_session = Some(ForeignSession::try_from(&session)?); |
| 161 | Ok(foreign_session.as_ref().unwrap()) |
| 162 | }) |
| 163 | ); |
| 164 | let table_provider = sresult_return!( |
| 165 | udtf_inner.call_with_args(TableFunctionArgs::new(&args, session)) |
| 166 | ); |
| 167 | FFI_Result::Ok(FFI_TableProvider::new_with_ffi_codec( |
| 168 | table_provider, |
| 169 | false, |
| 170 | runtime, |
| 171 | udtf.logical_codec.clone(), |
| 172 | )) |
| 173 | } |
| 174 | |
| 175 | unsafe extern "C" fn release_fn_wrapper(udtf: &mut FFI_TableFunction) { |
| 176 | unsafe { |