Skip to content

Commit a6ceca1

Browse files
committed
fix
1 parent 2ea5478 commit a6ceca1

17 files changed

Lines changed: 171 additions & 70 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ benchmark/clickbench/results
9090
.lycheecache
9191

9292
.claude
93+
.codex
9394

9495
# tmp
9596
tmp

src/query/sql/src/planner/binder/aggregate.rs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -891,8 +891,7 @@ impl Binder {
891891
}
892892
}
893893

894-
let original_context = bind_context.expr_context.clone();
895-
bind_context.set_expr_context(ExprContext::GroupClaue);
894+
let original_context = bind_context.replace_expr_context(ExprContext::GroupClaue);
896895

897896
let group_by = Self::expand_group(group_by.clone())?;
898897
match &group_by {
@@ -920,7 +919,7 @@ impl Binder {
920919
}
921920
_ => unreachable!(),
922921
}
923-
bind_context.set_expr_context(original_context);
922+
bind_context.expr_context = original_context;
924923
Ok(())
925924
}
926925

@@ -1448,6 +1447,34 @@ impl Binder {
14481447
Ok((scalar.clone(), scalar.data_type()?))
14491448
}
14501449
}
1450+
1451+
pub(super) fn bind_and_rewrite_aggregate_expr(
1452+
&mut self,
1453+
bind_context: &mut BindContext,
1454+
aliases: &[(String, ScalarExpr)],
1455+
expr_context: ExprContext,
1456+
expr: &Expr,
1457+
) -> Result<ScalarExpr> {
1458+
let original_context = bind_context.replace_expr_context(expr_context);
1459+
1460+
let mut scalar_binder = ScalarBinder::new(
1461+
bind_context,
1462+
self.ctx.clone(),
1463+
&self.name_resolution_ctx,
1464+
self.metadata.clone(),
1465+
aliases,
1466+
);
1467+
1468+
let (mut result, _) = scalar_binder.bind(expr)?;
1469+
AggregateRewriter::rewrite_expr(
1470+
&mut bind_context.aggregate_info,
1471+
self.metadata.clone(),
1472+
&mut result,
1473+
)?;
1474+
1475+
bind_context.expr_context = original_context;
1476+
Ok(result)
1477+
}
14511478
}
14521479

