From d6598d6cf659fb8e5bbc561fec4872e9b2bbea99 Mon Sep 17 00:00:00 2001 From: Pedro Date: Wed, 8 Oct 2014 19:26:38 -0700 Subject: [PATCH] refactored Expr to be struct and have a type --- .gitignore | 2 ++ src/Makefile | 2 +- src/lex_parser.y | 4 ++-- src/lib/Expr.cpp | 16 ++++++++++++++++ src/lib/Expr.h | 29 ++++++++++++++++++++++++----- src/sql_tests.cpp | 6 ++---- 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index b8bd026..c5d7a60 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +utils/ + # Compiled Object files *.slo *.lo diff --git a/src/Makefile b/src/Makefile index 5232b2b..4e553a5 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,6 +1,6 @@ # Makefile -LIB_FILES = lex_lexer.c lex_parser.c lib/Statement.cpp lib/SQLParser.cpp +LIB_FILES = lex_lexer.c lex_parser.c lib/Statement.cpp lib/Expr.cpp lib/SQLParser.cpp TESTS_MAIN = sql_tests.cpp diff --git a/src/lex_parser.y b/src/lex_parser.y index 6a7657e..ad5f392 100644 --- a/src/lex_parser.y +++ b/src/lex_parser.y @@ -131,8 +131,8 @@ comparison_predicate: expr: - column_name { $$ = new Expr($1); } - | NAME '(' column_name ')' { $$ = new Expr($3, $1); } + column_name { $$ = makeColumnRef($1); } + | NAME '(' expr ')' { $$ = makeFunctionRef($1, $3); } ; diff --git a/src/lib/Expr.cpp b/src/lib/Expr.cpp index e69de29..7321177 100644 --- a/src/lib/Expr.cpp +++ b/src/lib/Expr.cpp @@ -0,0 +1,16 @@ + +#include "Expr.h" + + +Expr* makeColumnRef(char* name) { + ALLOC_EXPR(e, eExprColumnRef); + e->name = name; + return e; +} + + +Expr* makeFunctionRef(char* func_name, Expr* expr) { + ALLOC_EXPR(e, eExprFunctionRef); + e->name = func_name; + return e; +} \ No newline at end of file diff --git a/src/lib/Expr.h b/src/lib/Expr.h index 6fb064e..fd08cd1 100644 --- a/src/lib/Expr.h +++ b/src/lib/Expr.h @@ -3,15 +3,34 @@ #include +typedef enum { + eExprLiteralFloat, + eExprLiteralString, + eExprColumnRef, + eExprFunctionRef, + eExprPredicate +} EExprType; -class Expr { -public: - Expr(char* name) : name(name), func_name(NULL) {}; - Expr(char* name, char* func_name) : name(name), func_name(func_name) {}; + +struct Expr { + EExprType type; char* name; - char* func_name; + Expr* expr; }; +// Zero initializes an Expr object and assigns it to a space in the heap +#define ALLOC_EXPR(var, type) \ + Expr* var; \ + do { \ + Expr zero = {type}; \ + var = (Expr*)malloc(sizeof *var); \ + *var = zero; \ + } while(0) + + +Expr* makeColumnRef(char* name); +Expr* makeFunctionRef(char* func_name, Expr* expr); + #endif \ No newline at end of file diff --git a/src/sql_tests.cpp b/src/sql_tests.cpp index e82e818..5c72564 100644 --- a/src/sql_tests.cpp +++ b/src/sql_tests.cpp @@ -75,12 +75,10 @@ void SelectTest3() { ASSERT(select->_select_list->size() == 2); - ASSERT(select->_select_list->at(0)->func_name == NULL); + ASSERT(select->_select_list->at(0)->type == eExprColumnRef); + ASSERT(select->_select_list->at(1)->type == eExprFunctionRef); ASSERT_STR("name", select->_select_list->at(0)->name); - ASSERT(select->_select_list->at(1)->func_name != NULL); - ASSERT_STR("age", select->_select_list->at(1)->name); - ASSERT_STR("AVG", select->_select_list->at(1)->func_name); ASSERT(select->_group_by != NULL); ASSERT(select->_group_by->size() == 1);