From d171916b7fe7f472cca4fd085399483b9121c16e Mon Sep 17 00:00:00 2001 From: myyrakle Date: Fri, 26 Jul 2024 21:22:53 +0900 Subject: [PATCH 1/4] =?UTF-8?q?[#137]=20DeleteQuery=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/test/delete.rs | 98 +++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 44 deletions(-) diff --git a/src/parser/test/delete.rs b/src/parser/test/delete.rs index d1b38484..733b35b0 100644 --- a/src/parser/test/delete.rs +++ b/src/parser/test/delete.rs @@ -9,53 +9,63 @@ use crate::parser::context::ParserContext; use crate::parser::predule::Parser; #[test] -pub fn delete_from_1() { - let text = r#" - DELETE FROM foo.bar - "# - .to_owned(); +pub fn test_delete_query() { + struct TestCase { + name: String, + input: String, + expected: DeleteQuery, + want_error: bool, + } - let mut parser = Parser::new(text).unwrap(); + let test_cases = vec![ + TestCase { + name: "where 없는 delete".into(), + input: "DELETE FROM foo.bar".to_owned(), + expected: DeleteQuery::builder() + .set_from_table(TableName { + database_name: Some("foo".into()), + table_name: "bar".into(), + }) + .build(), + want_error: false, + }, + TestCase { + name: "where 있는 delete".into(), + input: "DELETE FROM foo.bar WHERE name = 'asdf'".to_owned(), + expected: DeleteQuery::builder() + .set_from_table(TableName { + database_name: Some("foo".into()), + table_name: "bar".into(), + }) + .set_where(WhereClause { + expression: BinaryOperatorExpression { + operator: BinaryOperator::Eq, + lhs: SelectColumn::new(None, "name".into()).into(), + rhs: SQLExpression::String("asdf".into()), + } + .into(), + }) + .build(), + want_error: false, + }, + ]; - let expected = DeleteQuery::builder() - .set_from_table(TableName { - database_name: Some("foo".into()), - table_name: "bar".into(), - }) - .build(); + for t in test_cases { + let mut parser = Parser::new(t.input).unwrap(); - assert_eq!( - parser.parse(ParserContext::default()).unwrap(), - vec![expected.into()], - ); -} - -#[test] -pub fn delete_from_where_1() { - let text = r#" - DELETE FROM foo.bar WHERE name = 'asdf' - "# - .to_owned(); - - let mut parser = Parser::new(text).unwrap(); + let got = parser.parse(ParserContext::default()); - let expected = DeleteQuery::builder() - .set_from_table(TableName { - database_name: Some("foo".into()), - table_name: "bar".into(), - }) - .set_where(WhereClause { - expression: BinaryOperatorExpression { - operator: BinaryOperator::Eq, - lhs: SelectColumn::new(None, "name".into()).into(), - rhs: SQLExpression::String("asdf".into()), - } - .into(), - }) - .build(); + assert_eq!( + got.is_err(), + t.want_error, + "{}: want_error: {}, error: {:?}", + t.name, + t.want_error, + got.err() + ); - assert_eq!( - parser.parse(ParserContext::default()).unwrap(), - vec![expected.into()], - ); + if let Ok(statements) = got { + assert_eq!(statements, vec![t.expected.into()], "TC: {}", t.name); + } + } } From eab3e11d585ff0d9410b763c860249352ae71d4d Mon Sep 17 00:00:00 2001 From: myyrakle Date: Fri, 26 Jul 2024 23:48:14 +0900 Subject: [PATCH 2/4] =?UTF-8?q?[#137]=20Parser=EC=97=90=EC=84=9C=20Tokeniz?= =?UTF-8?q?er=20=ED=98=B8=EC=B6=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/parser.rs | 10 +++++- src/parser/test/alter_database.rs | 4 +-- src/parser/test/alter_table.rs | 26 +++++++-------- src/parser/test/create_database.rs | 4 +-- src/parser/test/create_table.rs | 2 +- src/parser/test/delete.rs | 2 +- src/parser/test/drop_database.rs | 2 +- src/parser/test/drop_table.rs | 2 +- src/parser/test/expressions.rs | 36 ++++++++++---------- src/parser/test/insert.rs | 8 ++--- src/parser/test/other.rs | 10 +++--- src/parser/test/select.rs | 52 ++++++++++++++--------------- src/parser/test/tcl.rs | 6 ++-- src/parser/test/update.rs | 6 ++-- src/pgwire/connection/connection.rs | 11 ++++-- 15 files changed, 98 insertions(+), 83 deletions(-) diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 8e22e9c3..fd3dcd8e 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -13,7 +13,15 @@ pub struct Parser { impl Parser { // 파서 객체 생성 - pub fn new(text: String) -> Result { + pub fn new(tokens: Vec) -> Self { + Self { + current_token: Token::EOF, + tokens: VecDeque::from(tokens), + } + } + + // deorecated + pub fn with_string(text: String) -> Result { Ok(Self { current_token: Token::EOF, tokens: VecDeque::from(Tokenizer::string_to_tokens(text)?), diff --git a/src/parser/test/alter_database.rs b/src/parser/test/alter_database.rs index 8615147d..816b2de6 100644 --- a/src/parser/test/alter_database.rs +++ b/src/parser/test/alter_database.rs @@ -12,7 +12,7 @@ pub fn alter_database_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterDatabaseQuery::builder() .set_name("foo".to_owned()) @@ -34,7 +34,7 @@ pub fn alter_database_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterDatabaseQuery::builder() .set_name("foo".to_owned()) diff --git a/src/parser/test/alter_table.rs b/src/parser/test/alter_table.rs index e99accf5..2e936d86 100644 --- a/src/parser/test/alter_table.rs +++ b/src/parser/test/alter_table.rs @@ -19,7 +19,7 @@ pub fn alter_table_rename_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -42,7 +42,7 @@ pub fn alter_table_add_column_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -73,7 +73,7 @@ pub fn alter_table_add_column_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -104,7 +104,7 @@ pub fn alter_table_rename_column_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -133,7 +133,7 @@ pub fn alter_table_rename_column_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -162,7 +162,7 @@ pub fn alter_table_alter_column_drop_not_null_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -191,7 +191,7 @@ pub fn alter_table_alter_column_set_not_null_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -220,7 +220,7 @@ pub fn alter_table_alter_column_set_type_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -252,7 +252,7 @@ pub fn alter_table_alter_column_set_type_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -284,7 +284,7 @@ pub fn alter_table_alter_column_set_default_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -316,7 +316,7 @@ pub fn alter_table_alter_column_drop_default_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -345,7 +345,7 @@ pub fn alter_table_drop_column_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { @@ -373,7 +373,7 @@ pub fn alter_table_drop_column_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = AlterTableQuery::builder() .set_table(TableName { diff --git a/src/parser/test/create_database.rs b/src/parser/test/create_database.rs index 1145b85e..f6da89bd 100644 --- a/src/parser/test/create_database.rs +++ b/src/parser/test/create_database.rs @@ -10,7 +10,7 @@ pub fn create_database_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = CreateDatabaseQuery::builder() .set_name("test_db".to_owned()) @@ -30,7 +30,7 @@ pub fn create_database_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = CreateDatabaseQuery::builder() .set_name("test_db".to_owned()) diff --git a/src/parser/test/create_table.rs b/src/parser/test/create_table.rs index e090cc01..f3bc7814 100644 --- a/src/parser/test/create_table.rs +++ b/src/parser/test/create_table.rs @@ -17,7 +17,7 @@ pub fn create_table() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = CreateTableQuery::builder() .set_table(TableName::new( diff --git a/src/parser/test/delete.rs b/src/parser/test/delete.rs index 733b35b0..acd4d8f7 100644 --- a/src/parser/test/delete.rs +++ b/src/parser/test/delete.rs @@ -51,7 +51,7 @@ pub fn test_delete_query() { ]; for t in test_cases { - let mut parser = Parser::new(t.input).unwrap(); + let mut parser = Parser::with_string(t.input).unwrap(); let got = parser.parse(ParserContext::default()); diff --git a/src/parser/test/drop_database.rs b/src/parser/test/drop_database.rs index c4500711..0edc643f 100644 --- a/src/parser/test/drop_database.rs +++ b/src/parser/test/drop_database.rs @@ -10,7 +10,7 @@ pub fn drop_database() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = DropDatabaseQuery::builder() .set_name("test_db".to_owned()) diff --git a/src/parser/test/drop_table.rs b/src/parser/test/drop_table.rs index 6067ac04..f4633bfb 100644 --- a/src/parser/test/drop_table.rs +++ b/src/parser/test/drop_table.rs @@ -12,7 +12,7 @@ pub fn drop_table() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = DropTableQuery::builder() .set_table(TableName::new(Some("foo_db".to_owned()), "foo".to_owned())) diff --git a/src/parser/test/expressions.rs b/src/parser/test/expressions.rs index f81e6879..5d12b64d 100644 --- a/src/parser/test/expressions.rs +++ b/src/parser/test/expressions.rs @@ -21,7 +21,7 @@ pub fn unary_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -51,7 +51,7 @@ pub fn unary_expression_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -81,7 +81,7 @@ pub fn arithmetic_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -112,7 +112,7 @@ pub fn arithmetic_expression_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -148,7 +148,7 @@ pub fn arithmetic_expression_3() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -184,7 +184,7 @@ pub fn arithmetic_expression_4() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -225,7 +225,7 @@ pub fn arithmetic_expression_5() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -263,7 +263,7 @@ pub fn arithmetic_expression_6() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -298,7 +298,7 @@ pub fn function_call_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -332,7 +332,7 @@ pub fn function_call_expression_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -362,7 +362,7 @@ pub fn between_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -393,7 +393,7 @@ pub fn between_expression_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -429,7 +429,7 @@ pub fn between_expression_3() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -465,7 +465,7 @@ pub fn not_between_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -496,7 +496,7 @@ pub fn list_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -529,7 +529,7 @@ pub fn in_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -567,7 +567,7 @@ pub fn not_in_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -605,7 +605,7 @@ pub fn complex_expression_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( diff --git a/src/parser/test/insert.rs b/src/parser/test/insert.rs index 901b00aa..70d977ce 100644 --- a/src/parser/test/insert.rs +++ b/src/parser/test/insert.rs @@ -16,7 +16,7 @@ pub fn insert_into_values_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = InsertQuery::builder() .set_into_table(TableName { @@ -47,7 +47,7 @@ pub fn insert_into_values_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = InsertQuery::builder() .set_into_table(TableName { @@ -87,7 +87,7 @@ pub fn insert_into_values_3() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = InsertQuery::builder() .set_into_table(TableName { @@ -127,7 +127,7 @@ pub fn insert_into_select_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = InsertQuery::builder() .set_into_table(TableName { diff --git a/src/parser/test/other.rs b/src/parser/test/other.rs index aec70f2a..c94b0705 100644 --- a/src/parser/test/other.rs +++ b/src/parser/test/other.rs @@ -15,7 +15,7 @@ pub fn show_databases_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = ShowDatabasesQuery {}; @@ -32,7 +32,7 @@ pub fn show_databases_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = ShowDatabasesQuery {}; @@ -49,7 +49,7 @@ pub fn use_databases_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = UseDatabaseQuery { database_name: "asdf".into(), @@ -68,7 +68,7 @@ pub fn desc_table_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = DescTableQuery { table_name: TableName { @@ -90,7 +90,7 @@ pub fn show_tables_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = ShowTablesQuery { database: "rrdb".into(), diff --git a/src/parser/test/select.rs b/src/parser/test/select.rs index 1dc3667d..ed2a5e52 100644 --- a/src/parser/test/select.rs +++ b/src/parser/test/select.rs @@ -21,7 +21,7 @@ pub fn select_from_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -50,7 +50,7 @@ pub fn select_from_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -83,7 +83,7 @@ pub fn select_from_3() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -125,7 +125,7 @@ pub fn select_from_4() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_wildcard(SelectWildCard { alias: None }) @@ -153,7 +153,7 @@ pub fn select_inner_join_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -204,7 +204,7 @@ pub fn select_inner_join_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -255,7 +255,7 @@ pub fn select_left_join_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -306,7 +306,7 @@ pub fn select_left_join_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -357,7 +357,7 @@ pub fn select_right_join_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -408,7 +408,7 @@ pub fn select_right_join_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -459,7 +459,7 @@ pub fn select_full_join_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -510,7 +510,7 @@ pub fn select_full_join_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -559,7 +559,7 @@ pub fn select_where_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -599,7 +599,7 @@ pub fn select_order_by_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -636,7 +636,7 @@ pub fn select_order_by_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -678,7 +678,7 @@ pub fn select_order_by_3() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -715,7 +715,7 @@ pub fn select_order_by_4() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -752,7 +752,7 @@ pub fn select_group_by_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -787,7 +787,7 @@ pub fn select_group_by_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -827,7 +827,7 @@ pub fn error_select_group_by_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); assert!(parser.parse(ParserContext::default()).is_err()); } @@ -843,7 +843,7 @@ pub fn select_group_by_having_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -886,7 +886,7 @@ pub fn select_offset_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -919,7 +919,7 @@ pub fn select_limit_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -953,7 +953,7 @@ pub fn select_offset_limit_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -988,7 +988,7 @@ pub fn select_limit_offset_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( @@ -1026,7 +1026,7 @@ pub fn select_subquery_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = SelectQuery::builder() .add_select_item( diff --git a/src/parser/test/tcl.rs b/src/parser/test/tcl.rs index 59a7bb43..99e1f3d3 100644 --- a/src/parser/test/tcl.rs +++ b/src/parser/test/tcl.rs @@ -39,7 +39,7 @@ pub fn begin_transaction() { ]; for tc in test_cases { - let mut parser = Parser::new(tc.input).unwrap(); + let mut parser = Parser::with_string(tc.input).unwrap(); let result = parser.parse(ParserContext::default()); @@ -74,7 +74,7 @@ pub fn commit() { }]; for tc in test_cases { - let mut parser = Parser::new(tc.input).unwrap(); + let mut parser = Parser::with_string(tc.input).unwrap(); let result = parser.parse(ParserContext::default()); @@ -109,7 +109,7 @@ pub fn rollback() { }]; for tc in test_cases { - let mut parser = Parser::new(tc.input).unwrap(); + let mut parser = Parser::with_string(tc.input).unwrap(); let result = parser.parse(ParserContext::default()); diff --git a/src/parser/test/update.rs b/src/parser/test/update.rs index e78dd122..bca76329 100644 --- a/src/parser/test/update.rs +++ b/src/parser/test/update.rs @@ -18,7 +18,7 @@ pub fn update_set_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = UpdateQuery::builder() .set_target_table(TableName { @@ -47,7 +47,7 @@ pub fn update_set_2() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = UpdateQuery::builder() .set_target_table(TableName { @@ -80,7 +80,7 @@ pub fn update_set_where_1() { "# .to_owned(); - let mut parser = Parser::new(text).unwrap(); + let mut parser = Parser::with_string(text).unwrap(); let expected = UpdateQuery::builder() .set_target_table(TableName { diff --git a/src/pgwire/connection/connection.rs b/src/pgwire/connection/connection.rs index c982fc23..111744dd 100644 --- a/src/pgwire/connection/connection.rs +++ b/src/pgwire/connection/connection.rs @@ -8,6 +8,7 @@ use tokio_util::codec::Framed; use crate::{ ast::{OtherStatement, SQLStatement}, executor::{config::global::GlobalConfig, executor::Executor}, + lexer::predule::Tokenizer, logger::predule::Logger, parser::{context::ParserContext, predule::Parser}, pgwire::{ @@ -75,8 +76,14 @@ impl Connection { } fn parse_statement(&mut self, text: &str) -> Result, ErrorResponse> { - let mut parser = Parser::new(text.into()) - .map_err(|e| ErrorResponse::error(SqlState::SYNTAX_ERROR, e.to_string()))?; + let tokens = match Tokenizer::string_to_tokens(text.into()) { + Ok(tokens) => tokens, + Err(e) => { + return Err(ErrorResponse::error(SqlState::SYNTAX_ERROR, e.to_string())); + } + }; + + let mut parser = Parser::new(tokens); let statements = parser .parse( From 027e18b88420354954c99b74980cc946d2bc5183 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Fri, 26 Jul 2024 23:52:35 +0900 Subject: [PATCH 3/4] =?UTF-8?q?[#137]=20test=5Fdelete=5Fquery=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/parser/test/delete.rs | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/parser/test/delete.rs b/src/parser/test/delete.rs index acd4d8f7..b9769ade 100644 --- a/src/parser/test/delete.rs +++ b/src/parser/test/delete.rs @@ -5,6 +5,8 @@ use crate::ast::dml::expressions::binary::BinaryOperatorExpression; use crate::ast::dml::expressions::operators::BinaryOperator; use crate::ast::dml::parts::_where::WhereClause; use crate::ast::types::{SQLExpression, SelectColumn, TableName}; +use crate::lexer::predule::OperatorToken; +use crate::lexer::tokens::Token; use crate::parser::context::ParserContext; use crate::parser::predule::Parser; @@ -12,15 +14,21 @@ use crate::parser::predule::Parser; pub fn test_delete_query() { struct TestCase { name: String, - input: String, + input: Vec, expected: DeleteQuery, want_error: bool, } let test_cases = vec![ TestCase { - name: "where 없는 delete".into(), - input: "DELETE FROM foo.bar".to_owned(), + name: "성공: delete from foo.bar".into(), + input: vec![ + Token::Delete, + Token::From, + Token::Identifier("foo".into()), + Token::Period, + Token::Identifier("bar".into()), + ], expected: DeleteQuery::builder() .set_from_table(TableName { database_name: Some("foo".into()), @@ -30,8 +38,18 @@ pub fn test_delete_query() { want_error: false, }, TestCase { - name: "where 있는 delete".into(), - input: "DELETE FROM foo.bar WHERE name = 'asdf'".to_owned(), + name: "성공: DELETE FROM foo.bar WHERE name = 'asdf'".into(), + input: vec![ + Token::Delete, + Token::From, + Token::Identifier("foo".into()), + Token::Period, + Token::Identifier("bar".into()), + Token::Where, + Token::Identifier("name".into()), + Token::Operator(OperatorToken::Eq), + Token::String("asdf".into()), + ], expected: DeleteQuery::builder() .set_from_table(TableName { database_name: Some("foo".into()), @@ -51,7 +69,7 @@ pub fn test_delete_query() { ]; for t in test_cases { - let mut parser = Parser::with_string(t.input).unwrap(); + let mut parser = Parser::new(t.input); let got = parser.parse(ParserContext::default()); From 75399d968a71c0691fe495debcf88a65dbe916e3 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Sat, 27 Jul 2024 00:00:25 +0900 Subject: [PATCH 4/4] =?UTF-8?q?[#137]=20test=5Fdelete=5Fquery=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ast/dml/delete.rs | 2 +- src/parser/test/delete.rs | 55 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/ast/dml/delete.rs b/src/ast/dml/delete.rs index 78857170..ddf2dab8 100644 --- a/src/ast/dml/delete.rs +++ b/src/ast/dml/delete.rs @@ -2,7 +2,7 @@ use crate::ast::{types::TableName, DMLStatement, SQLStatement}; use super::parts::{_where::WhereClause, target::UpdateTarget}; -#[derive(Clone, Debug, PartialEq)] +#[derive(Clone, Debug, PartialEq, Default)] pub struct DeleteQuery { pub from_table: Option, pub where_clause: Option, diff --git a/src/parser/test/delete.rs b/src/parser/test/delete.rs index b9769ade..fb1126ca 100644 --- a/src/parser/test/delete.rs +++ b/src/parser/test/delete.rs @@ -7,7 +7,6 @@ use crate::ast::dml::parts::_where::WhereClause; use crate::ast::types::{SQLExpression, SelectColumn, TableName}; use crate::lexer::predule::OperatorToken; use crate::lexer::tokens::Token; -use crate::parser::context::ParserContext; use crate::parser::predule::Parser; #[test] @@ -66,12 +65,62 @@ pub fn test_delete_query() { .build(), want_error: false, }, + TestCase { + name: "성공: DELETE FROM foo.bar as f".into(), + input: vec![ + Token::Delete, + Token::From, + Token::Identifier("foo".into()), + Token::Period, + Token::Identifier("bar".into()), + Token::As, + Token::Identifier("f".into()), + ], + expected: DeleteQuery::builder() + .set_from_table(TableName { + database_name: Some("foo".into()), + table_name: "bar".into(), + }) + .set_from_alias("f".into()) + .build(), + want_error: false, + }, + TestCase { + name: "실패: 토큰이 하나도 없음".into(), + input: vec![], + expected: Default::default(), + want_error: true, + }, + TestCase { + name: "실패: DELETE가 아님".into(), + input: vec![Token::Select], + expected: Default::default(), + want_error: true, + }, + TestCase { + name: "실패: DELETE밖에 없음".into(), + input: vec![Token::Delete], + expected: Default::default(), + want_error: true, + }, + TestCase { + name: "실패: DELETE INTO".into(), + input: vec![Token::Delete, Token::Into], + expected: Default::default(), + want_error: true, + }, + TestCase { + name: "실패: DELETE FROM".into(), + input: vec![Token::Delete, Token::From], + expected: Default::default(), + want_error: true, + }, ]; for t in test_cases { let mut parser = Parser::new(t.input); - let got = parser.parse(ParserContext::default()); + let got = parser.handle_delete_query(Default::default()); assert_eq!( got.is_err(), @@ -83,7 +132,7 @@ pub fn test_delete_query() { ); if let Ok(statements) = got { - assert_eq!(statements, vec![t.expected.into()], "TC: {}", t.name); + assert_eq!(statements, t.expected.into(), "TC: {}", t.name); } } }