From 1e2b400cd5a835dd004c42953e1b0a2daa1219eb Mon Sep 17 00:00:00 2001 From: Fedomn Date: Sun, 11 Dec 2022 18:41:07 +0800 Subject: [PATCH] feat(planner): support expression alias Signed-off-by: Fedomn --- src/planner_v2/binder/expression/mod.rs | 9 +++++++++ .../binder/query_node/bind_select_node.rs | 15 ++++++++++++--- tests/slt/select.slt | 9 +++++++++ 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/planner_v2/binder/expression/mod.rs b/src/planner_v2/binder/expression/mod.rs index 0b92b6b..22aabae 100644 --- a/src/planner_v2/binder/expression/mod.rs +++ b/src/planner_v2/binder/expression/mod.rs @@ -47,4 +47,13 @@ impl BoundExpression { BoundExpression::BoundCastExpression(expr) => expr.base.alias.clone(), } } + + pub fn set_alias(&mut self, alias: String) { + match self { + BoundExpression::BoundColumnRefExpression(expr) => expr.base.alias = alias, + BoundExpression::BoundConstantExpression(expr) => expr.base.alias = alias, + BoundExpression::BoundReferenceExpression(expr) => expr.base.alias = alias, + BoundExpression::BoundCastExpression(expr) => expr.base.alias = alias, + } + } } diff --git a/src/planner_v2/binder/query_node/bind_select_node.rs b/src/planner_v2/binder/query_node/bind_select_node.rs index c9863c0..0aeae63 100644 --- a/src/planner_v2/binder/query_node/bind_select_node.rs +++ b/src/planner_v2/binder/query_node/bind_select_node.rs @@ -124,9 +124,18 @@ impl Binder { sqlparser::ast::SelectItem::UnnamedExpr(expr) => { expr_binder.bind_expression(expr, result_names, result_types) } - sqlparser::ast::SelectItem::ExprWithAlias { .. } => todo!(), - sqlparser::ast::SelectItem::Wildcard(_) => todo!(), - sqlparser::ast::SelectItem::QualifiedWildcard(_, _) => todo!(), + sqlparser::ast::SelectItem::ExprWithAlias { expr, alias } => { + let mut expr = expr_binder.bind_expression(expr, result_names, result_types)?; + expr.set_alias(alias.to_string()); + if let Some(last_name) = result_names.last_mut() { + *last_name = alias.to_string(); + } + Ok(expr) + } + sqlparser::ast::SelectItem::Wildcard(..) + | sqlparser::ast::SelectItem::QualifiedWildcard(..) => Err(BindError::Internal( + "wildcard should expand before bind select item".to_string(), + )), } } } diff --git a/tests/slt/select.slt b/tests/slt/select.slt index 0967db3..e7e0c55 100644 --- a/tests/slt/select.slt +++ b/tests/slt/select.slt @@ -28,3 +28,12 @@ select *, t1.* from t1; ---- 1 4 0 1 4 0 2 5 1 2 5 1 + + +# TODO: use alias function to verify output column names +onlyif sqlrs_v2 +query III +select t.v1 as a, v2 as b from t1 as t; +---- +1 4 +2 5