diff --git a/datafusion/core/src/dataframe/mod.rs b/datafusion/core/src/dataframe/mod.rs index b1eb2a19e31d6..329af06fac12a 100644 --- a/datafusion/core/src/dataframe/mod.rs +++ b/datafusion/core/src/dataframe/mod.rs @@ -1801,7 +1801,8 @@ impl DataFrame { .iter() .map(|(qualifier, field)| { if qualifier.eq(&qualifier_rename) && field.as_ref() == field_rename { - col(Column::from((qualifier, field))).alias(new_name) + col(Column::from((qualifier, field))) + .alias_qualified(qualifier.cloned(), new_name) } else { col(Column::from((qualifier, field))) } diff --git a/datafusion/core/tests/dataframe/mod.rs b/datafusion/core/tests/dataframe/mod.rs index 8155fd6a2ff96..2c22192c0c7c7 100644 --- a/datafusion/core/tests/dataframe/mod.rs +++ b/datafusion/core/tests/dataframe/mod.rs @@ -63,7 +63,7 @@ use datafusion::{assert_batches_eq, assert_batches_sorted_eq}; use datafusion_catalog::TableProvider; use datafusion_common::{ assert_contains, Constraint, Constraints, DataFusionError, ParamValues, ScalarValue, - UnnestOptions, + TableReference, UnnestOptions, }; use datafusion_common_runtime::SpawnedTask; use datafusion_execution::config::SessionConfig; @@ -1617,9 +1617,25 @@ async fn with_column_renamed() -> Result<()> { // accepts table qualifier .with_column_renamed("aggregate_test_100.c2", "two")? // no-op for missing column - .with_column_renamed("c4", "boom")? - .collect() - .await?; + .with_column_renamed("c4", "boom")?; + + let references: Vec<_> = df_sum_renamed + .schema() + .iter() + .map(|(a, _)| a.cloned()) + .collect(); + + assert_eq!( + references, + vec![ + Some(TableReference::bare("aggregate_test_100")), // table name is preserved + Some(TableReference::bare("aggregate_test_100")), + Some(TableReference::bare("aggregate_test_100")), + None // total column + ] + ); + + let batches = &df_sum_renamed.collect().await?; assert_batches_sorted_eq!( [ @@ -1629,7 +1645,7 @@ async fn with_column_renamed() -> Result<()> { "| a | 3 | -72 | -69 |", "+-----+-----+-----+-------+", ], - &df_sum_renamed + batches ); Ok(()) diff --git a/datafusion/expr/src/logical_plan/builder.rs b/datafusion/expr/src/logical_plan/builder.rs index 4fdfb84aea420..b7c55b8c4b641 100644 --- a/datafusion/expr/src/logical_plan/builder.rs +++ b/datafusion/expr/src/logical_plan/builder.rs @@ -834,10 +834,16 @@ impl LogicalPlanBuilder { plan: &LogicalPlan, column: impl Into, ) -> Result { + let column = column.into(); + if column.relation.is_some() { + // column is already normalized + return Ok(column); + } + let schema = plan.schema(); let fallback_schemas = plan.fallback_normalize_schemas(); let using_columns = plan.using_columns()?; - column.into().normalize_with_schemas_and_ambiguity_check( + column.normalize_with_schemas_and_ambiguity_check( &[&[schema], &fallback_schemas], &using_columns, )