diff --git a/datafusion/sql/src/planner.rs b/datafusion/sql/src/planner.rs index 20a80e4f8ae9..763b134b714e 100644 --- a/datafusion/sql/src/planner.rs +++ b/datafusion/sql/src/planner.rs @@ -32,10 +32,10 @@ use datafusion_common::{ DFSchemaRef, Diagnostic, SchemaError, field_not_found, internal_err, plan_datafusion_err, }; +use datafusion_expr::Expr; use datafusion_expr::logical_plan::{LogicalPlan, LogicalPlanBuilder}; pub use datafusion_expr::planner::ContextProvider; use datafusion_expr::utils::find_column_exprs; -use datafusion_expr::{Expr, col}; use sqlparser::ast::{ArrayElemTypeDef, ExactNumberInfo, TimezoneInfo}; use sqlparser::ast::{ColumnDef as SQLColumnDef, ColumnOption}; use sqlparser::ast::{DataType as SQLDataType, Ident, ObjectName, TableAlias}; @@ -591,10 +591,10 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> { idents.len() ) } else { - let fields = plan.schema().fields().clone(); + let columns = plan.schema().columns().clone(); LogicalPlanBuilder::from(plan) - .project(fields.iter().zip(idents).map(|(field, ident)| { - col(field.name()).alias(self.ident_normalizer.normalize(ident)) + .project(columns.into_iter().zip(idents).map(|(col, ident)| { + Expr::Column(col).alias(self.ident_normalizer.normalize(ident)) }))? .build() } diff --git a/datafusion/sqllogictest/test_files/alias.slt b/datafusion/sqllogictest/test_files/alias.slt index 5339179db4c4..ae993c6e79b4 100644 --- a/datafusion/sqllogictest/test_files/alias.slt +++ b/datafusion/sqllogictest/test_files/alias.slt @@ -57,3 +57,50 @@ drop table t1; statement count 0 drop table t2; + + +# Test table-aliasing a subquery with case sensitive columns +# (https://github.com/apache/datafusion/issues/22916) + +statement ok +create table t ("A" int, "B.C" int); + +query II +select * from (select * from t) t_(x, y); +---- + +query TT +explain select * from (select * from t) t_(x, y); +---- +logical_plan +01)SubqueryAlias: t_ +02)--Projection: t.A AS x, t.B.C AS y +03)----TableScan: t projection=[A, B.C] +physical_plan +01)ProjectionExec: expr=[A@0 as x, B.C@1 as y] +02)--DataSourceExec: partitions=1, partition_sizes=[0] + +query TT +explain select * from (select * from t) t_(X, Y); +---- +logical_plan +01)SubqueryAlias: t_ +02)--Projection: t.A AS x, t.B.C AS y +03)----TableScan: t projection=[A, B.C] +physical_plan +01)ProjectionExec: expr=[A@0 as x, B.C@1 as y] +02)--DataSourceExec: partitions=1, partition_sizes=[0] + +query TT +explain select * from (select * from t) t_("X", "Y"); +---- +logical_plan +01)SubqueryAlias: t_ +02)--Projection: t.A AS X, t.B.C AS Y +03)----TableScan: t projection=[A, B.C] +physical_plan +01)ProjectionExec: expr=[A@0 as X, B.C@1 as Y] +02)--DataSourceExec: partitions=1, partition_sizes=[0] + +statement ok +drop table t;