@@ -978,7 +978,11 @@ impl OptimizerRule for PushDownFilter {
978978 let group_expr_columns = agg
979979 . group_expr
980980 . iter ( )
981- . map ( |e| Ok ( Column :: from_qualified_name ( e. schema_name ( ) . to_string ( ) ) ) )
981+ . map ( |e| {
982+ Ok ( Column :: from_qualified_name_ignore_case (
983+ e. schema_name ( ) . to_string ( ) ,
984+ ) )
985+ } )
982986 . collect :: < Result < HashSet < _ > > > ( ) ?;
983987
984988 let predicates = split_conjunction_owned ( filter. predicate ) ;
@@ -4160,4 +4164,55 @@ mod tests {
41604164 "
41614165 )
41624166 }
4167+
4168+ /// Create a test table scan with uppercase column names for case sensitivity testing
4169+ fn test_table_scan_with_uppercase_columns ( ) -> Result < LogicalPlan > {
4170+ let schema = Schema :: new ( vec ! [
4171+ Field :: new( "a" , DataType :: UInt32 , false ) ,
4172+ Field :: new( "A" , DataType :: UInt32 , false ) ,
4173+ Field :: new( "B" , DataType :: UInt32 , false ) ,
4174+ Field :: new( "C" , DataType :: UInt32 , false ) ,
4175+ ] ) ;
4176+ table_scan ( Some ( "test" ) , & schema, None ) ?. build ( )
4177+ }
4178+
4179+ #[ test]
4180+ fn filter_agg_case_insensitive ( ) -> Result < ( ) > {
4181+ let table_scan = test_table_scan_with_uppercase_columns ( ) ?;
4182+ let plan = LogicalPlanBuilder :: from ( table_scan)
4183+ . aggregate (
4184+ vec ! [ col( r#""A""# ) ] ,
4185+ vec ! [ sum( col( r#""B""# ) ) . alias( "total_salary" ) ] ,
4186+ ) ?
4187+ . filter ( col ( r#""A""# ) . gt ( lit ( 10i64 ) ) ) ?
4188+ . build ( ) ?;
4189+
4190+ assert_optimized_plan_equal ! (
4191+ plan,
4192+ @r"
4193+ Aggregate: groupBy=[[test.A]], aggr=[[sum(test.B) AS total_salary]]
4194+ TableScan: test, full_filters=[test.A > Int64(10)]
4195+ "
4196+ )
4197+ }
4198+
4199+ #[ test]
4200+ fn filter_agg_mix_case_insensitive ( ) -> Result < ( ) > {
4201+ let table_scan = test_table_scan_with_uppercase_columns ( ) ?;
4202+ let plan = LogicalPlanBuilder :: from ( table_scan)
4203+ . aggregate (
4204+ vec ! [ col( "a" ) ] ,
4205+ vec ! [ sum( col( r#""B""# ) ) . alias( "total_salary" ) ] ,
4206+ ) ?
4207+ . filter ( col ( "a" ) . gt ( lit ( 10i64 ) ) ) ?
4208+ . build ( ) ?;
4209+
4210+ assert_optimized_plan_equal ! (
4211+ plan,
4212+ @r"
4213+ Aggregate: groupBy=[[test.a]], aggr=[[sum(test.B) AS total_salary]]
4214+ TableScan: test, full_filters=[test.a > Int64(10)]
4215+ "
4216+ )
4217+ }
41634218}
0 commit comments