You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datafusion.apache.org by lu...@apache.org on 2026/09/22 06:55:24 UTC
(datafusion-sqlparser-rs) 01/01: Fix TABLE command identifier quoting and token consumption
This is an automated email from the ASF dual-hosted git repository.
LucaCappelletti94 pushed a commit to branch fix-table-command-parsing
in repository https://gitbox.apache.org/repos/asf/datafusion-sqlparser-rs.git
commit 24a1ea3cc5e124eb03455cf0193400833fd9b432
Author: LucaCappelletti94 <ca...@gmail.com>
AuthorDate: Tue Sep 22 08:50:46 2026 +0200
Fix TABLE command identifier quoting and token consumption
---
src/parser/mod.rs | 42 +++++++-----------------------------------
tests/sqlparser_common.rs | 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 35 deletions(-)
diff --git a/src/parser/mod.rs b/src/parser/mod.rs
index 15f135ff..5a78b60e 100644
--- a/src/parser/mod.rs
+++ b/src/parser/mod.rs
@@ -15623,46 +15623,18 @@ impl<'a> Parser<'a> {
Ok(clauses)
}
- /// Parse `CREATE TABLE x AS TABLE y`
+ /// Parse `CREATE TABLE x AS TABLE y` or `TABLE y`
pub fn parse_as_table(&mut self) -> Result<Table, ParserError> {
- let token1 = self.next_token();
- let token2 = self.next_token();
- let token3 = self.next_token();
-
- let table_name;
- let schema_name;
- if token2 == Token::Period {
- match token1.token {
- Token::Word(w) => {
- schema_name = w.value;
- }
- _ => {
- return self.expected("Schema name", token1);
- }
- }
- match token3.token {
- Token::Word(w) => {
- table_name = w.value;
- }
- _ => {
- return self.expected("Table name", token3);
- }
- }
+ let first_name = self.parse_identifier()?.to_string();
+ if self.consume_token(&Token::Period) {
+ let second_name = self.parse_identifier()?.to_string();
Ok(Table {
- table_name: Some(table_name),
- schema_name: Some(schema_name),
+ table_name: Some(second_name),
+ schema_name: Some(first_name),
})
} else {
- match token1.token {
- Token::Word(w) => {
- table_name = w.value;
- }
- _ => {
- return self.expected("Table name", token1);
- }
- }
Ok(Table {
- table_name: Some(table_name),
+ table_name: Some(first_name),
schema_name: None,
})
}
diff --git a/tests/sqlparser_common.rs b/tests/sqlparser_common.rs
index c4aa607d..4f7bc2e3 100644
--- a/tests/sqlparser_common.rs
+++ b/tests/sqlparser_common.rs
@@ -20080,3 +20080,44 @@ fn parse_unary_minus_never_renders_line_comment() {
all_dialects().verified_stmt("SELECT -1");
all_dialects().verified_stmt("SELECT -x");
}
+
+#[test]
+fn parse_table_preserves_quotes_and_trailing_tokens() {
+ let dialects = TestedDialects::new(vec![
+ Box::new(AnsiDialect {}),
+ Box::new(GenericDialect {}),
+ Box::new(PostgreSqlDialect {}),
+ Box::new(DuckDbDialect {}),
+ Box::new(SnowflakeDialect {}),
+ ]);
+ dialects.verified_stmt("CREATE TABLE new_table AS TABLE \"old_table\"");
+ dialects.verified_stmt("CREATE TABLE new_table AS TABLE \"schema_name\".\"old_table\"");
+ dialects.verified_stmt("CREATE TABLE new_table AS TABLE old_table ORDER BY x");
+ dialects.verified_stmt("CREATE TABLE new_table AS TABLE old_table LIMIT 10");
+ dialects.verified_stmt("SELECT * FROM (TABLE old_table ORDER BY x)");
+
+ let backtick_dialects = TestedDialects::new(vec![
+ Box::new(AnsiDialect {}),
+ Box::new(GenericDialect {}),
+ Box::new(MySqlDialect {}),
+ ]);
+ backtick_dialects.verified_stmt("CREATE TABLE new_table AS TABLE `old_table`");
+ backtick_dialects.verified_stmt("CREATE TABLE new_table AS TABLE `%mpty`");
+ backtick_dialects.verified_stmt("INSERT INTO t TABLE `%mpty`");
+
+ let err = dialects
+ .parse_sql_statements("CREATE TABLE new_table AS TABLE %mpty")
+ .unwrap_err();
+ assert_eq!(
+ ParserError::ParserError("Expected: identifier, found: %".to_string()),
+ err
+ );
+
+ let err = backtick_dialects
+ .parse_sql_statements("CREATE TABLE new_table AS TABLE `x` ORE")
+ .unwrap_err();
+ assert_eq!(
+ ParserError::ParserError("Expected: end of statement, found: ORE".to_string()),
+ err
+ );
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datafusion.apache.org
For additional commands, e-mail: commits-help@datafusion.apache.org