From 0de2e4d95196190b89681dc4786ceb22bde11d50 Mon Sep 17 00:00:00 2001 From: Kevin Biju Date: Wed, 1 Nov 2023 19:40:59 +0530 Subject: [PATCH 1/5] PAUSE MIRROR parsing, will add tests later --- src/ast/mod.rs | 19 ++++++++++++++++++- src/keywords.rs | 1 + src/parser/mod.rs | 11 +++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index e65ef35..7c3bb7a 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -2146,7 +2146,7 @@ pub enum Statement { if_not_exists: bool, create_mirror: CreateMirror, }, - /// DROP MIRROR [IF EXISTS] mirror_name + // DROP MIRROR [IF EXISTS] mirror_name DropMirror { #[cfg_attr(feature = "derive-visitor", drive(skip))] if_exists: bool, @@ -2162,6 +2162,12 @@ pub enum Statement { mirror_name: ObjectName, with_options: Vec, }, + // DROP MIRROR [IF EXISTS] mirror_name + PauseMirror { + #[cfg_attr(feature = "derive-visitor", drive(skip))] + if_exists: bool, + mirror_name: ObjectName, + } } #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] @@ -3655,6 +3661,17 @@ impl fmt::Display for Statement { Statement::ExecuteMirror { mirror_name } => { write!(f, "EXECUTE MIRROR {mirror_name}", mirror_name = mirror_name)?; Ok(()) + }, + Statement::PauseMirror { + if_exists, + mirror_name, + } => { + write!( + f, + "PAUSE MIRROR {if_exists}{mirror_name}", + if_exists = if *if_exists { "IF EXISTS " } else { "" }, + )?; + Ok(()) } Statement::ResyncMirror { if_exists, diff --git a/src/keywords.rs b/src/keywords.rs index c9210c5..6658c90 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -471,6 +471,7 @@ define_keywords!( PARTITIONS, PASSWORD, PATTERN, + PAUSE, PEER, PERCENT, PERCENTILE_CONT, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 3685b70..4bb8072 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -522,6 +522,7 @@ impl<'a> Parser<'a> { // `PRAGMA` is sqlite specific https://www.sqlite.org/pragma.html Keyword::PRAGMA => Ok(self.parse_pragma()?), Keyword::RESYNC => Ok(self.parse_resync()?), + Keyword::PAUSE => Ok(self.parse_pause_mirror()?), _ => self.expected("an SQL statement", next_token), }, Token::LParen => { @@ -8104,6 +8105,16 @@ impl<'a> Parser<'a> { }) } + pub fn parse_pause_mirror(&mut self) -> Result { + self.expect_keyword(Keyword::MIRROR)?; + let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]); + let mirror_name = self.parse_object_name()?; + return Ok(Statement::PauseMirror { + if_exists, + mirror_name, + }); + } + /// The index of the first unprocessed token. pub fn index(&self) -> usize { self.index From a80b4885b948011f5ca84bff817bbe2b505ae98c Mon Sep 17 00:00:00 2001 From: Kevin Biju Date: Thu, 2 Nov 2023 20:35:29 +0530 Subject: [PATCH 2/5] pause mirror parsing tests --- tests/sqlparser_postgres.rs | 57 +++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 8288d21..df2f126 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -3610,6 +3610,20 @@ fn parse_create_mirror_with_schema() { #[test] fn parse_drop_mirror() { + match pg().verified_stmt("DROP MIRROR m1") { + Statement::DropMirror { + if_exists, + mirror_name, + } => { + assert!(!if_exists); + assert_eq!(mirror_name, ObjectName(vec![Ident::new("m1")])); + } + _ => unreachable!(), + } +} + +#[test] +fn parse_drop_mirror_if_exists() { match pg().verified_stmt("DROP MIRROR IF EXISTS m1") { Statement::DropMirror { if_exists, @@ -3622,8 +3636,51 @@ fn parse_drop_mirror() { } } + +#[test] +fn parse_pause_mirror() { + match pg().verified_stmt("PAUSE MIRROR m1") { + Statement::PauseMirror { + if_exists, + mirror_name, + } => { + assert!(!if_exists); + assert_eq!(mirror_name, ObjectName(vec![Ident::new("m1")])); + } + _ => unreachable!(), + } +} + +#[test] +fn parse_pause_mirror_if_exists() { + match pg().verified_stmt("PAUSE MIRROR IF EXISTS m1") { + Statement::PauseMirror { + if_exists, + mirror_name, + } => { + assert!(if_exists); + assert_eq!(mirror_name, ObjectName(vec![Ident::new("m1")])); + } + _ => unreachable!(), + } +} + #[test] fn parse_drop_peer() { + match pg().verified_stmt("DROP PEER p1") { + Statement::DropPeer { + if_exists, + peer_name, + } => { + assert!(!if_exists); + assert_eq!(peer_name, ObjectName(vec![Ident::new("p1")])); + } + _ => unreachable!(), + } +} + +#[test] +fn parse_drop_peer_if_exists() { match pg().verified_stmt("DROP PEER IF EXISTS p1") { Statement::DropPeer { if_exists, From d9847ebab2c726481314c04eca51e83d00e528b3 Mon Sep 17 00:00:00 2001 From: Kevin Biju Date: Thu, 2 Nov 2023 21:00:56 +0530 Subject: [PATCH 3/5] fixing lints pt.1 --- src/ast/mod.rs | 4 ++-- tests/sqlparser_postgres.rs | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 7c3bb7a..9f259b6 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -2167,7 +2167,7 @@ pub enum Statement { #[cfg_attr(feature = "derive-visitor", drive(skip))] if_exists: bool, mirror_name: ObjectName, - } + }, } #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] @@ -3661,7 +3661,7 @@ impl fmt::Display for Statement { Statement::ExecuteMirror { mirror_name } => { write!(f, "EXECUTE MIRROR {mirror_name}", mirror_name = mirror_name)?; Ok(()) - }, + } Statement::PauseMirror { if_exists, mirror_name, diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index df2f126..0d624a7 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -3636,7 +3636,6 @@ fn parse_drop_mirror_if_exists() { } } - #[test] fn parse_pause_mirror() { match pg().verified_stmt("PAUSE MIRROR m1") { From d8a5b69f0305355df150938088f0781cb03f7a1f Mon Sep 17 00:00:00 2001 From: Kevin Biju Date: Thu, 2 Nov 2023 21:02:14 +0530 Subject: [PATCH 4/5] fixing lints pt.2 --- src/parser/mod.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 4bb8072..3fe09df 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -8109,10 +8109,10 @@ impl<'a> Parser<'a> { self.expect_keyword(Keyword::MIRROR)?; let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]); let mirror_name = self.parse_object_name()?; - return Ok(Statement::PauseMirror { + Ok(Statement::PauseMirror { if_exists, mirror_name, - }); + }) } /// The index of the first unprocessed token. From f3f7d7a10fed00efcd02524e8bbdc745f788288b Mon Sep 17 00:00:00 2001 From: Kevin Biju Date: Wed, 8 Nov 2023 00:26:27 +0530 Subject: [PATCH 5/5] commenting before context switch --- src/ast/mod.rs | 17 +++++++++++++++++ src/keywords.rs | 1 + src/parser/mod.rs | 11 +++++++++++ tests/sqlparser_postgres.rs | 28 ++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+) diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 9f259b6..3d73918 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -2168,6 +2168,12 @@ pub enum Statement { if_exists: bool, mirror_name: ObjectName, }, + // RESUME MIRROR [IF EXISTS] mirror_name + ResumeMirror { + #[cfg_attr(feature = "derive-visitor", drive(skip))] + if_exists: bool, + mirror_name: ObjectName, + }, } #[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)] @@ -3673,6 +3679,17 @@ impl fmt::Display for Statement { )?; Ok(()) } + Statement::ResumeMirror { + if_exists, + mirror_name, + } => { + write!( + f, + "RESUME MIRROR {if_exists}{mirror_name}", + if_exists = if *if_exists { "IF EXISTS " } else { "" }, + )?; + Ok(()) + } Statement::ResyncMirror { if_exists, mirror_name, diff --git a/src/keywords.rs b/src/keywords.rs index 6658c90..9f5d11c 100644 --- a/src/keywords.rs +++ b/src/keywords.rs @@ -535,6 +535,7 @@ define_keywords!( RESPECT, RESTRICT, RESULT, + RESUME, RESYNC, RETAIN, RETURN, diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 3fe09df..0b9c9aa 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -523,6 +523,7 @@ impl<'a> Parser<'a> { Keyword::PRAGMA => Ok(self.parse_pragma()?), Keyword::RESYNC => Ok(self.parse_resync()?), Keyword::PAUSE => Ok(self.parse_pause_mirror()?), + Keyword::RESUME => Ok(self.parse_resume_mirror()?), _ => self.expected("an SQL statement", next_token), }, Token::LParen => { @@ -8115,6 +8116,16 @@ impl<'a> Parser<'a> { }) } + pub fn parse_resume_mirror(&mut self) -> Result { + self.expect_keyword(Keyword::MIRROR)?; + let if_exists = self.parse_keywords(&[Keyword::IF, Keyword::EXISTS]); + let mirror_name = self.parse_object_name()?; + Ok(Statement::ResumeMirror { + if_exists, + mirror_name, + }) + } + /// The index of the first unprocessed token. pub fn index(&self) -> usize { self.index diff --git a/tests/sqlparser_postgres.rs b/tests/sqlparser_postgres.rs index 0d624a7..24a7699 100644 --- a/tests/sqlparser_postgres.rs +++ b/tests/sqlparser_postgres.rs @@ -3664,6 +3664,34 @@ fn parse_pause_mirror_if_exists() { } } +#[test] +fn parse_resume_mirror() { + match pg().verified_stmt("RESUME MIRROR m1") { + Statement::ResumeMirror { + if_exists, + mirror_name, + } => { + assert!(!if_exists); + assert_eq!(mirror_name, ObjectName(vec![Ident::new("m1")])); + } + _ => unreachable!(), + } +} + +#[test] +fn parse_resume_mirror_if_exists() { + match pg().verified_stmt("RESUME MIRROR IF EXISTS m1") { + Statement::ResumeMirror { + if_exists, + mirror_name, + } => { + assert!(if_exists); + assert_eq!(mirror_name, ObjectName(vec![Ident::new("m1")])); + } + _ => unreachable!(), + } +} + #[test] fn parse_drop_peer() { match pg().verified_stmt("DROP PEER p1") {