From 66688f7199f216c6154863bce2159099e5882433 Mon Sep 17 00:00:00 2001 From: javrucebo Date: Mon, 22 Jan 2018 20:44:33 +0100 Subject: [PATCH] Adjust Table Join Types Consolidate LeftOuter/Left and RightOuter/Right as they are by definition the same. Similar consolidate FullOuter/Outer/Full ... with Outer (as in the parser) not part of standard, but "full" missing. Allowing all three. This commit potentially breaks other programs as kJoinLeftOuter and kJoinRightOuter are eliminated --- src/parser/bison_parser.y | 8 +++--- src/sql/Table.h | 4 +-- test/select_tests.cpp | 57 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/parser/bison_parser.y b/src/parser/bison_parser.y index 0d98897..4752638 100755 --- a/src/parser/bison_parser.y +++ b/src/parser/bison_parser.y @@ -993,9 +993,11 @@ join_clause: opt_join_type: INNER { $$ = kJoinInner; } - | OUTER { $$ = kJoinOuter; } - | LEFT OUTER { $$ = kJoinLeftOuter; } - | RIGHT OUTER { $$ = kJoinRightOuter; } + | FULL OUTER { $$ = kJoinFull; } + | LEFT OUTER { $$ = kJoinLeft; } + | RIGHT OUTER { $$ = kJoinRight; } + | OUTER { $$ = kJoinFull; } + | FULL { $$ = kJoinFull; } | LEFT { $$ = kJoinLeft; } | RIGHT { $$ = kJoinRight; } | CROSS { $$ = kJoinCross; } diff --git a/src/sql/Table.h b/src/sql/Table.h index f6257ee..459943e 100755 --- a/src/sql/Table.h +++ b/src/sql/Table.h @@ -49,11 +49,9 @@ namespace hsql { // Possible types of joins. enum JoinType { kJoinInner, - kJoinOuter, + kJoinFull, kJoinLeft, kJoinRight, - kJoinLeftOuter, - kJoinRightOuter, kJoinCross, kJoinNatural }; diff --git a/test/select_tests.cpp b/test/select_tests.cpp index 3197a31..5a921ed 100644 --- a/test/select_tests.cpp +++ b/test/select_tests.cpp @@ -298,7 +298,7 @@ TEST(SelectJoin) { const TableRef* table = stmt->fromTable; const JoinDefinition* outer_join = table->join; ASSERT_EQ(table->type, kTableJoin); - ASSERT_EQ(outer_join->type, kJoinOuter); + ASSERT_EQ(outer_join->type, kJoinFull); ASSERT_EQ(outer_join->right->type, kTableName); ASSERT_STREQ(outer_join->right->name, "Product"); @@ -347,3 +347,58 @@ TEST(SelectColumnOrder) { ASSERT_STREQ(stmt->fromTable->list->at(2)->alias, "c"); ASSERT_STREQ(stmt->fromTable->list->at(3)->alias, "d"); } + + +TEST(JoinTypes) { + SelectStatement* stmt; + SQLParserResult result; + + SQLParser::parse("SELECT * FROM x join y on a=b; \ + SELECT * FROM x inner join y on a=b; \ + SELECT * FROM x left join y on a=b; \ + SELECT * FROM x left outer join y on a=b; \ + SELECT * FROM x right join y on a=b; \ + SELECT * FROM x right outer join y on a=b; \ + SELECT * FROM x full join y on a=b; \ + SELECT * FROM x outer join y on a=b; \ + SELECT * FROM x full outer join y on a=b; \ + SELECT * FROM x natural join y; \ + SELECT * FROM x cross join y on a=b; \ + SELECT * FROM x, y where a = b;", &result); + + stmt = (SelectStatement*) result.getStatement(0); + ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); + + stmt = (SelectStatement*) result.getStatement(1); + ASSERT_EQ(stmt->fromTable->join->type, kJoinInner); + + stmt = (SelectStatement*) result.getStatement(2); + ASSERT_EQ(stmt->fromTable->join->type, kJoinLeft); + + stmt = (SelectStatement*) result.getStatement(3); + ASSERT_EQ(stmt->fromTable->join->type, kJoinLeft); + + stmt = (SelectStatement*) result.getStatement(4); + ASSERT_EQ(stmt->fromTable->join->type, kJoinRight); + + stmt = (SelectStatement*) result.getStatement(5); + ASSERT_EQ(stmt->fromTable->join->type, kJoinRight); + + stmt = (SelectStatement*) result.getStatement(6); + ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); + + stmt = (SelectStatement*) result.getStatement(7); + ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); + + stmt = (SelectStatement*) result.getStatement(8); + ASSERT_EQ(stmt->fromTable->join->type, kJoinFull); + + stmt = (SelectStatement*) result.getStatement(9); + ASSERT_EQ(stmt->fromTable->join->type, kJoinNatural); + + stmt = (SelectStatement*) result.getStatement(10); + ASSERT_EQ(stmt->fromTable->join->type, kJoinCross); + + stmt = (SelectStatement*) result.getStatement(11); + ASSERT_NULL(stmt->fromTable->join); +}