@@ -2942,7 +2942,10 @@ fn roundtrip_aggregate_over_subquery() -> Result<(), DataFusionError> {
29422942 . unwrap_or_else ( |e| panic ! ( "Failed to parse sql: {sql}\n {e}" ) ) ;
29432943
29442944 println ! ( "Logical plan:\n {plan}" ) ;
2945- println ! ( "\n Logical plan (verbose):\n {}" , plan. display_indent_schema( ) ) ;
2945+ println ! (
2946+ "\n Logical plan (verbose):\n {}" ,
2947+ plan. display_indent_schema( )
2948+ ) ;
29462949
29472950 let unparser = Unparser :: new ( & UnparserDefaultDialect { } ) ;
29482951 let roundtrip_statement = unparser. plan_to_sql ( & plan) ?;
@@ -2995,7 +2998,59 @@ fn test_unparse_aggregate_over_subquery_no_inner_proj() -> Result<()> {
29952998 . build ( ) ?;
29962999
29973000 println ! ( "Logical plan:\n {plan}" ) ;
2998- println ! ( "\n Logical plan (verbose):\n {}" , plan. display_indent_schema( ) ) ;
3001+ println ! (
3002+ "\n Logical plan (verbose):\n {}" ,
3003+ plan. display_indent_schema( )
3004+ ) ;
3005+
3006+ let unparser = Unparser :: default ( ) ;
3007+ let sql = unparser. plan_to_sql ( & plan) ?. to_string ( ) ;
3008+ println ! ( "\n Unparsed SQL:\n {sql}" ) ;
3009+
3010+ Ok ( ( ) )
3011+ }
3012+
3013+ /// Same as test_unparse_aggregate_over_subquery_no_inner_proj but the outer
3014+ /// Projection references the aggregate columns WITHOUT renaming them.
3015+ /// The output column names should still match the Aggregate's aliases.
3016+ ///
3017+ /// Plan shape:
3018+ /// Projection: __agg_0, __agg_1
3019+ /// Aggregate: aggr=[[max(bla.j1_rename) AS __agg_0, max(bla.j1_rename) AS __agg_1]]
3020+ /// SubqueryAlias: bla
3021+ /// Projection: j1.j1_id AS j1_rename
3022+ /// TableScan: j1
3023+ #[ test]
3024+ fn test_unparse_aggregate_no_outer_rename ( ) -> Result < ( ) > {
3025+ let context = MockContextProvider {
3026+ state : MockSessionState :: default ( ) ,
3027+ } ;
3028+ let j1_schema = context
3029+ . get_table_source ( TableReference :: bare ( "j1" ) ) ?
3030+ . schema ( ) ;
3031+
3032+ let scan = table_scan ( Some ( "j1" ) , & j1_schema, None ) ?. build ( ) ?;
3033+ let inner_subquery = LogicalPlanBuilder :: from ( scan)
3034+ . project ( vec ! [ col( "j1.j1_id" ) . alias( "j1_rename" ) ] ) ?
3035+ . alias ( "bla" ) ?
3036+ . build ( ) ?;
3037+
3038+ let plan = LogicalPlanBuilder :: from ( inner_subquery)
3039+ . aggregate (
3040+ vec ! [ ] as Vec < Expr > ,
3041+ vec ! [
3042+ max( col( "bla.j1_rename" ) ) . alias( "__agg_0" ) ,
3043+ max( col( "bla.j1_rename" ) ) . alias( "__agg_1" ) ,
3044+ ] ,
3045+ ) ?
3046+ . project ( vec ! [ col( "__agg_0" ) , col( "__agg_1" ) ] ) ?
3047+ . build ( ) ?;
3048+
3049+ println ! ( "Logical plan:\n {plan}" ) ;
3050+ println ! (
3051+ "\n Logical plan (verbose):\n {}" ,
3052+ plan. display_indent_schema( )
3053+ ) ;
29993054
30003055 let unparser = Unparser :: default ( ) ;
30013056 let sql = unparser. plan_to_sql ( & plan) ?. to_string ( ) ;
0 commit comments