From 2acecd3620dd0f907a7b3b1b52c01a0ec1d3b594 Mon Sep 17 00:00:00 2001 From: Yingwen Date: Thu, 3 Apr 2025 11:22:43 +0800 Subject: [PATCH] feat: support REPLACE INTO statement (#5820) * feat: support replace into * feat: support replace into --- src/sql/src/parser.rs | 2 ++ src/sql/src/parsers/insert_parser.rs | 20 ++++++++++++++++++- .../standalone/common/insert/insert.result | 6 ++++++ .../cases/standalone/common/insert/insert.sql | 2 ++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/sql/src/parser.rs b/src/sql/src/parser.rs index 087e5a915c..50d68897e3 100644 --- a/src/sql/src/parser.rs +++ b/src/sql/src/parser.rs @@ -147,6 +147,8 @@ impl ParserContext<'_> { Keyword::INSERT => self.parse_insert(), + Keyword::REPLACE => self.parse_replace(), + Keyword::SELECT | Keyword::WITH | Keyword::VALUES => self.parse_query(), Keyword::ALTER => self.parse_alter(), diff --git a/src/sql/src/parsers/insert_parser.rs b/src/sql/src/parsers/insert_parser.rs index c65fbba72b..a369928456 100644 --- a/src/sql/src/parsers/insert_parser.rs +++ b/src/sql/src/parsers/insert_parser.rs @@ -20,7 +20,7 @@ use crate::parser::ParserContext; use crate::statements::insert::Insert; use crate::statements::statement::Statement; -/// INSERT statement parser implementation +/// INSERT/REPLACE statement parser implementation impl ParserContext<'_> { pub(crate) fn parse_insert(&mut self) -> Result { let _ = self.parser.next_token(); @@ -36,6 +36,24 @@ impl ParserContext<'_> { .fail(), } } + + pub(crate) fn parse_replace(&mut self) -> Result { + let _ = self.parser.next_token(); + let spstatement = self.parser.parse_insert().context(error::SyntaxSnafu)?; + + match spstatement { + SpStatement::Insert(mut insert_stmt) => { + insert_stmt.replace_into = true; + Ok(Statement::Insert(Box::new(Insert { + inner: SpStatement::Insert(insert_stmt), + }))) + } + unexp => error::UnsupportedSnafu { + keyword: unexp.to_string(), + } + .fail(), + } + } } #[cfg(test)] diff --git a/tests/cases/standalone/common/insert/insert.result b/tests/cases/standalone/common/insert/insert.result index 6c6f78bc78..8a42b9250b 100644 --- a/tests/cases/standalone/common/insert/insert.result +++ b/tests/cases/standalone/common/insert/insert.result @@ -9,6 +9,10 @@ INSERT INTO integers VALUES (1), (2), (3), (4), (5); Affected Rows: 5 +REPLACE INTO integers VALUES (6), (7); + +Affected Rows: 2 + SELECT * FROM integers; +-------------------------+ @@ -19,6 +23,8 @@ SELECT * FROM integers; | 1970-01-01T00:00:00.003 | | 1970-01-01T00:00:00.004 | | 1970-01-01T00:00:00.005 | +| 1970-01-01T00:00:00.006 | +| 1970-01-01T00:00:00.007 | +-------------------------+ -- Test insert with long string constant diff --git a/tests/cases/standalone/common/insert/insert.sql b/tests/cases/standalone/common/insert/insert.sql index 0b51181561..68395c5e93 100644 --- a/tests/cases/standalone/common/insert/insert.sql +++ b/tests/cases/standalone/common/insert/insert.sql @@ -5,6 +5,8 @@ CREATE TABLE integers ( INSERT INTO integers VALUES (1), (2), (3), (4), (5); +REPLACE INTO integers VALUES (6), (7); + SELECT * FROM integers; -- Test insert with long string constant