From 33bd79a4f8593f0415cd7edd55546a43f5474cce Mon Sep 17 00:00:00 2001 From: myyrakle Date: Mon, 29 Jul 2024 23:30:34 +0900 Subject: [PATCH] =?UTF-8?q?[#142]=20parse=5Fselect=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/select_item.rs | 2 +- src/parser/test/select.rs | 71 ++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/ast/dml/parts/select_item.rs b/src/ast/dml/parts/select_item.rs index 83bb74bc..fd97332c 100644 --- a/src/ast/dml/parts/select_item.rs +++ b/src/ast/dml/parts/select_item.rs @@ -13,7 +13,7 @@ pub struct SelectWildCard { pub alias: Option, } -#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)] +#[derive(Deserialize, Serialize, Clone, Debug, PartialEq, Default)] pub struct SelectItem { pub item: Option, // select 요소 pub alias: Option, // as 절이 있을 경우 alias 정보 diff --git a/src/parser/test/select.rs b/src/parser/test/select.rs index d10c3366..0cf4e545 100644 --- a/src/parser/test/select.rs +++ b/src/parser/test/select.rs @@ -1788,3 +1788,74 @@ fn test_select_query() { } } } + +#[test] +fn test_parse_select_item() { + struct TestCase { + name: String, + input: Vec, + expected: SelectItem, + want_error: bool, + } + + let test_cases = vec![ + TestCase { + name: "1".into(), + input: vec![Token::Integer(1)], + expected: SelectItem::builder() + .set_item(SQLExpression::Integer(1)) + .build(), + want_error: false, + }, + TestCase { + name: "1 as one".into(), + input: vec![ + Token::Integer(1), + Token::As, + Token::Identifier("one".into()), + ], + expected: SelectItem::builder() + .set_item(SQLExpression::Integer(1)) + .set_alias("one".into()) + .build(), + want_error: false, + }, + TestCase { + name: "실패: 1 as".into(), + input: vec![Token::Integer(1), Token::As], + expected: Default::default(), + want_error: true, + }, + TestCase { + name: "실패: 1 as SELECT".into(), + input: vec![Token::Integer(1), Token::As, Token::Select], + expected: Default::default(), + want_error: true, + }, + 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_select_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); + } + } +}