Skip to content

Commit c53451c

Browse files
committed
fix aggr/window plan
Signed-off-by: Ruihang Xia <waynestxia@gmail.com>
1 parent 07e23bd commit c53451c

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

datafusion/core/tests/set_comparison.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,24 @@ async fn set_comparison_any() -> Result<()> {
5555
Ok(())
5656
}
5757

58+
#[tokio::test]
59+
async fn set_comparison_any_aggregate_subquery() -> Result<()> {
60+
let ctx = SessionContext::new();
61+
62+
ctx.register_batch("t", build_table(&[1, 7])?)?;
63+
ctx.register_batch("s", build_table(&[1, 2, 3])?)?;
64+
65+
let df = ctx
66+
.sql(
67+
"select v from t where v > any(select sum(v) from s group by v % 2) order by v",
68+
)
69+
.await?;
70+
let results = df.collect().await?;
71+
72+
assert_batches_eq!(&["+---+", "| v |", "+---+", "| 7 |", "+---+",], &results);
73+
Ok(())
74+
}
75+
5876
#[tokio::test]
5977
async fn set_comparison_all_empty() -> Result<()> {
6078
let ctx = SessionContext::new();

datafusion/optimizer/src/rewrite_set_comparison.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,8 @@
2020
//! that capture SQL three-valued logic.
2121
2222
use crate::{OptimizerConfig, OptimizerRule};
23-
use datafusion_common::ExprSchema;
2423
use datafusion_common::tree_node::{Transformed, TreeNode};
25-
use datafusion_common::{DFSchema, Result, ScalarValue, plan_datafusion_err};
24+
use datafusion_common::{Column, DFSchema, ExprSchema, Result, ScalarValue, plan_err};
2625
use datafusion_expr::expr::{self, Exists, SetComparison, SetQuantifier};
2726
use datafusion_expr::logical_plan::Subquery;
2827
use datafusion_expr::logical_plan::builder::LogicalPlanBuilder;
@@ -91,10 +90,12 @@ fn build_set_comparison_subquery(
9190
} = set_comparison;
9291

9392
let left_expr = to_outer_reference(*expr, outer_schema)?;
94-
let right_expr = subquery
95-
.subquery
96-
.head_output_expr()?
97-
.ok_or_else(|| plan_datafusion_err!("single expression required."))?;
93+
let subquery_schema = subquery.subquery.schema();
94+
if subquery_schema.fields().is_empty() {
95+
return plan_err!("single expression required.");
96+
}
97+
// avoid `head_output_expr` for aggr/window plan, it will gives group-by expr if exists
98+
let right_expr = Expr::Column(Column::from(subquery_schema.qualified_field(0)));
9899

99100
let comparison = Expr::BinaryExpr(expr::BinaryExpr::new(
100101
Box::new(left_expr),

0 commit comments

Comments
 (0)