This is an automated email from the ASF dual-hosted git repository.
alamb pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-datafusion.git
The following commit(s) were added to refs/heads/main by this push:
new 2651437226 feat: Support `EscapedStringLiteral`, update sqlparser to
`0.44.0` (#9268)
2651437226 is described below
commit 2651437226b7f1890a714e6c8ef1318ad5b7b6b2
Author: JasonLi <[email protected]>
AuthorDate: Tue Mar 5 06:20:11 2024 +0800
feat: Support `EscapedStringLiteral`, update sqlparser to `0.44.0` (#9268)
* feat: upgrade sqlparser from 0.43.0 to 0.44.0
* chore: update Cargo.lock
---
Cargo.toml | 2 +-
datafusion-cli/Cargo.lock | 42 ++++++++++++++++-----------------
datafusion/sql/src/expr/function.rs | 2 ++
datafusion/sql/src/expr/value.rs | 1 +
datafusion/sql/src/statement.rs | 18 +++++++++-----
datafusion/sql/tests/sql_integration.rs | 25 ++++++++++++++++++++
6 files changed, 62 insertions(+), 28 deletions(-)
diff --git a/Cargo.toml b/Cargo.toml
index ec8e6621c2..b8e9a22743 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -99,7 +99,7 @@ parquet = { version = "50.0.0", default-features = false,
features = ["arrow", "
rand = "0.8"
rstest = "0.18.0"
serde_json = "1"
-sqlparser = { version = "0.43.0", features = ["visitor"] }
+sqlparser = { version = "0.44.0", features = ["visitor"] }
tempfile = "3"
thiserror = "1.0.44"
tokio = { version = "1.36", features = ["macros", "rt", "sync"] }
diff --git a/datafusion-cli/Cargo.lock b/datafusion-cli/Cargo.lock
index 26805b709b..46484be0e1 100644
--- a/datafusion-cli/Cargo.lock
+++ b/datafusion-cli/Cargo.lock
@@ -25,9 +25,9 @@ checksum =
"aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234"
[[package]]
name = "ahash"
-version = "0.8.10"
+version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b79b82693f705137f8fb9b37871d99e4f9a7df12b917eed79c3d3954830a60b"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
dependencies = [
"cfg-if",
"const-random",
@@ -270,7 +270,7 @@ dependencies = [
"arrow-schema",
"chrono",
"half",
- "indexmap 2.2.4",
+ "indexmap 2.2.5",
"lexical-core",
"num",
"serde",
@@ -962,9 +962,9 @@ dependencies = [
[[package]]
name = "const-random"
-version = "0.1.17"
+version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5aaf16c9c2c612020bcfd042e170f6e32de9b9d75adb5277cdbbd2e2c8c8299a"
+checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359"
dependencies = [
"const-random-macro",
]
@@ -1126,7 +1126,7 @@ dependencies = [
"glob",
"half",
"hashbrown 0.14.3",
- "indexmap 2.2.4",
+ "indexmap 2.2.5",
"itertools",
"log",
"num-traits",
@@ -1299,7 +1299,7 @@ dependencies = [
"half",
"hashbrown 0.14.3",
"hex",
- "indexmap 2.2.4",
+ "indexmap 2.2.5",
"itertools",
"log",
"md-5",
@@ -1331,7 +1331,7 @@ dependencies = [
"futures",
"half",
"hashbrown 0.14.3",
- "indexmap 2.2.4",
+ "indexmap 2.2.5",
"itertools",
"log",
"once_cell",
@@ -1703,7 +1703,7 @@ dependencies = [
"futures-sink",
"futures-util",
"http",
- "indexmap 2.2.4",
+ "indexmap 2.2.5",
"slab",
"tokio",
"tokio-util",
@@ -1920,9 +1920,9 @@ dependencies = [
[[package]]
name = "indexmap"
-version = "2.2.4"
+version = "2.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "967d6dd42f16dbf0eb8040cb9e477933562684d3918f7d253f2ff9087fb3e7a3"
+checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4"
dependencies = [
"equivalent",
"hashbrown 0.14.3",
@@ -2187,9 +2187,9 @@ dependencies = [
[[package]]
name = "mio"
-version = "0.8.10"
+version = "0.8.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
+checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
dependencies = [
"libc",
"wasi",
@@ -2343,7 +2343,7 @@ dependencies = [
"rand",
"reqwest",
"ring 0.17.8",
- "rustls-pemfile 2.1.0",
+ "rustls-pemfile 2.1.1",
"serde",
"serde_json",
"snafu",
@@ -2472,7 +2472,7 @@ source =
"registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
dependencies = [
"fixedbitset",
- "indexmap 2.2.4",
+ "indexmap 2.2.5",
]
[[package]]
@@ -2926,9 +2926,9 @@ dependencies = [
[[package]]
name = "rustls-pemfile"
-version = "2.1.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c333bb734fcdedcea57de1602543590f545f127dc8b533324318fd492c5c70b"
+checksum = "f48172685e6ff52a556baa527774f61fcaa884f59daf3375c62a3f1cd2549dab"
dependencies = [
"base64",
"rustls-pki-types",
@@ -3190,9 +3190,9 @@ checksum =
"6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
[[package]]
name = "sqlparser"
-version = "0.43.1"
+version = "0.44.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f95c4bae5aba7cd30bd506f7140026ade63cff5afd778af8854026f9606bf5d4"
+checksum = "aaf9c7ff146298ffda83a200f8d5084f08dcee1edfc135fcc1d646a45d50ffd6"
dependencies = [
"log",
"sqlparser_derive",
@@ -3720,9 +3720,9 @@ dependencies = [
[[package]]
name = "walkdir"
-version = "2.4.0"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
dependencies = [
"same-file",
"winapi-util",
diff --git a/datafusion/sql/src/expr/function.rs
b/datafusion/sql/src/expr/function.rs
index bb73e69ba9..ad1d2db70c 100644
--- a/datafusion/sql/src/expr/function.rs
+++ b/datafusion/sql/src/expr/function.rs
@@ -258,10 +258,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
FunctionArg::Named {
name: _,
arg: FunctionArgExpr::Expr(arg),
+ operator: _,
} => self.sql_expr_to_logical_expr(arg, schema, planner_context),
FunctionArg::Named {
name: _,
arg: FunctionArgExpr::Wildcard,
+ operator: _,
} => Ok(Expr::Wildcard { qualifier: None }),
FunctionArg::Unnamed(FunctionArgExpr::Expr(arg)) => {
self.sql_expr_to_logical_expr(arg, schema, planner_context)
diff --git a/datafusion/sql/src/expr/value.rs b/datafusion/sql/src/expr/value.rs
index c0870cc541..15524b9ffa 100644
--- a/datafusion/sql/src/expr/value.rs
+++ b/datafusion/sql/src/expr/value.rs
@@ -52,6 +52,7 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
plan_err!("Invalid HexStringLiteral '{s}'")
}
}
+ Value::EscapedStringLiteral(s) => Ok(lit(s)),
_ => plan_err!("Unsupported Value '{value:?}'"),
}
}
diff --git a/datafusion/sql/src/statement.rs b/datafusion/sql/src/statement.rs
index bf15146a92..dfac8367e9 100644
--- a/datafusion/sql/src/statement.rs
+++ b/datafusion/sql/src/statement.rs
@@ -52,10 +52,10 @@ use datafusion_expr::{
};
use sqlparser::ast;
use sqlparser::ast::{
- Assignment, ColumnDef, CreateTableOptions, Expr as SQLExpr, Expr, Ident,
ObjectName,
- ObjectType, Query, SchemaName, SetExpr, ShowCreateObject,
ShowStatementFilter,
- Statement, TableConstraint, TableFactor, TableWithJoins, TransactionMode,
- UnaryOperator, Value,
+ Assignment, ColumnDef, CreateTableOptions, DescribeAlias, Expr as SQLExpr,
Expr,
+ FromTable, Ident, ObjectName, ObjectType, Query, SchemaName, SetExpr,
+ ShowCreateObject, ShowStatementFilter, Statement, TableConstraint,
TableFactor,
+ TableWithJoins, TransactionMode, UnaryOperator, Value,
};
use sqlparser::parser::ParserError::ParserError;
@@ -177,7 +177,8 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
let sql = Some(statement.to_string());
match statement {
Statement::ExplainTable {
- describe_alias: true, // only parse 'DESCRIBE table_name' and
not 'EXPLAIN table_name'
+ describe_alias: DescribeAlias::Describe, // only parse
'DESCRIBE table_name' and not 'EXPLAIN table_name'
+ hive_format: _,
table_name,
} => self.describe_table_to_plan(table_name),
Statement::Explain {
@@ -630,7 +631,12 @@ impl<'a, S: ContextProvider> SqlToRel<'a, S> {
}
}
- fn get_delete_target(&self, mut from: Vec<TableWithJoins>) ->
Result<ObjectName> {
+ fn get_delete_target(&self, from: FromTable) -> Result<ObjectName> {
+ let mut from = match from {
+ FromTable::WithFromKeyword(v) => v,
+ FromTable::WithoutKeyword(v) => v,
+ };
+
if from.len() != 1 {
return not_impl_err!(
"DELETE FROM only supports single table, got {}: {from:?}",
diff --git a/datafusion/sql/tests/sql_integration.rs
b/datafusion/sql/tests/sql_integration.rs
index 9d7b209d77..db1beb9444 100644
--- a/datafusion/sql/tests/sql_integration.rs
+++ b/datafusion/sql/tests/sql_integration.rs
@@ -4423,6 +4423,31 @@ fn test_field_not_found_window_function() {
quick_test(qualified_sql, expected);
}
+#[test]
+fn test_parse_escaped_string_literal_value() {
+ let sql = r"SELECT length('\r\n') AS len";
+ let expected = "Projection: character_length(Utf8(\"\\r\\n\")) AS len\
+ \n EmptyRelation";
+ quick_test(sql, expected);
+
+ let sql = r"SELECT length(E'\r\n') AS len";
+ let expected = "Projection: character_length(Utf8(\"\r\n\")) AS len\
+ \n EmptyRelation";
+ quick_test(sql, expected);
+
+ let sql = r"SELECT length(E'\445') AS len, E'\x4B' AS hex, E'\u0001' AS
unicode";
+ let expected =
+ "Projection: character_length(Utf8(\"%\")) AS len, Utf8(\"\u{004b}\")
AS hex, Utf8(\"\u{0001}\") AS unicode\
+ \n EmptyRelation";
+ quick_test(sql, expected);
+
+ let sql = r"SELECT length(E'\000') AS len";
+ assert_eq!(
+ logical_plan(sql).unwrap_err().strip_backtrace(),
+ "SQL error: TokenizerError(\"Unterminated encoded string literal at
Line: 1, Column 15\")"
+ )
+}
+
fn assert_field_not_found(err: DataFusionError, name: &str) {
match err {
DataFusionError::SchemaError { .. } => {