From 41d3519eb4f1dcfe6a5cf9e799f5de56219f50eb Mon Sep 17 00:00:00 2001 From: reilly Date: Thu, 5 Oct 2023 00:07:56 +0800 Subject: [PATCH] [test] add test for parser Signed-off-by: reilly --- src/parser/mod.rs | 22 +++++++++++++++++++--- src/parser/stmt.rs | 6 ++++-- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/parser/mod.rs b/src/parser/mod.rs index a2a9c1c..6999cc1 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -26,7 +26,9 @@ use std::collections::BTreeMap; use stmt::Statement; use token::Token; -use self::stmt::{DropTableStmt, SetStmt, SetVariableType, TransactionIsolationLevel, UpdateStmt}; +use self::stmt::{ + DropTableStmt, ExplainStmt, SetStmt, SetVariableType, TransactionIsolationLevel, UpdateStmt, +}; use self::{ column::Column, operator::Precedence, @@ -415,6 +417,7 @@ impl Parser { fn parse_delete_stmt(&mut self) -> Result { self.next_expected_keyword(Keyword::From)?; let table = self.next_ident()?; + self.next_token(); Ok(Statement::Delete(DeleteTableStmt { table, r#where: self.parse_clause_where()?, @@ -710,6 +713,7 @@ impl Parser { } fn parse_drop_stmt(&mut self) -> Result { + self.next_expected_keyword(Keyword::Table)?; Ok(Statement::DropTable(DropTableStmt { table: self.next_ident()?, })) @@ -1128,6 +1132,7 @@ impl Parser { loop { let column = self.next_ident()?; self.next_expected_token(Token::Equal)?; + self.next_token(); let expr = self.parse_expression(Precedence::Lowest)?; if set.contains_key(&column) { return Err(Error::OtherErr(fmt_err!( @@ -1136,7 +1141,7 @@ impl Parser { ))); } set.insert(column, expr); - if self.peek_token == Token::Comma { + if self.peek_token != Token::Comma { self.next_token(); break; } @@ -1149,7 +1154,10 @@ impl Parser { } fn parse_explain_stmt(&mut self) -> Result { - unimplemented!() + self.next_token(); + Ok(Statement::Explain(ExplainStmt { + statement: Box::new(self.parse_stmt()?), + })) } fn next_token(&mut self) -> &Token { @@ -1692,6 +1700,14 @@ pub mod test { } test_parser! { + explain_wrong_sql: "explain nothing;" => Err(Error::ParseErr("src/parser/mod.rs:86 unexpected token: Token: Ident: nothing".to_owned())), + explain_base_sql: "explain drop table person" => Ok(Statement::Explain(ExplainStmt{ statement: Box::new(Statement::DropTable(DropTableStmt { table: "person".to_owned() }))})), + update_table_base: "update person set name = 'tangruilin' where id = 1;" => Ok(Statement::Update(UpdateStmt { table: "person".to_owned(), set: BTreeMap::from([ + ("name".to_owned(), Some(Expression::Literal(Literal::String("tangruilin".to_owned())))), + ]), r#where: Some(Expression::Operation(Operation::Equal(Box::new(Expression::Field(None, "id".to_owned())), Box::new(Expression::Literal(Literal::Int(1))))))})), + drop_table_base: "drop table person;" => Ok(Statement::DropTable(DropTableStmt { table: "person".to_owned() })), + delete_table_base: "delete from person where id = 1;" => Ok(Statement::Delete(DeleteTableStmt { table: "person".to_owned(), r#where: Some(Expression::Operation(Operation::Equal(Box::new(Expression::Field(None, "id".to_owned())), Box::new(Expression::Literal(Literal::Int(1)))))) })), + delete_table_without_where: "delete from person;" => Ok(Statement::Delete(DeleteTableStmt { table: "person".to_owned(), r#where: None })), insert_table_base: "insert into person (id, name, age) values (1, 'tangruilin', 14)" => Ok(Statement::Insert(InsertStmt { table: "person".to_owned(), columns: Some(["id".to_owned(), "name".to_owned(), "age".to_owned()].to_vec()), diff --git a/src/parser/stmt.rs b/src/parser/stmt.rs index 2dd0b7f..5d2f459 100644 --- a/src/parser/stmt.rs +++ b/src/parser/stmt.rs @@ -60,8 +60,10 @@ impl std::fmt::Display for BeginStmt { } } -#[derive(Eq, PartialEq, Debug)] -pub struct ExplainStmt {} +#[derive(PartialEq, Debug)] +pub struct ExplainStmt { + pub statement: Box, +} #[derive(PartialEq, Debug)] pub struct CreateTableStmt { pub columns: Vec,