Skip to content

Commit 55f8b30

Browse files
committed
Narrow the case when not swapping
1 parent 4e5f42b commit 55f8b30

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

datafusion/datasource/src/file_scan_config.rs

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -267,24 +267,32 @@ impl DataSource for FileScanConfig {
267267
// If there is any non-column or alias-carrier expression, Projection should not be removed.
268268
// This process can be moved into CsvExec, but it would be an overlap of their responsibility.
269269

270-
Ok((all_alias_free_columns(projection.expr())
271-
&& self.table_partition_cols.is_empty())
272-
.then(|| {
273-
let file_scan = self.clone();
274-
let source = Arc::clone(&file_scan.file_source);
275-
let new_projections = new_projections_for_columns(
276-
projection,
277-
&file_scan
278-
.projection
279-
.clone()
280-
.unwrap_or((0..self.file_schema.fields().len()).collect()),
281-
);
282-
file_scan
283-
// Assign projected statistics to source
284-
.with_projection(Some(new_projections))
285-
.with_source(source)
286-
.build() as _
287-
}))
270+
let partitioned_columns_in_proj = projection.expr().iter().any(|(expr, _)| {
271+
expr.as_any()
272+
.downcast_ref::<Column>()
273+
.map(|expr| expr.index() >= self.file_schema.fields().len())
274+
.unwrap_or(false)
275+
});
276+
277+
Ok(
278+
(all_alias_free_columns(projection.expr()) && !partitioned_columns_in_proj)
279+
.then(|| {
280+
let file_scan = self.clone();
281+
let source = Arc::clone(&file_scan.file_source);
282+
let new_projections = new_projections_for_columns(
283+
projection,
284+
&file_scan
285+
.projection
286+
.clone()
287+
.unwrap_or((0..self.file_schema.fields().len()).collect()),
288+
);
289+
file_scan
290+
// Assign projected statistics to source
291+
.with_projection(Some(new_projections))
292+
.with_source(source)
293+
.build() as _
294+
}),
295+
)
288296
}
289297
}
290298

0 commit comments

Comments
 (0)