From b85715dd9bececdce8d05067c5ef04708cdb45fb Mon Sep 17 00:00:00 2001 From: step-baby <3528004749@qq.com> Date: Tue, 22 Nov 2022 11:28:12 +0800 Subject: [PATCH 1/2] fix: Supports updating valid column names whose names are the same as keywords --- src/parser.rs | 48 ++++++++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index f91223c2f..7cb3df59a 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -3886,41 +3886,19 @@ impl<'a> Parser<'a> { Ok(ObjectName(idents)) } - /// Parse identifiers strictly i.e. don't parse keywords - pub fn parse_identifiers_non_keywords(&mut self) -> Result, ParserError> { + /// Parse identifiers + pub fn parse_identifiers(&mut self) -> Result, ParserError> { let mut idents = vec![]; loop { match self.peek_token() { Token::Word(w) => { - if w.keyword != Keyword::NoKeyword { - break; - } - idents.push(w.to_ident()); } Token::EOF | Token::Eq => break, _ => {} } - self.next_token(); } - - Ok(idents) - } - - /// Parse identifiers - pub fn parse_identifiers(&mut self) -> Result, ParserError> { - let mut idents = vec![]; - loop { - match self.next_token() { - Token::Word(w) => { - idents.push(w.to_ident()); - } - Token::EOF => break, - _ => {} - } - } - Ok(idents) } @@ -5282,7 +5260,7 @@ impl<'a> Parser<'a> { /// Parse a `var = expr` assignment, used in an UPDATE statement pub fn parse_assignment(&mut self) -> Result { - let id = self.parse_identifiers_non_keywords()?; + let id = self.parse_identifiers()?; self.expect_token(&Token::Eq)?; let value = self.parse_expr()?; Ok(Assignment { id, value }) @@ -6295,4 +6273,22 @@ mod tests { } ); } -} + + #[test] + fn test_update_has_keyword() { + let sql = r#"UPDATE test SET name=$1, + value=$2, + where=$3, + create=$4, + is_default=$5, + classification=$6, + sort=$7 + WHERE id=$8"#; + let mut pg_dialect = PostgreSqlDialect {}; + let ast = Parser::parse_sql(&mut pg_dialect, sql).unwrap(); + assert_eq!( + ast[0].to_string(), + r#"UPDATE test SET name = $1, value = $2, where = $3, create = $4, is_default = $5, classification = $6, sort = $7 WHERE id = $8"# + ); + } +} \ No newline at end of file From c0916d2216aff64d34a9ef81ab1904d3d062ab42 Mon Sep 17 00:00:00 2001 From: step-baby <3528004749@qq.com> Date: Tue, 22 Nov 2022 16:11:20 +0800 Subject: [PATCH 2/2] fix: warning --- src/parser.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 7cb3df59a..e2e67c17b 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -6284,11 +6284,11 @@ mod tests { classification=$6, sort=$7 WHERE id=$8"#; - let mut pg_dialect = PostgreSqlDialect {}; - let ast = Parser::parse_sql(&mut pg_dialect, sql).unwrap(); + let pg_dialect = PostgreSqlDialect {}; + let ast = Parser::parse_sql(&pg_dialect, sql).unwrap(); assert_eq!( ast[0].to_string(), r#"UPDATE test SET name = $1, value = $2, where = $3, create = $4, is_default = $5, classification = $6, sort = $7 WHERE id = $8"# ); } -} \ No newline at end of file +}