@@ -272,31 +272,31 @@ struct CTableFunctionInfo final : TableFunctionInfo {
272272struct CTableBindData final : TableFunctionData {
273273 CTableBindData (
274274 unique_ptr<CTableFunctionInfo> info_p,
275- const vector<string>& column_names,
276275 Session&& session,
277- DataSource&& data_source)
276+ DataSource&& data_source,
277+ const vector<string>& column_names)
278278 : info(std::move(info_p))
279- , column_names(column_names)
280279 , session(std::move(session))
281- , data_source(std::move(data_source)) {}
280+ , data_source(std::move(data_source))
281+ , column_names(column_names) {}
282282
283283 ~CTableBindData () override = default ;
284284
285285 unique_ptr<FunctionData> Copy () const override {
286286 return make_uniq<CTableBindData>(
287287 make_uniq<CTableFunctionInfo>(info->vtab ),
288- column_names,
289288 Session{session},
290- DataSource{data_source});
289+ DataSource{data_source},
290+ column_names);
291291 }
292292
293293 unique_ptr<CTableFunctionInfo> info; // TODO remove
294294
295- // precomputed from data_source using vx_struct_fields_field_name, see c_bind()
296- vector<string> column_names;
297-
298295 Session session;
299296 DataSource data_source;
297+
298+ vector<string> column_names;
299+ vector<const vx_expression*> filters;
300300};
301301
302302struct CTableGlobalData final : GlobalTableFunctionState {
@@ -368,12 +368,12 @@ unique_ptr<FunctionData> c_bind(
368368 auto & vtab = info.table_function .function_info ->Cast <CTableFunctionInfo>().vtab ;
369369 return make_uniq<CTableBindData>(
370370 make_uniq<CTableFunctionInfo>(vtab),
371- names,
372371 std::move (session),
373- std::move (data_source));
372+ std::move (data_source),
373+ names);
374374}
375375
376- const vx_expression* projection (
376+ const vx_expression* make_projection (
377377 const vector<column_t >& column_ids,
378378 const vector<idx_t >& projection_ids,
379379 const vector<string>& column_names
@@ -417,6 +417,16 @@ const vx_expression* projection(
417417 return expr;
418418}
419419
420+ const vx_expression* make_filter (
421+ optional_ptr<TableFilterSet> table_filters,
422+ const vector<column_t >& column_ids,
423+ const vector<string>& column_names,
424+ const vector<const vx_expression*>& additional_filters,
425+ const vx_dtype* dtype
426+ ) {
427+ return nullptr ;
428+ }
429+
420430unique_ptr<GlobalTableFunctionState> c_init_global (ClientContext &, TableFunctionInitInput &input) {
421431 const auto &bind = input.bind_data ->Cast <CTableBindData>();
422432
@@ -425,9 +435,16 @@ unique_ptr<GlobalTableFunctionState> c_init_global(ClientContext &, TableFunctio
425435 .idx_len = 0 ,
426436 .include = VX_S_INCLUDE_ALL,
427437 };
438+
439+ const vx_dtype* dtype = vx_data_source_dtype (bind.data_source .handle ());
440+ const vx_expression* projection = make_projection (
441+ input.column_ids , input.projection_ids , bind.column_names );
442+ const vx_expression* filter = make_filter (input.filters ,
443+ input.column_ids , bind.column_names , bind.filters , dtype);
444+
428445 vx_scan_options options = {
429- .projection = projection (input. column_ids , input. projection_ids , bind. column_names ) ,
430- .filter = nullptr ,
446+ .projection = projection,
447+ .filter = filter ,
431448 .row_range_begin = 0 ,
432449 .row_range_end = 0 ,
433450 .selection = selection,
@@ -446,10 +463,10 @@ unique_ptr<LocalTableFunctionState> c_init_local(ExecutionContext &,
446463}
447464
448465void c_function (ClientContext &context, TableFunctionInput &input, DataChunk &output) {
449- Scan& scan = input.global_state ->Cast <CTableGlobalData>(). scan ;
466+ auto & global_state = input.global_state ->Cast <CTableGlobalData>();
450467 auto & batch_id = input.local_state ->Cast <CTableLocalData>().batch_id ;
451468
452- auto next_partition = scan.next_partition ();
469+ auto next_partition = global_state. scan .next_partition ();
453470 if (!next_partition) return ;
454471 Partition partition = std::move (*next_partition);
455472
@@ -466,30 +483,17 @@ void c_function(ClientContext &context, TableFunctionInput &input, DataChunk &ou
466483 }
467484}
468485
469- // void c_pushdown_complex_filter(ClientContext & /*context*/,
470- // LogicalGet & /*get*/,
471- // FunctionData *bind_data,
472- // vector<unique_ptr<Expression>> &filters) {
473- // if (filters.empty()) {
474- // return;
475- // }
476- //
477- // auto &bind = bind_data->Cast<CTableBindData>();
478- //
479- // for (auto iter = filters.begin(); iter != filters.end();) {
480- // duckdb_vx_error error_out = nullptr;
481- // auto pushed =
482- // bind.info->vtab.pushdown_complex_filter(bind_data->Cast<CTableBindData>().ffi_data->DataPtr(),
483- // reinterpret_cast<duckdb_vx_expr>(iter->get()),
484- // &error_out);
485- // if (error_out) {
486- // throw BinderException(IntoErrString(error_out));
487- // }
488- //
489- // // If the pushdown complex filter returns true, we can remove the filter from the list.
490- // iter = pushed ? filters.erase(iter) : std::next(iter);
491- // }
492- // }
486+ const vx_expression* from_filter (const Expression& filter) {
487+ return nullptr ;
488+ }
489+
490+ void c_pushdown_complex_filter (ClientContext &, LogicalGet &, FunctionData *bind_data, vector<unique_ptr<Expression>> &filters) {
491+ auto &bind = bind_data->Cast <CTableBindData>();
492+ // We don't erase filters, see Nick's comment in datasource.rs
493+ for (auto iter = filters.begin (); iter != filters.end (); ++iter) {
494+ bind.filters .emplace_back (from_filter (**iter));
495+ }
496+ }
493497
494498unique_ptr<NodeStatistics> c_cardinality (ClientContext &, const FunctionData *bind_data) {
495499 auto stats = make_uniq<NodeStatistics>();
@@ -537,7 +541,7 @@ extern "C" duckdb_state duckdb_vx_tfunc_register(
537541 auto db = wrapper->database ->instance ;
538542 auto tf = TableFunction (vtab->name , {}, c_function, c_bind, c_init_global, c_init_local);
539543
540- // tf.pushdown_complex_filter = c_pushdown_complex_filter;
544+ tf.pushdown_complex_filter = c_pushdown_complex_filter;
541545
542546 // tf.projection_pushdown = vtab->projection_pushdown;
543547 // tf.filter_pushdown = vtab->filter_pushdown;
0 commit comments