You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ag...@apache.org on 2020/08/16 19:03:29 UTC

[arrow] branch master updated: ARROW-9673: [Rust] [DataFusion] Add a param "dialect" for DFParser::parse_sql

This is an automated email from the ASF dual-hosted git repository.

agrove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/master by this push:
     new a94f2b3  ARROW-9673: [Rust] [DataFusion] Add a param "dialect" for DFParser::parse_sql
a94f2b3 is described below

commit a94f2b371bfb5d5cc2ae6799010670baf9fff6b3
Author: wqc200 <wq...@gmail.com>
AuthorDate: Sun Aug 16 13:02:53 2020 -0600

    ARROW-9673: [Rust] [DataFusion] Add a param "dialect" for DFParser::parse_sql
    
    i use func 'DFParser::parse_sql' in outsie app with mysql dialect, but parser_sql use generic dialect default, we need to add a parameter so that we can pass in the dialect.
    
    thanks.
    
    Closes #7916 from wqc200/master_sqlparser_dielect
    
    Authored-by: wqc200 <wq...@gmail.com>
    Signed-off-by: Andy Grove <an...@gmail.com>
---
 rust/datafusion/src/sql/parser.rs | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/rust/datafusion/src/sql/parser.rs b/rust/datafusion/src/sql/parser.rs
index c73ea81..08c7b8c 100644
--- a/rust/datafusion/src/sql/parser.rs
+++ b/rust/datafusion/src/sql/parser.rs
@@ -21,7 +21,7 @@
 
 use sqlparser::{
     ast::{ColumnDef, Statement as SQLStatement, TableConstraint},
-    dialect::{keywords::Keyword, GenericDialect},
+    dialect::{keywords::Keyword, Dialect, GenericDialect},
     parser::{Parser, ParserError},
     tokenizer::{Token, Tokenizer},
 };
@@ -89,19 +89,34 @@ pub struct DFParser {
 impl DFParser {
     /// Parse the specified tokens
     pub fn new(sql: &str) -> Result<Self, ParserError> {
-        let dialect = GenericDialect {};
-        let mut tokenizer = Tokenizer::new(&dialect, sql);
+        let dialect = &GenericDialect {};
+        DFParser::new_with_dialect(sql, dialect)
+    }
+
+    /// Parse the specified tokens with dialect
+    pub fn new_with_dialect(
+        sql: &str,
+        dialect: &dyn Dialect,
+    ) -> Result<Self, ParserError> {
+        let mut tokenizer = Tokenizer::new(dialect, sql);
         let tokens = tokenizer.tokenize()?;
         Ok(DFParser {
             parser: Parser::new(tokens),
         })
     }
 
-    /// Parse a SQL statement and produce a set of statements
+    /// Parse a SQL statement and produce a set of statements with dialect
     pub fn parse_sql(sql: &str) -> Result<Vec<Statement>, ParserError> {
-        let mut tokenizer = Tokenizer::new(&GenericDialect {}, &sql);
-        tokenizer.tokenize()?;
-        let mut parser = DFParser::new(sql)?;
+        let dialect = &GenericDialect {};
+        DFParser::parse_sql_with_dialect(sql, dialect)
+    }
+
+    /// Parse a SQL statement and produce a set of statements
+    pub fn parse_sql_with_dialect(
+        sql: &str,
+        dialect: &dyn Dialect,
+    ) -> Result<Vec<Statement>, ParserError> {
+        let mut parser = DFParser::new_with_dialect(sql, dialect)?;
         let mut stmts = Vec::new();
         let mut expecting_statement_delimiter = false;
         loop {