Skip to content

Commit 215cd2f

Browse files
committed
fix: Fix parse_sql_expr not handling alias
1 parent 36affd4 commit 215cd2f

File tree

3 files changed

+23
-5
lines changed

3 files changed

+23
-5
lines changed

datafusion/core/src/dataframe/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3998,13 +3998,16 @@ mod tests {
39983998
Ok(())
39993999
}
40004000
#[tokio::test]
4001-
async fn dev_test() -> Result<()> {
4001+
async fn parse_sql_expr_handle_alias() -> Result<()> {
40024002
let ctx = SessionContext::new();
40034003
let df = ctx
40044004
.read_csv("tests/data/example.csv", CsvReadOptions::new())
40054005
.await?;
40064006
let sql = df.parse_sql_expr("SUM(a) as a_sum")?;
4007-
println!("{:?}", sql.to_string());
4007+
assert_eq!(
4008+
"sum(a) as a_sum".to_string(),
4009+
sql.to_string().to_lowercase()
4010+
);
40084011
Ok(())
40094012
}
40104013
}

datafusion/core/src/execution/session_state.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ use datafusion_sql::planner::{ContextProvider, ParserOptions, PlannerContext, Sq
6969
use itertools::Itertools;
7070
use log::{debug, info};
7171
use object_store::ObjectStore;
72-
use sqlparser::ast::ExprWithAlias as SQLExprWithAlias;
72+
use sqlparser::ast::{Expr as SQLExpr, ExprWithAlias as SQLExprWithAlias};
7373
use sqlparser::dialect::dialect_from_str;
7474
use std::any::Any;
7575
use std::collections::hash_map::Entry;
@@ -483,11 +483,25 @@ impl SessionState {
483483

484484
/// parse a sql string into a sqlparser-rs AST [`SQLExpr`].
485485
///
486+
/// discard the alias information.
487+
///
486488
/// See [`Self::create_logical_expr`] for parsing sql to [`Expr`].
487489
pub fn sql_to_expr(
488490
&self,
489491
sql: &str,
490492
dialect: &str,
493+
) -> datafusion_common::Result<SQLExpr> {
494+
self.sql_to_expr_with_alias(sql, dialect)
495+
.map(|expr| expr.expr)
496+
}
497+
498+
/// parse a sql string into a sqlparser-rs AST [`SQLExprWithAlias`].
499+
///
500+
/// keep the alias information if there is any.
501+
pub fn sql_to_expr_with_alias(
502+
&self,
503+
sql: &str,
504+
dialect: &str,
491505
) -> datafusion_common::Result<SQLExprWithAlias> {
492506
let dialect = dialect_from_str(dialect).ok_or_else(|| {
493507
plan_datafusion_err!(
@@ -591,7 +605,7 @@ impl SessionState {
591605
) -> datafusion_common::Result<Expr> {
592606
let dialect = self.config.options().sql_parser.dialect.as_str();
593607

594-
let sql_expr = self.sql_to_expr(sql, dialect)?;
608+
let sql_expr = self.sql_to_expr_with_alias(sql, dialect)?;
595609

596610
let provider = SessionContextProvider {
597611
state: self,
@@ -1872,7 +1886,7 @@ mod tests {
18721886
let schema = Schema::new(vec![Field::new("a", DataType::Int32, true)]);
18731887
let df_schema = DFSchema::try_from(schema)?;
18741888
let dialect = state.config.options().sql_parser.dialect.as_str();
1875-
let sql_expr = state.sql_to_expr(sql, dialect)?.expr;
1889+
let sql_expr = state.sql_to_expr(sql, dialect)?;
18761890

18771891
let query = SqlToRel::new_with_options(&provider, state.get_parser_options());
18781892
query.sql_to_expr(sql_expr, &df_schema, &mut PlannerContext::new())

datafusion/sql/src/parser.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ impl<'a> DFParser<'a> {
376376
}
377377
}
378378

379+
/// parse an expression with alias
379380
pub fn parse_expr(&mut self) -> Result<ExprWithAlias, ParserError> {
380381
if let Token::Word(w) = self.parser.peek_token().token {
381382
match w.keyword {

0 commit comments

Comments
 (0)