Skip to content

Commit 5384fca

Browse files
Merge pull request #18 from kemingy/v0.54.x
fix cargo fmt Merge branch 'v0.54.x' into v0.54.x Merge pull request #20 from kemingy/calc_overflow fix lint Merge branch 'v0.54.x' into v0.54.x Merge pull request #19 from kemingy/lint add test for statement convertion fix: overflow in the calculation expr fix the test in another pr fix overflow fix: lint and test fix: add recursive protection to Convert
1 parent b1f359a commit 5384fca

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

src/ast/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ where
134134
Self: Into<T>,
135135
{
136136
#[inline(always)]
137+
#[cfg_attr(feature = "recursive-protection", recursive::recursive)]
137138
fn convert(value: Self) -> T {
138139
Self::into(value)
139140
}

src/parser/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1323,8 +1323,7 @@ impl<'a> Parser<'a> {
13231323
})?;
13241324
if rewrite_count == 0 {
13251325
return Err(ParserError::ParserError(format!(
1326-
"Can't use the RANGE keyword in Expr {} without function",
1327-
expr
1326+
"Can't use the RANGE keyword in Expr {expr} without function"
13281327
)));
13291328
}
13301329
Ok(expr)
@@ -16880,6 +16879,7 @@ impl Word {
1688016879
/// * `Ok(Some(replacement_expr))`: A replacement `Expr` is provided, use replacement `Expr`.
1688116880
/// * `Ok(None)`: A replacement `Expr` is not provided, use old `Expr`.
1688216881
/// * `Err(err)`: Any error returned.
16882+
#[cfg_attr(feature = "recursive-protection", recursive::recursive)]
1688316883
fn rewrite_calculation_expr<F>(
1688416884
expr: &Expr,
1688516885
rewrite_func_expr: bool,

tests/sqlparser_common.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16185,9 +16185,7 @@ fn assert_sql_err(input: &str, expected: &str) {
1618516185
let res_str = format!("{:?}", res.unwrap_err());
1618616186
assert!(
1618716187
res_str.contains(expected),
16188-
"`{}` doesn't contains `{}`",
16189-
res_str,
16190-
expected
16188+
"`{res_str}` doesn't contains `{expected}`"
1619116189
);
1619216190
}
1619316191

@@ -16435,3 +16433,16 @@ fn parse_range_range_align_to_calculate() {
1643516433
"Expected: end of statement, found: )",
1643616434
);
1643716435
}
16436+
16437+
#[test]
16438+
fn convert_to_datafusion_statement_overflow() {
16439+
let expr = std::iter::repeat_n("num BETWEEN 0 AND 1", 1000)
16440+
.collect::<Vec<_>>()
16441+
.join(" OR ");
16442+
let sql = format!("SELECT num FROM numbers WHERE {expr}");
16443+
16444+
let mut statements = Parser::parse_sql(&GenericDialect {}, sql.as_str()).unwrap();
16445+
let statement = statements.pop().unwrap();
16446+
let df_statement: df_sqlparser::ast::Statement = statement.into();
16447+
assert_eq!(df_statement.to_string(), sql);
16448+
}

0 commit comments

Comments
 (0)