From afe8dafef54167909e57290bc4037bc7d0cca25c Mon Sep 17 00:00:00 2001 From: Pedro Date: Tue, 4 Nov 2014 01:42:09 +0100 Subject: [PATCH] implemented table alias --- src/build_and_run_tests.sh | 12 ++++----- src/lib/Table.h | 1 + src/lib/sqlhelper.cpp | 12 ++++++--- src/parser/bison_parser.y | 52 +++++++++++++++++++++++++------------- src/parser/flex_lexer.l | 1 + 5 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/build_and_run_tests.sh b/src/build_and_run_tests.sh index 4d5f72f..da3cd18 100644 --- a/src/build_and_run_tests.sh +++ b/src/build_and_run_tests.sh @@ -11,17 +11,17 @@ make grammar_test echo "\n\n" ./bin/grammar_test "SELECT a FROM foo WHERE a > 12 OR b > 3 AND c = 3 LIMIT 10" -./bin/grammar_test "SELECT col1, col2, 'test' FROM table, foo WHERE age > 12 AND zipcode = 12345 GROUP BY col1;" -./bin/grammar_test "SELECT age FROM table, (SELECT * FROM table2) ORDER BY age DESC" -./bin/grammar_test "SELECT * from table WHERE (b OR NOT a) AND a = 12.5 JOIN table2 ON a = b" +./bin/grammar_test "SELECT col1, col2, 'test' FROM table, foo AS t WHERE age > 12 AND zipcode = 12345 GROUP BY col1;" +./bin/grammar_test "SELECT age FROM table AS t1, (SELECT * FROM table2) AS t2 ORDER BY age DESC" +./bin/grammar_test "SELECT * from table WHERE (b OR NOT a) AND a = 12.5 AS t1 JOIN table2 ON a = b" -./bin/grammar_test -f "(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c = 3 LIMIT 10)" +./bin/grammar_test "(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c = 3 LIMIT 10)" 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 t1.a = t2.b" +./bin/analysis "SELECT col1, col2, 'test' FROM table t1, 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 AS t1 JOIN table2 AS t2 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/Table.h b/src/lib/Table.h index fa25956..cdbe34d 100644 --- a/src/lib/Table.h +++ b/src/lib/Table.h @@ -26,6 +26,7 @@ struct TableRef { TableRefType type; char* name; + char* alias; SelectStatement* select; JoinStatement* join; List* list; diff --git a/src/lib/sqlhelper.cpp b/src/lib/sqlhelper.cpp index 7491cfa..7c45e06 100644 --- a/src/lib/sqlhelper.cpp +++ b/src/lib/sqlhelper.cpp @@ -28,6 +28,10 @@ void printTableRefInfo(TableRef* table, uint num_indent) { for (TableRef* tbl : table->list->_vector) printTableRefInfo(tbl, num_indent); break; } + if (table->alias != NULL) { + inprint("Alias", num_indent+1); + inprint(table->alias, num_indent+2); + } } void printOperatorExpression(Expr* expr, uint num_indent) { @@ -86,11 +90,13 @@ void printSelectStatementInfo(SelectStatement* stmt, uint num_indent) { void printJoinStatementInfo(JoinStatement* stmt, uint num_indent) { inprint("JoinStatement", num_indent); - inprint("Left Table", num_indent+1); + inprint("JoinType:", num_indent+1); + inprintU(stmt->join_type, num_indent+2); + inprint("Left Table:", num_indent+1); printTableRefInfo(stmt->left, num_indent+2); - inprint("Right Table", num_indent+1); + inprint("Right Table:", num_indent+1); printTableRefInfo(stmt->right, num_indent+2); - inprint("Join Condition", num_indent+1); + inprint("Join Condition:", num_indent+1); printExpression(stmt->join_condition, num_indent+2); } diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index f07049b..fe800e6 100644 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -107,8 +107,9 @@ typedef void* yyscan_t; %type statement %type select_statement %type join_statement -%type table_name -%type from_clause table_ref table_ref_atomic table_ref_atomic_opt_paren +%type table_name opt_alias alias +%type
from_clause table_ref table_ref_atomic table_ref_name +%type
join_table %type expr scalar_expr unary_expr binary_expr function_expr star_expr %type column_name literal int_literal num_literal %type comp_expr where_clause join_condition @@ -137,6 +138,7 @@ typedef void* yyscan_t; %left '^' /* Unary Operators */ +%right UMINUS %left '[' ']' %left '(' ')' %left '.' @@ -168,7 +170,7 @@ statement: ******************************/ join_statement: - table_ref_atomic_opt_paren JOIN table_ref_atomic_opt_paren ON join_condition + join_table JOIN join_table ON join_condition { $$ = new JoinStatement(); $$->left = $1; @@ -178,6 +180,17 @@ join_statement: } ; + +join_table: + select_statement alias { + auto tbl = new TableRef(kTableSelect); + tbl->select = $1; + tbl->alias = $2; + $$ = tbl; + } + | table_ref_name; + + join_condition: expr ; @@ -199,6 +212,7 @@ select_statement: s->limit = $7; $$ = s; } + | '(' select_statement ')' { $$ = $2; } ; @@ -326,15 +340,13 @@ table_ref: } ; + table_ref_atomic: - table_name { - auto tbl = new TableRef(kTableName); - tbl->name = $1; - $$ = tbl; - } - | '(' select_statement ')' { + table_ref_name + | '(' select_statement ')' alias { auto tbl = new TableRef(kTableSelect); tbl->select = $2; + tbl->alias = $4; $$ = tbl; } ; @@ -346,16 +358,14 @@ table_ref_commalist: ; -/* For join statements, where a select statement is allowed to be used without parenthesis */ -table_ref_atomic_opt_paren: - table_ref_atomic - | select_statement { - auto tbl = new TableRef(kTableSelect); - tbl->select = $1; +table_ref_name: + table_name opt_alias { + auto tbl = new TableRef(kTableName); + tbl->name = $1; + tbl->alias = $2; $$ = tbl; } - ; - + ; table_name: NAME @@ -363,6 +373,14 @@ table_name: ; +alias: + AS NAME { $$ = $2; } + | NAME + ; + +opt_alias: + alias + | /* empty */ { $$ = NULL; } opt_semicolon: ';' diff --git a/src/parser/flex_lexer.l b/src/parser/flex_lexer.l index 012cfc6..b0807e5 100644 --- a/src/parser/flex_lexer.l +++ b/src/parser/flex_lexer.l @@ -57,6 +57,7 @@ WHERE TOKEN(WHERE) NOT TOKEN(NOT) AND TOKEN(AND) OR TOKEN(OR) +AS TOKEN(AS) LIMIT TOKEN(LIMIT) ORDER TOKEN(ORDER)