참고한 것들
CodeRef (인데 private 이라 주인장만 볼 수 있음)
요구사항 파악
- 일단 가이드에는
StringExpression::Compute를 수정한 뒤에Planner::GetFuncCallFromFactory를 수정해서 완성하면 된다고 하는데 - 각 함수가 어떻게 작동하고 목적은 무엇인지 먼저 확인할 필요가 있었다.
- 그래서 막
cout으로 찍어보며 파악한 것은 PL 에서 배운거랑 유사하다.- 사용자 SQL 이 들어오면 이것을 트리로 변환하고, 각 node 를 연쇄적으로
Compute()하여 최종 결과를 뽑아내는 식으로 작동한다.- AST 과 유사하다고 생각하면 된다.
- 이때의 각 node 는
AbstractExpressionclass 의 subclass 로 표현된다.- 이 class 에는
children_field 가 있어서 여기에 자식의 포인터가 담기는 것. - 가령 예를 들어 보면
sql_func('good')는sql_func()을 대변하는 node 와 이것의 자식으로'good'를 대변하는 node 로 구성된 트리인 것. - 따라서
StringExpressionclass 는upper()와lower()SQL 함수를 대변하는 것이고, StringExpression::Compute()로 실제 연산을 수행하는 것.
- 이 class 에는
- 그리고 이때
Planner::GetFuncCallFromFactory함수는 node 를 묶어서 새로운 node 를 반환하는 함수인 셈이다.- 즉, 어떤 SQL 함수를 대변하는 node 를 만들기 위해, 해당 함수 이름과 자식 node 들을 받아 새로운 node 를 만들어 반환하는 역할인 것.
- 사용자 SQL 이 들어오면 이것을 트리로 변환하고, 각 node 를 연쇄적으로
- 아래에서 좀 더 자세히 보자.
StringExpression::Compute()
- 이 함수는 string 을 받아 연산을 한 뒤 결과 string 을 반환하는 함수이다.
- 어떤 연산을 할 지는
StringExpression::expr_type_으로 지정되고, (뭐 나중에 더 추가될 수도 있겠지만) 일단은 지금 버전으로는 enum 으로Lower와Upper가 가능하다. - 따라서 그냥 간단하게
expr_type_에 따라 입력받은 문자열을tolower()나toupper()로 바꿔주면 끝난다.
Planner::GetFuncCallFromFactory
- 이 함수에서는
StringExpressionobj 를 생성해서 반환해주면 되는데 func_name이"upper"인지"lower"인지에 따라 생성자에 다른 enum 값을 넣어주면 된다.- 그리고 예외처리로는
upper()나lower()는 1개의 string 을 받기 때문에- SQL 함수 인자 배열 (
args) 의 크기가 1인지와 - 해당 값의 type 이 문자열인지 확인하는 예외처리를 함
- 참고로 SQL 함수가 아닌 그냥 “값” 의 경우에도 이 값의 type 을
GetReturnType()로 검사할 수 있다.
- 참고로 SQL 함수가 아닌 그냥 “값” 의 경우에도 이 값의 type 을