iffyio commented on code in PR #1628:
URL: 
https://github.com/apache/datafusion-sqlparser-rs/pull/1628#discussion_r1910640466


##########
src/parser/mod.rs:
##########
@@ -12012,10 +12033,26 @@ impl<'a> Parser<'a> {
                 replace_into,
                 priority,
                 insert_alias,
+                settings,
+                format_clause,
             }))
         }
     }
 
+    // Parses format clause used for [ClickHouse]. Formats are different when 
using `SELECT` and
+    // `INSERT` and also when using the CLI for pipes. For `INSERT` it can 
take an optional values
+    // list which we try to parse here.

Review Comment:
   Probably no need to mention the SELECT since that's now unrelated to this 
one? Regarding insert and optional values, that detail I imagine is clear from 
the doc/type



##########
src/parser/mod.rs:
##########
@@ -12012,10 +12033,26 @@ impl<'a> Parser<'a> {
                 replace_into,
                 priority,
                 insert_alias,
+                settings,
+                format_clause,
             }))
         }
     }
 
+    // Parses format clause used for [ClickHouse]. Formats are different when 
using `SELECT` and
+    // `INSERT` and also when using the CLI for pipes. For `INSERT` it can 
take an optional values
+    // list which we try to parse here.
+    //
+    // <https://clickhouse.com/docs/en/interfaces/formats>
+    pub fn parse_input_format_clause(&mut self) -> Result<InputFormatClause, 
ParserError> {
+        let ident = self.parse_identifier()?;
+        let values = self
+            .try_parse(|p| p.parse_comma_separated(|p| p.parse_expr()))

Review Comment:
   I think this can use maybe_parse instead? to properly account for unexpected 
error



##########
src/parser/mod.rs:
##########
@@ -11899,35 +11899,56 @@ impl<'a> Parser<'a> {
 
             let is_mysql = dialect_of!(self is MySqlDialect);
 
-            let (columns, partitioned, after_columns, source, assignments) =
-                if self.parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES]) {
-                    (vec![], None, vec![], None, vec![])
-                } else {
-                    let (columns, partitioned, after_columns) = if 
!self.peek_subquery_start() {
-                        let columns = 
self.parse_parenthesized_column_list(Optional, is_mysql)?;
+            let (columns, partitioned, after_columns, source, assignments) = 
if self
+                .parse_keywords(&[Keyword::DEFAULT, Keyword::VALUES])
+            {
+                (vec![], None, vec![], None, vec![])
+            } else {
+                let (columns, partitioned, after_columns) = if 
!self.peek_subquery_start() {
+                    let columns = 
self.parse_parenthesized_column_list(Optional, is_mysql)?;
 
-                        let partitioned = self.parse_insert_partition()?;
-                        // Hive allows you to specify columns after partitions 
as well if you want.
-                        let after_columns = if dialect_of!(self is 
HiveDialect) {
-                            self.parse_parenthesized_column_list(Optional, 
false)?
-                        } else {
-                            vec![]
-                        };
-                        (columns, partitioned, after_columns)
+                    let partitioned = self.parse_insert_partition()?;
+                    // Hive allows you to specify columns after partitions as 
well if you want.
+                    let after_columns = if dialect_of!(self is HiveDialect) {
+                        self.parse_parenthesized_column_list(Optional, false)?
                     } else {
-                        Default::default()
+                        vec![]
                     };
+                    (columns, partitioned, after_columns)
+                } else {
+                    Default::default()
+                };
 
-                    let (source, assignments) =
-                        if self.dialect.supports_insert_set() && 
self.parse_keyword(Keyword::SET) {
-                            (None, 
self.parse_comma_separated(Parser::parse_assignment)?)
-                        } else {
-                            (Some(self.parse_query()?), vec![])
-                        };
+                let (source, assignments) = if 
self.peek_keyword(Keyword::FORMAT)
+                    || self.peek_keyword(Keyword::SETTINGS)
+                {
+                    (None, vec![])
+                } else if self.dialect.supports_insert_set() && 
self.parse_keyword(Keyword::SET) {
+                    (None, 
self.parse_comma_separated(Parser::parse_assignment)?)
+                } else {
+                    (Some(self.parse_query()?), vec![])
+                };
+
+                (columns, partitioned, after_columns, source, assignments)
+            };
 
-                    (columns, partitioned, after_columns, source, assignments)
+            let (format_clause, settings) = if dialect_of!(self is 
ClickHouseDialect | GenericDialect)

Review Comment:
   Can we use a dialect method for the feature gating? thinking we can do 
something like
   ```rust
   let (format_clause, settings) = if self.dialect.supports_insert_format() {
     //...
   } else {
     Default::default()
   }
   ```
   Then we can probably only enable it for clickhouse if there's a risk that 
the syntax could conflict with what generic dialect currently supports



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: github-unsubscr...@datafusion.apache.org
For additional commands, e-mail: github-h...@datafusion.apache.org

Reply via email to