From daed7a6e66acb53f08ffe7b281bd674bb9a13ff2 Mon Sep 17 00:00:00 2001 From: myyrakle Date: Mon, 29 Jul 2024 23:58:52 +0900 Subject: [PATCH] =?UTF-8?q?[#142]=20parse=5Fgroup=5Fby=5Fitem=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ast/dml/parts/group_by.rs | 2 +- src/ast/types/select_column.rs | 2 +- src/parser/test/select.rs | 50 ++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/ast/dml/parts/group_by.rs b/src/ast/dml/parts/group_by.rs index 51587d00..4948b93e 100644 --- a/src/ast/dml/parts/group_by.rs +++ b/src/ast/dml/parts/group_by.rs @@ -7,7 +7,7 @@ pub struct GroupByClause { pub group_by_items: Vec, } -#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)] +#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash, Default)] pub struct GroupByItem { pub item: SelectColumn, } diff --git a/src/ast/types/select_column.rs b/src/ast/types/select_column.rs index 4a4d7d9e..6c82f7f0 100644 --- a/src/ast/types/select_column.rs +++ b/src/ast/types/select_column.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; // [table_alias.]column_name // SELECT시 컬럼 지정을 가리키는 값입니다. -#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash)] +#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Eq, Hash, Default)] pub struct SelectColumn { pub table_name: Option, pub column_name: String, diff --git a/src/parser/test/select.rs b/src/parser/test/select.rs index cf5637ce..e067e0de 100644 --- a/src/parser/test/select.rs +++ b/src/parser/test/select.rs @@ -1996,3 +1996,53 @@ fn test_parse_order_by_item() { } } } + +#[test] +fn test_parse_group_by_item() { + struct TestCase { + name: String, + input: Vec, + expected: GroupByItem, + want_error: bool, + } + + let test_cases = vec![ + TestCase { + name: "p.id".into(), + input: vec![ + Token::Identifier("p".into()), + Token::Period, + Token::Identifier("id".into()), + ], + expected: GroupByItem { + item: SelectColumn::new(Some("p".into()), "id".into()), + }, + want_error: false, + }, + TestCase { + name: "실패: 빈 토큰".into(), + input: vec![], + expected: Default::default(), + want_error: true, + }, + ]; + + for t in test_cases { + let mut parser = Parser::new(t.input); + + let got = parser.parse_group_by_item(Default::default()); + + assert_eq!( + got.is_err(), + t.want_error, + "{}: want_error: {}, error: {:?}", + t.name, + t.want_error, + got.err() + ); + + if let Ok(statements) = got { + assert_eq!(statements, t.expected, "TC: {}", t.name); + } + } +}