From b06ea85ff5a7082bc742bd0eb17aecd4aa9a822c Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 4 Nov 2014 00:40:30 +0100 Subject: [PATCH] allowing column ref with table specified --- src/build_and_run_tests.sh | 2 +- src/lib/Expr.cpp | 7 +++++++ src/lib/Expr.h | 3 +++ src/lib/sqlhelper.cpp | 2 ++ src/parser/bison_parser.y | 1 + src/sql_analysis.cpp | 6 +++++- 6 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/build_and_run_tests.sh b/src/build_and_run_tests.sh index 46b1f7e..4d5f72f 100644 --- a/src/build_and_run_tests.sh +++ b/src/build_and_run_tests.sh @@ -21,7 +21,7 @@ echo "\n\n" # ./bin/analysis "SELECT a FROM foo WHERE a > 12 OR b > 3 AND c = 3" ./bin/analysis "SELECT col1, col2, 'test' FROM table, foo WHERE age > 12 AND zipcode = 12345 GROUP BY col1 ORDER BY col2 DESC LIMIT 100;" -./bin/analysis "SELECT * from table WHERE (b OR NOT a) AND a = 12.5 JOIN table2 ON a = b" +./bin/analysis "SELECT * from table WHERE (b OR NOT a) AND a = 12.5 JOIN table2 ON t1.a = t2.b" # ./bin/analysis "SELECT * from table WHERE (b OR NOT a) AND a = 12.5 JOIN table2 ON a = b" echo "\n\n" \ No newline at end of file diff --git a/src/lib/Expr.cpp b/src/lib/Expr.cpp index 23f527a..c1c590f 100644 --- a/src/lib/Expr.cpp +++ b/src/lib/Expr.cpp @@ -72,6 +72,13 @@ Expr* Expr::makeColumnRef(char* name) { return e; } +Expr* Expr::makeColumnRef(char* table, char* name) { + ALLOC_EXPR(e, kExprTableColumnRef); + e->name = name; + e->table = table; + return e; +} + Expr* Expr::makeFunctionRef(char* func_name, Expr* expr) { ALLOC_EXPR(e, kExprFunctionRef); e->name = func_name; diff --git a/src/lib/Expr.h b/src/lib/Expr.h index f010d6d..879309a 100644 --- a/src/lib/Expr.h +++ b/src/lib/Expr.h @@ -11,6 +11,7 @@ typedef enum { kExprLiteralInt, kExprStar, kExprColumnRef, + kExprTableColumnRef, kExprFunctionRef, kExprOperator } ExprType; @@ -49,6 +50,7 @@ struct Expr { Expr* expr; Expr* expr2; char* name; + char* table; float fval; int64_t ival; @@ -64,6 +66,7 @@ struct Expr { static Expr* makeLiteral(char* val); static Expr* makeColumnRef(char* name); + static Expr* makeColumnRef(char* table, char* name); static Expr* makeFunctionRef(char* func_name, Expr* expr); }; diff --git a/src/lib/sqlhelper.cpp b/src/lib/sqlhelper.cpp index e22466c..7491cfa 100644 --- a/src/lib/sqlhelper.cpp +++ b/src/lib/sqlhelper.cpp @@ -12,6 +12,7 @@ const char* indent(uint num_indent) { return std::string(num_indent, '\t').c_str void inprint(int64_t val, uint num_indent) { printf("%s%ld \n", indent(num_indent), val); } void inprint(float val, uint num_indent) { printf("%s%f\n", indent(num_indent), val); } void inprint(const char* val, uint num_indent) { printf("%s%s\n", indent(num_indent), val); } +void inprint(const char* val, const char* val2, uint num_indent) { printf("%s%s->%s\n", indent(num_indent), val, val2); } void inprintC(char val, uint num_indent) { printf("%s%c\n", indent(num_indent), val); } void inprintU(uint64_t val, uint num_indent) { printf("%s%lu\n", indent(num_indent), val); } @@ -47,6 +48,7 @@ void printExpression(Expr* expr, uint num_indent) { switch (expr->type) { case kExprStar: inprint("*", num_indent); break; case kExprColumnRef: inprint(expr->name, num_indent); break; + case kExprTableColumnRef: inprint(expr->table, expr->name, num_indent); break; case kExprLiteralFloat: inprint(expr->fval, num_indent); break; case kExprLiteralInt: inprint(expr->ival, num_indent); break; case kExprLiteralString: inprint(expr->name, num_indent); break; diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index a720ac4..f07049b 100644 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -291,6 +291,7 @@ function_expr: column_name: NAME { $$ = Expr::makeColumnRef($1); } + | NAME '.' NAME { $$ = Expr::makeColumnRef($1, $3); } ; literal: diff --git a/src/sql_analysis.cpp b/src/sql_analysis.cpp index 5b7720a..dfe7a66 100644 --- a/src/sql_analysis.cpp +++ b/src/sql_analysis.cpp @@ -28,7 +28,11 @@ int main(int argc, char *argv[]) { } else if (stmt->type == kStmtJoin) { printJoinStatementInfo((JoinStatement*) stmt, 0); } else { - fprintf(stderr, "Unsupported Statement Type %u!\n", stmt->type); + if (stmt->type == kStmtError) { + fprintf(stderr, "%s!\n", stmt->parser_msg); + } else { + fprintf(stderr, "Unsupported Statement Type %u!\n", stmt->type); + } } }