@@ -8,12 +8,11 @@ TableFunction ArrowIPCTableFunction::GetFunction() {
8
8
9
9
TableFunction scan_arrow_ipc_func (
10
10
" scan_arrow_ipc" , {LogicalType::LIST (LogicalType::STRUCT (make_buffer_struct_children))},
11
- ArrowIPCTableFunction::ArrowScanFunction, ArrowIPCTableFunction::ArrowScanBind,
12
- ArrowTableFunction::ArrowScanInitGlobal, ArrowTableFunction::ArrowScanInitLocal);
11
+ ArrowIPCTableFunction::ArrowScanFunction, ArrowIPCTableFunction::ArrowScanBind,
12
+ ArrowTableFunction::ArrowScanInitGlobal, ArrowTableFunction::ArrowScanInitLocal);
13
13
14
14
scan_arrow_ipc_func.cardinality = ArrowTableFunction::ArrowScanCardinality;
15
- // FIXME this currently does not work yet
16
- // scan_arrow_ipc_func.get_batch_index = ArrowTableFunction::ArrowGetBatchIndex;
15
+ scan_arrow_ipc_func.get_batch_index = nullptr ; // TODO implement
17
16
scan_arrow_ipc_func.projection_pushdown = true ;
18
17
scan_arrow_ipc_func.filter_pushdown = false ;
19
18
@@ -80,7 +79,7 @@ unique_ptr <FunctionData> ArrowIPCTableFunction::ArrowScanBind(ClientContext &co
80
79
return std::move (res);
81
80
}
82
81
83
- // TODO: cleanup: only difference is the ArrowToDuckDB call
82
+ // Same as regular arrow scan, except ArrowToDuckDB call TODO: refactor to allow nicely overriding this
84
83
void ArrowIPCTableFunction::ArrowScanFunction (ClientContext &context, TableFunctionInput &data_p, DataChunk &output) {
85
84
if (!data_p.local_state ) {
86
85
return ;
@@ -90,16 +89,23 @@ void ArrowIPCTableFunction::ArrowScanFunction(ClientContext &context, TableFunct
90
89
auto &global_state = data_p.global_state ->Cast <ArrowScanGlobalState>();
91
90
92
91
// ! Out of tuples in this chunk
93
- if (state.chunk_offset >= (idx_t ) state.chunk ->arrow_array .length ) {
94
- if (!ArrowTableFunction:: ArrowScanParallelStateNext (context, data_p.bind_data .get (), state, global_state)) {
92
+ if (state.chunk_offset >= (idx_t )state.chunk ->arrow_array .length ) {
93
+ if (!ArrowScanParallelStateNext (context, data_p.bind_data .get (), state, global_state)) {
95
94
return ;
96
95
}
97
96
}
98
- int64_t output_size =
99
- MinValue<int64_t >(STANDARD_VECTOR_SIZE, state.chunk ->arrow_array .length - state.chunk_offset );
97
+ int64_t output_size = MinValue<int64_t >(STANDARD_VECTOR_SIZE, state.chunk ->arrow_array .length - state.chunk_offset );
100
98
data.lines_read += output_size;
101
- output.SetCardinality (output_size);
102
- ArrowTableFunction::ArrowToDuckDB (state, data.arrow_table .GetColumns (), output, data.lines_read - output_size, false );
99
+ if (global_state.CanRemoveFilterColumns ()) {
100
+ state.all_columns .Reset ();
101
+ state.all_columns .SetCardinality (output_size);
102
+ ArrowToDuckDB (state, data.arrow_table .GetColumns (), state.all_columns , data.lines_read - output_size, false );
103
+ output.ReferenceColumns (state.all_columns , global_state.projection_ids );
104
+ } else {
105
+ output.SetCardinality (output_size);
106
+ ArrowToDuckDB (state, data.arrow_table .GetColumns (), output, data.lines_read - output_size, false );
107
+ }
108
+
103
109
output.Verify ();
104
110
state.chunk_offset += output.size ();
105
111
}
0 commit comments