Skip to content

Commit 36affd4

Browse files
committed
Add some example to showcase interface change.
1 parent b00723a commit 36affd4

File tree

6 files changed

+52
-12
lines changed

6 files changed

+52
-12
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ rand = "0.8"
139139
regex = "1.8"
140140
rstest = "0.22.0"
141141
serde_json = "1"
142-
sqlparser = { version = "0.51.0", features = ["visitor"] }
142+
sqlparser = { git = "https://github.com/Eason0729/sqlparser-rs.git", features = ["visitor"] }
143143
tempfile = "3"
144144
thiserror = "1.0.44"
145145
tokio = { version = "1.36", features = ["macros", "rt", "sync"] }

datafusion/core/src/dataframe/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1941,6 +1941,7 @@ mod tests {
19411941
use crate::physical_plan::{ColumnarValue, Partitioning, PhysicalExpr};
19421942
use crate::test_util::{register_aggregate_csv, test_table, test_table_with_name};
19431943

1944+
use crate::prelude::CsvReadOptions;
19441945
use arrow::array::{self, Int32Array};
19451946
use datafusion_common::{assert_batches_eq, Constraint, Constraints, ScalarValue};
19461947
use datafusion_common_runtime::SpawnedTask;
@@ -3996,4 +3997,14 @@ mod tests {
39963997

39973998
Ok(())
39983999
}
4000+
#[tokio::test]
4001+
async fn dev_test() -> Result<()> {
4002+
let ctx = SessionContext::new();
4003+
let df = ctx
4004+
.read_csv("tests/data/example.csv", CsvReadOptions::new())
4005+
.await?;
4006+
let sql = df.parse_sql_expr("SUM(a) as a_sum")?;
4007+
println!("{:?}", sql.to_string());
4008+
Ok(())
4009+
}
39994010
}

datafusion/core/src/execution/session_state.rs

