You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by al...@apache.org on 2022/11/20 11:55:24 UTC

[arrow-datafusion] branch master updated: Fix bugs in parsing `with header row` and `partitioned by` (#4268)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0bb5d4d9b Fix bugs in parsing `with header row` and `partitioned by` (#4268)
0bb5d4d9b is described below

commit 0bb5d4d9b885b909bbdd27230880c8a94602f295
Author: Remzi Yang <59...@users.noreply.github.com>
AuthorDate: Sun Nov 20 19:55:18 2022 +0800

    Fix bugs in parsing `with header row` and `partitioned by` (#4268)
    
    * fix header and partitioned
    
    Signed-off-by: remzi <13...@gmail.com>
    
    * fix comment bug
    
    Signed-off-by: remzi <13...@gmail.com>
    
    Signed-off-by: remzi <13...@gmail.com>
---
 datafusion/sql/src/parser.rs | 21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/datafusion/sql/src/parser.rs b/datafusion/sql/src/parser.rs
index fe0c24b46..23deafee6 100644
--- a/datafusion/sql/src/parser.rs
+++ b/datafusion/sql/src/parser.rs
@@ -428,15 +428,15 @@ impl<'a> DFParser<'a> {
             false
         }
     }
+
     fn parse_has_file_compression_type(&mut self) -> bool {
         self.consume_token(&Token::make_keyword("COMPRESSION"))
             & self.consume_token(&Token::make_keyword("TYPE"))
     }
 
     fn parse_csv_has_header(&mut self) -> bool {
-        self.consume_token(&Token::make_keyword("WITH"))
-            & self.consume_token(&Token::make_keyword("HEADER"))
-            & self.consume_token(&Token::make_keyword("ROW"))
+        self.parser
+            .parse_keywords(&[Keyword::WITH, Keyword::HEADER, Keyword::ROW])
     }
 
     fn parse_has_delimiter(&mut self) -> bool {
@@ -454,8 +454,8 @@ impl<'a> DFParser<'a> {
     }
 
     fn parse_has_partition(&mut self) -> bool {
-        self.consume_token(&Token::make_keyword("PARTITIONED"))
-            & self.consume_token(&Token::make_keyword("BY"))
+        self.parser
+            .parse_keywords(&[Keyword::PARTITIONED, Keyword::BY])
     }
 }
 
@@ -715,6 +715,17 @@ mod tests {
             "CREATE EXTERNAL TABLE t STORED AS x OPTIONS ('k1' 'v1', k2 v2, k3) LOCATION 'blahblah'";
         expect_parse_error(sql, "sql parser error: Expected literal string, found: )");
 
+        // Error case: `with header` is an invalid syntax
+        let sql = "CREATE EXTERNAL TABLE t STORED AS CSV WITH HEADER LOCATION 'abc'";
+        expect_parse_error(sql, "sql parser error: Expected LOCATION, found: WITH");
+
+        // Error case: `partitioned` is an invalid syntax
+        let sql = "CREATE EXTERNAL TABLE t STORED AS CSV PARTITIONED LOCATION 'abc'";
+        expect_parse_error(
+            sql,
+            "sql parser error: Expected LOCATION, found: PARTITIONED",
+        );
+
         Ok(())
     }
 }