Skip to content

Commit 66629b7

Browse files
test: add no-outer-rename aggregate unparse test
Adds test_unparse_aggregate_no_outer_rename to verify behavior when the outer Projection references aggregate columns without renaming them. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9a31259 commit 66629b7

1 file changed

Lines changed: 57 additions & 2 deletions

File tree

datafusion/sql/tests/cases/plan_to_sql.rs

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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!("\nLogical plan (verbose):\n{}", plan.display_indent_schema());
2945+
println!(
2946+
"\nLogical 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!("\nLogical plan (verbose):\n{}", plan.display_indent_schema());
3001+
println!(
3002+
"\nLogical 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!("\nUnparsed 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+
"\nLogical 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

Comments
 (0)