14531480
fn build_replaced_aggregate_column(

src/query/sql/src/planner/binder/bind_context.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ use crate::plans::ScalarExpr;
6565

6666
/// Context of current expression, this is used to check if
6767
/// the expression is valid in current context.
68-
#[derive(Debug, Clone, Default, EnumAsInner)]
68+
#[derive(Debug, Clone, Copy, Default, EnumAsInner)]
6969
pub enum ExprContext {
7070
SelectClause,
7171
WhereClause,
@@ -919,8 +919,10 @@ impl BindContext {
919919
self.columns.iter().map(|c| c.index).collect()
920920
}
921921

922-
pub fn set_expr_context(&mut self, expr_context: ExprContext) {
923-
self.expr_context = expr_context;
922+
pub fn replace_expr_context(&mut self, new: ExprContext) -> ExprContext {
923+
let old = self.expr_context;
924+
self.expr_context = new;
925+
old
924926
}
925927
}
926928

src/query/sql/src/planner/binder/bind_query/bind_select.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ use crate::optimizer::ir::SExpr;
5454
use crate::planner::QueryExecutor;
5555
use crate::planner::binder::BindContext;
5656
use crate::planner::binder::Binder;
57+
use crate::planner::binder::ExprContext;
5758

5859
impl Binder {
5960
#[async_backtrace::framed]
@@ -143,6 +144,24 @@ impl Binder {
143144

144145
self.analyze_aggregate_select(&mut from_context, &mut select_list)?;
145146

147+
if let Some(having) = &stmt.having {
148+
self.bind_and_rewrite_aggregate_expr(
149+
&mut from_context,
150+
&semantic_aliases,
151+
ExprContext::HavingClause,
152+
having,
153+
)?;
154+
}
155+
156+
for order in order_by {
157+
self.bind_and_rewrite_aggregate_expr(
158+
&mut from_context,
159+
&semantic_aliases,
160+
ExprContext::OrderByClause,
161+
&order.expr,
162+
)?;
163+
}
164+
146165
// `analyze_window` should behind `analyze_aggregate_select`,
147166
// because `analyze_window` will rewrite the aggregate functions in the window function's arguments.
148167
self.analyze_window(&mut from_context, &mut select_list)?;
@@ -247,7 +266,7 @@ impl Binder {
247266
}
248267

249268
if stmt.distinct {
250-
s_expr = self.bind_distinct(stmt.span, &mut from_context, &mut select_info, s_expr)?;
269+
s_expr = self.bind_distinct(stmt.span, &mut select_info, s_expr)?;
251270
}
252271

253272
s_expr = self.bind_projection(&mut from_context, select_info, s_expr)?;

src/query/sql/src/planner/binder/distinct.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use std::sync::Arc;
1717
use databend_common_ast::Span;
1818
use databend_common_exception::Result;
1919

20-
use crate::BindContext;
2120
use crate::binder::Binder;
2221
use crate::binder::project::SelectInfo;
2322
use crate::optimizer::ir::SExpr;
@@ -28,7 +27,6 @@ impl Binder {
2827
pub fn bind_distinct(
2928
&self,
3029
span: Span,
31-
_bind_context: &mut BindContext,
3230
select_info: &mut SelectInfo,
3331
child: SExpr,
3432
) -> Result<SExpr> {

src/query/sql/src/planner/binder/having.rs

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ use super::Finder;
2222
use crate::BindContext;
2323
use crate::Binder;
2424
use crate::binder::ExprContext;
25-
use crate::binder::ScalarBinder;
26-
use crate::binder::aggregate::AggregateRewriter;
2725
use crate::binder::split_conjunctions;
2826
use crate::optimizer::ir::SExpr;
2927
use crate::planner::semantic::GroupingChecker;
@@ -41,22 +39,12 @@ impl Binder {
4139
aliases: &[(String, ScalarExpr)],
4240
having: &Expr,
4341
) -> Result<ScalarExpr> {
44-
bind_context.set_expr_context(ExprContext::HavingClause);
45-
46-
let mut scalar_binder = ScalarBinder::new(
42+
self.bind_and_rewrite_aggregate_expr(
4743
bind_context,
48-
self.ctx.clone(),
49-
&self.name_resolution_ctx,
50-
self.metadata.clone(),
5144
aliases,
52-
);
53-
let (mut scalar, _) = scalar_binder.bind(having)?;
54-
AggregateRewriter::rewrite_expr(
55-
&mut bind_context.aggregate_info,
56-
self.metadata.clone(),
57-
&mut scalar,
58-
)?;
59-
Ok(scalar)
45+
ExprContext::HavingClause,
46+
having,
47+
)
6048
}
6149

6250
pub fn bind_having(
@@ -65,7 +53,7 @@ impl Binder {
6553
having: ScalarExpr,
6654
child: SExpr,
6755
) -> Result<SExpr> {
68-
bind_context.set_expr_context(ExprContext::HavingClause);
56+
bind_context.expr_context = ExprContext::HavingClause;
6957

7058
let f = |scalar: &ScalarExpr| matches!(scalar, ScalarExpr::WindowFunction(_));
7159
let mut finder = Finder::new(&f);

src/query/sql/src/planner/binder/project.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ impl Binder {
325325
select_info: SelectInfo,
326326
child: SExpr,
327327
) -> Result<SExpr> {
328-
bind_context.set_expr_context(ExprContext::SelectClause);
328+
bind_context.expr_context = ExprContext::SelectClause;
329329
let plan = select_info.into_projection_plan()?;
330330
let eval_scalar = EvalScalar { items: plan.items };
331331
let new_expr = SExpr::create_unary(Arc::new(eval_scalar.into()), Arc::new(child));
@@ -354,7 +354,7 @@ impl Binder {
354354
input_context: &mut BindContext,
355355
select_list: &'a [SelectTarget],
356356
) -> Result<SelectList<'a>> {
357-
input_context.set_expr_context(ExprContext::SelectClause);
357+
input_context.expr_context = ExprContext::SelectClause;
358358

359359
let mut output = SelectList::default();
360360
let mut prev_aliases = Vec::new();

src/query/sql/src/planner/binder/qualify.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ impl Binder {
4343
aliases: &[(String, ScalarExpr)],
4444
qualify: &Expr,
4545
) -> Result<ScalarExpr> {
46-
bind_context.set_expr_context(ExprContext::QualifyClause);
46+
bind_context.expr_context = ExprContext::QualifyClause;
4747
let mut scalar_binder = ScalarBinder::new(
4848
bind_context,
4949
self.ctx.clone(),
@@ -63,7 +63,7 @@ impl Binder {
6363
qualify: ScalarExpr,
6464
child: SExpr,
6565
) -> Result<SExpr> {
66-
bind_context.set_expr_context(ExprContext::QualifyClause);
66+
bind_context.expr_context = ExprContext::QualifyClause;
6767

6868
let scalar = {
6969
let mut qualify = qualify;

src/query/sql/src/planner/binder/select.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,7 @@ impl Binder {
7575
expr: &Expr,
7676
child: SExpr,
7777
) -> Result<(SExpr, ScalarExpr)> {
78-
let last_expr_context = bind_context.expr_context.clone();
79-
bind_context.set_expr_context(ExprContext::WhereClause);
78+
let last_expr_context = bind_context.replace_expr_context(ExprContext::WhereClause);
8079

8180
let mut scalar_binder = ScalarBinder::new(
8281
bind_context,
@@ -103,7 +102,7 @@ impl Binder {
103102
predicates: split_conjunctions(&scalar),
104103
};
105104
let new_expr = SExpr::create_unary(Arc::new(filter_plan.into()), Arc::new(child));
106-
bind_context.set_expr_context(last_expr_context);
105+
bind_context.expr_context = last_expr_context;
107106

108107
Ok((new_expr, scalar))
109108
}
@@ -308,8 +307,7 @@ impl Binder {
308307
if distinct {
309308
let mut select_info =
310309
SelectInfo::from_columns(new_bind_context.all_column_bindings().to_vec());
311-
new_expr =
312-
self.bind_distinct(left_span, &mut new_bind_context, &mut select_info, new_expr)?;
310+
new_expr = self.bind_distinct(left_span, &mut select_info, new_expr)?;
313311
}
314312

315313
Ok((new_expr, new_bind_context))
@@ -381,7 +379,7 @@ impl Binder {
381379

382380
// then apply distinct
383381
let mut select_info = SelectInfo::from_columns(left_context.all_column_bindings().to_vec());
384-
let s_expr = self.bind_distinct(left_span, &mut left_context, &mut select_info, s_expr)?;
382+
let s_expr = self.bind_distinct(left_span, &mut select_info, s_expr)?;
385383
Ok((s_expr, left_context))
386384
}
387385

src/query/sql/src/planner/binder/sort.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ impl Binder {
6262
order_by: &[OrderByExpr],
6363
distinct: bool,
6464
) -> Result<OrderItems> {
65-
bind_context.set_expr_context(ExprContext::OrderByClause);
65+
bind_context.expr_context = ExprContext::OrderByClause;
6666
let settings = self.ctx.get_settings();
6767
let default_nulls_first = settings.get_nulls_first();
6868

0 commit comments

Comments
 (0)