Lines changed: 4 additions & 4 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::Expr as SQLExpr;
72+
use sqlparser::ast::ExprWithAlias as SQLExprWithAlias;
7373
use sqlparser::dialect::dialect_from_str;
7474
use std::any::Any;
7575
use std::collections::hash_map::Entry;
@@ -488,7 +488,7 @@ impl SessionState {
488488
&self,
489489
sql: &str,
490490
dialect: &str,
491-
) -> datafusion_common::Result<SQLExpr> {
491+
) -> datafusion_common::Result<SQLExprWithAlias> {
492492
let dialect = dialect_from_str(dialect).ok_or_else(|| {
493493
plan_datafusion_err!(
494494
"Unsupported SQL dialect: {dialect}. Available dialects: \
@@ -599,7 +599,7 @@ impl SessionState {
599599
};
600600

601601
let query = SqlToRel::new_with_options(&provider, self.get_parser_options());
602-
query.sql_to_expr(sql_expr, df_schema, &mut PlannerContext::new())
602+
query.sql_to_expr_with_alias(sql_expr, df_schema, &mut PlannerContext::new())
603603
}
604604

605605
/// Returns the [`Analyzer`] for this session
@@ -1872,7 +1872,7 @@ mod tests {
18721872
let schema = Schema::new(vec![Field::new("a", DataType::Int32, true)]);
18731873
let df_schema = DFSchema::try_from(schema)?;
18741874
let dialect = state.config.options().sql_parser.dialect.as_str();
1875-
let sql_expr = state.sql_to_expr(sql, dialect)?;
1875+
let sql_expr = state.sql_to_expr(sql, dialect)?.expr;
18761876

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

datafusion/sql/src/expr/mod.rs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ use datafusion_expr::planner::{
2222
};
2323
use sqlparser::ast::{
2424
BinaryOperator, CastFormat, CastKind, DataType as SQLDataType, DictionaryField,
25-
Expr as SQLExpr, MapEntry, StructField, Subscript, TrimWhereField, Value,
25+
Expr as SQLExpr, ExprWithAlias as SQLExprWithAlias, MapEntry, StructField, Subscript,
26+
TrimWhereField, Value,
2627
};
2728

2829
use datafusion_common::{
2930
internal_datafusion_err, internal_err, not_impl_err, plan_err, DFSchema, Result,
3031
ScalarValue,
3132
};
32-
use datafusion_expr::expr::ScalarFunction;
33-
use datafusion_expr::expr::{InList, WildcardOptions};
33+
use datafusion_expr::expr::{InList, ScalarFunction, WildcardOptions};
3434
use datafusion_expr::{
3535
lit, Between, BinaryExpr, Cast, Expr, ExprSchemable, GetFieldAccess, Like, Literal,
3636
Operator, TryCast,
@@ -49,6 +49,19 @@ mod unary_op;
4949
mod value;
5050

5151
impl<'a, S: ContextProvider> SqlToRel<'a, S> {
52+
pub(crate) fn sql_expr_to_logical_expr_with_alias(
53+
&self,
54+
sql: SQLExprWithAlias,
55+
schema: &DFSchema,
56+
planner_context: &mut PlannerContext,
57+
) -> Result<Expr> {
58+
let mut expr =
59+
self.sql_expr_to_logical_expr(sql.expr, schema, planner_context)?;
60+
if let Some(alias) = sql.alias {
61+
expr = expr.alias(alias.value);
62+
}
63+
Ok(expr)
64+
}
5265
pub(crate) fn sql_expr_to_logical_expr(
5366
&self,
5467
sql: SQLExpr,
@@ -130,6 +143,20 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
130143
)))
131144
}
132145

146+
pub fn sql_to_expr_with_alias(
147+
&self,
148+
sql: SQLExprWithAlias,
149+
schema: &DFSchema,
150+
planner_context: &mut PlannerContext,
151+
) -> Result<Expr> {
152+
let mut expr =
153+
self.sql_expr_to_logical_expr_with_alias(sql, schema, planner_context)?;
154+
expr = self.rewrite_partial_qualifier(expr, schema);
155+
self.validate_schema_satisfies_exprs(schema, &[expr.clone()])?;
156+
let expr = expr.infer_placeholder_types(schema)?;
157+
Ok(expr)
158+
}
159+
133160
/// Generate a relational expression from a SQL expression
134161
pub fn sql_to_expr(
135162
&self,

datafusion/sql/src/parser.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@
2020
use std::collections::VecDeque;
2121
use std::fmt;
2222

23+
use sqlparser::ast::ExprWithAlias;
2324
use sqlparser::{
2425
ast::{
25-
ColumnDef, ColumnOptionDef, Expr, ObjectName, OrderByExpr, Query,
26+
ColumnDef, ColumnOptionDef, ObjectName, OrderByExpr, Query,
2627
Statement as SQLStatement, TableConstraint, Value,
2728
},
2829
dialect::{keywords::Keyword, Dialect, GenericDialect},
@@ -326,7 +327,7 @@ impl<'a> DFParser<'a> {
326327
pub fn parse_sql_into_expr_with_dialect(
327328
sql: &str,
328329
dialect: &dyn Dialect,
329-
) -> Result<Expr, ParserError> {
330+
) -> Result<ExprWithAlias, ParserError> {
330331
let mut parser = DFParser::new_with_dialect(sql, dialect)?;
331332
parser.parse_expr()
332333
}
@@ -375,7 +376,7 @@ impl<'a> DFParser<'a> {
375376
}
376377
}
377378

378-
pub fn parse_expr(&mut self) -> Result<Expr, ParserError> {
379+
pub fn parse_expr(&mut self) -> Result<ExprWithAlias, ParserError> {
379380
if let Token::Word(w) = self.parser.peek_token().token {
380381
match w.keyword {
381382
Keyword::CREATE | Keyword::COPY | Keyword::EXPLAIN => {
@@ -385,7 +386,7 @@ impl<'a> DFParser<'a> {
385386
}
386387
}
387388

388-
self.parser.parse_expr()
389+
self.parser.parse_expr_with_alias()
389390
}
390391

391392
/// Parse a SQL `COPY TO` statement

datafusion/sql/src/statement.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ fn calc_inline_constraints_from_columns(columns: &[ColumnDef]) -> Vec<TableConst
152152
| ast::ColumnOption::Materialized(_)
153153
| ast::ColumnOption::Ephemeral(_)
154154
| ast::ColumnOption::Alias(_) => {}
155+
_ => unreachable!("Unexpected column option: {:?}", option),
155156
}
156157
}
157158
}

0 commit comments

Comments
 (0)