added join types and algorithms
This commit is contained in:
parent
f8d56c2a54
commit
070ea2de28
|
@ -2,9 +2,12 @@
|
||||||
#define __TABLEREF_H__
|
#define __TABLEREF_H__
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
namespace hsql {
|
namespace hsql {
|
||||||
|
|
||||||
class SelectStatement;
|
struct SelectStatement;
|
||||||
|
struct JoinDefinition;
|
||||||
|
struct TableRef;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TableRef
|
* TableRef
|
||||||
|
@ -18,16 +21,8 @@ typedef enum {
|
||||||
} TableRefType;
|
} TableRefType;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
kJoinInner,
|
|
||||||
kJoinOuter,
|
|
||||||
kJoinLeft,
|
|
||||||
kJoinRight
|
|
||||||
} JoinType;
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct TableRef TableRef;
|
|
||||||
|
|
||||||
struct TableRef {
|
struct TableRef {
|
||||||
TableRef(TableRefType type) :
|
TableRef(TableRefType type) :
|
||||||
type(type),
|
type(type),
|
||||||
|
@ -36,9 +31,7 @@ struct TableRef {
|
||||||
alias(NULL),
|
alias(NULL),
|
||||||
select(NULL),
|
select(NULL),
|
||||||
list(NULL),
|
list(NULL),
|
||||||
left(NULL),
|
join(NULL) {}
|
||||||
right(NULL),
|
|
||||||
join_condition(NULL) {}
|
|
||||||
|
|
||||||
virtual ~TableRef(); // defined in destructors.cpp
|
virtual ~TableRef(); // defined in destructors.cpp
|
||||||
|
|
||||||
|
@ -50,12 +43,7 @@ struct TableRef {
|
||||||
|
|
||||||
SelectStatement* select;
|
SelectStatement* select;
|
||||||
List<TableRef*>* list;
|
List<TableRef*>* list;
|
||||||
|
JoinDefinition* join;
|
||||||
// Join members
|
|
||||||
TableRef* left;
|
|
||||||
TableRef* right;
|
|
||||||
JoinType join_type;
|
|
||||||
Expr* join_condition;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -70,6 +58,49 @@ struct TableRef {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} // namespace hsql
|
/**
|
||||||
|
* Following are definitions needed to specify join tables
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
kJoinInner,
|
||||||
|
kJoinOuter,
|
||||||
|
kJoinLeft,
|
||||||
|
kJoinRight,
|
||||||
|
} JoinType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifying a join algorithm is not standard.
|
||||||
|
* This is specific to Hyrise.
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
kJoinAlgoScan,
|
||||||
|
kJoinAlgoHash,
|
||||||
|
kJoinAlgoRadix
|
||||||
|
} JoinAlgorithm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Definition of a join table
|
||||||
|
*/
|
||||||
|
struct JoinDefinition {
|
||||||
|
JoinDefinition() :
|
||||||
|
left(NULL),
|
||||||
|
right(NULL),
|
||||||
|
condition(NULL),
|
||||||
|
type(kJoinInner),
|
||||||
|
algorithm(kJoinAlgoScan) {}
|
||||||
|
|
||||||
|
virtual ~JoinDefinition(); // defined in destructors.cpp
|
||||||
|
|
||||||
|
TableRef* left;
|
||||||
|
TableRef* right;
|
||||||
|
Expr* condition;
|
||||||
|
|
||||||
|
JoinType type;
|
||||||
|
JoinAlgorithm algorithm;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace hsql
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -12,16 +12,6 @@ StatementList::~StatementList() {
|
||||||
delete parser_msg;
|
delete parser_msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
TableRef::~TableRef() {
|
|
||||||
delete name;
|
|
||||||
delete alias;
|
|
||||||
delete select;
|
|
||||||
delete list;
|
|
||||||
delete left;
|
|
||||||
delete right;
|
|
||||||
delete join_condition;
|
|
||||||
}
|
|
||||||
|
|
||||||
SelectStatement::~SelectStatement() {
|
SelectStatement::~SelectStatement() {
|
||||||
delete from_table;
|
delete from_table;
|
||||||
delete select_list;
|
delete select_list;
|
||||||
|
@ -31,10 +21,6 @@ SelectStatement::~SelectStatement() {
|
||||||
delete limit;
|
delete limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
OrderDescription::~OrderDescription() {
|
|
||||||
delete expr;
|
|
||||||
}
|
|
||||||
|
|
||||||
ImportStatement::~ImportStatement() {
|
ImportStatement::~ImportStatement() {
|
||||||
delete file_path;
|
delete file_path;
|
||||||
delete table_name;
|
delete table_name;
|
||||||
|
@ -45,4 +31,21 @@ CreateStatement::~CreateStatement() {
|
||||||
delete table_name;
|
delete table_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OrderDescription::~OrderDescription() {
|
||||||
|
delete expr;
|
||||||
|
}
|
||||||
|
|
||||||
|
TableRef::~TableRef() {
|
||||||
|
delete name;
|
||||||
|
delete alias;
|
||||||
|
delete select;
|
||||||
|
delete list;
|
||||||
|
}
|
||||||
|
|
||||||
|
JoinDefinition::~JoinDefinition() {
|
||||||
|
delete left;
|
||||||
|
delete right;
|
||||||
|
delete condition;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace hsql
|
} // namespace hsql
|
|
@ -27,11 +27,11 @@ void printTableRefInfo(TableRef* table, uint num_indent) {
|
||||||
case kTableJoin:
|
case kTableJoin:
|
||||||
inprint("Join Table", num_indent);
|
inprint("Join Table", num_indent);
|
||||||
inprint("Left", num_indent+1);
|
inprint("Left", num_indent+1);
|
||||||
printTableRefInfo(table->left, num_indent+2);
|
printTableRefInfo(table->join->left, num_indent+2);
|
||||||
inprint("Right", num_indent+1);
|
inprint("Right", num_indent+1);
|
||||||
printTableRefInfo(table->right, num_indent+2);
|
printTableRefInfo(table->join->right, num_indent+2);
|
||||||
inprint("Join Condition", num_indent+1);
|
inprint("Join Condition", num_indent+1);
|
||||||
printExpression(table->join_condition, num_indent+2);
|
printExpression(table->join->condition, num_indent+2);
|
||||||
break;
|
break;
|
||||||
case kTableCrossProduct:
|
case kTableCrossProduct:
|
||||||
for (TableRef* tbl : table->list->vector()) printTableRefInfo(tbl, num_indent);
|
for (TableRef* tbl : table->list->vector()) printTableRefInfo(tbl, num_indent);
|
||||||
|
|
|
@ -109,9 +109,10 @@ typedef void* yyscan_t;
|
||||||
%token DATABASE DISTINCT BETWEEN CONTROL NATURAL COLUMN
|
%token DATABASE DISTINCT BETWEEN CONTROL NATURAL COLUMN
|
||||||
%token CREATE DELETE EXISTS HAVING IMPORT INSERT ISNULL
|
%token CREATE DELETE EXISTS HAVING IMPORT INSERT ISNULL
|
||||||
%token OFFSET RENAME SELECT UNLOAD UPDATE ALTER CROSS GROUP
|
%token OFFSET RENAME SELECT UNLOAD UPDATE ALTER CROSS GROUP
|
||||||
%token INDEX INNER LIMIT ORDER OUTER RIGHT TABLE UNION USING
|
%token INDEX INNER LIMIT ORDER OUTER RADIX RIGHT TABLE UNION
|
||||||
%token WHERE DESC DROP FILE FROM INTO JOIN LEFT LIKE LOAD
|
%token USING WHERE DESC DROP FILE FROM HASH INTO JOIN LEFT
|
||||||
%token NULL ALL AND ASC CSV NOT TBL TOP AS BY IF IN IS ON OR
|
%token LIKE LOAD NULL SCAN ALL AND ASC CSV NOT TBL TOP AS BY
|
||||||
|
%token IF IN IS ON OR
|
||||||
|
|
||||||
|
|
||||||
/*********************************
|
/*********************************
|
||||||
|
@ -134,8 +135,7 @@ typedef void* yyscan_t;
|
||||||
%type <order> opt_order
|
%type <order> opt_order
|
||||||
%type <limit> opt_limit
|
%type <limit> opt_limit
|
||||||
%type <order_type> opt_order_type
|
%type <order_type> opt_order_type
|
||||||
%type <uval> import_file_type
|
%type <uval> import_file_type opt_join_type opt_join_algorithm
|
||||||
|
|
||||||
|
|
||||||
/******************************
|
/******************************
|
||||||
** Token Precedence and Associativity
|
** Token Precedence and Associativity
|
||||||
|
@ -466,16 +466,33 @@ opt_alias:
|
||||||
******************************/
|
******************************/
|
||||||
|
|
||||||
join_clause:
|
join_clause:
|
||||||
join_table JOIN join_table ON join_condition
|
join_table opt_join_algorithm opt_join_type JOIN join_table ON join_condition
|
||||||
{
|
{
|
||||||
$$ = new TableRef(kTableJoin);
|
$$ = new TableRef(kTableJoin);
|
||||||
$$->left = $1;
|
$$->join = new JoinDefinition();
|
||||||
$$->right = $3;
|
$$->join->type = (JoinType) $2;
|
||||||
$$->join_condition = $5;
|
$$->join->algorithm = (JoinAlgorithm) $3;
|
||||||
$$->join_type = kJoinInner;
|
$$->join->left = $1;
|
||||||
|
$$->join->right = $5;
|
||||||
|
$$->join->condition = $7;
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
opt_join_type:
|
||||||
|
INNER { $$ = kJoinInner; }
|
||||||
|
| OUTER { $$ = kJoinOuter; }
|
||||||
|
| LEFT { $$ = kJoinLeft; }
|
||||||
|
| RIGHT { $$ = kJoinRight; }
|
||||||
|
| /* empty, default */ { $$ = kJoinInner; }
|
||||||
|
;
|
||||||
|
|
||||||
|
opt_join_algorithm:
|
||||||
|
SCAN { $$ = kJoinAlgoScan; }
|
||||||
|
| HASH { $$ = kJoinAlgoHash; }
|
||||||
|
| RADIX { $$ = kJoinAlgoRadix; }
|
||||||
|
| /* empty, default */ { $$ = kJoinAlgoScan; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
join_table:
|
join_table:
|
||||||
'(' select_statement ')' alias {
|
'(' select_statement ')' alias {
|
||||||
|
|
|
@ -83,6 +83,7 @@ INNER TOKEN(INNER)
|
||||||
LIMIT TOKEN(LIMIT)
|
LIMIT TOKEN(LIMIT)
|
||||||
ORDER TOKEN(ORDER)
|
ORDER TOKEN(ORDER)
|
||||||
OUTER TOKEN(OUTER)
|
OUTER TOKEN(OUTER)
|
||||||
|
RADIX TOKEN(RADIX)
|
||||||
RIGHT TOKEN(RIGHT)
|
RIGHT TOKEN(RIGHT)
|
||||||
TABLE TOKEN(TABLE)
|
TABLE TOKEN(TABLE)
|
||||||
UNION TOKEN(UNION)
|
UNION TOKEN(UNION)
|
||||||
|
@ -92,12 +93,14 @@ DESC TOKEN(DESC)
|
||||||
DROP TOKEN(DROP)
|
DROP TOKEN(DROP)
|
||||||
FILE TOKEN(FILE)
|
FILE TOKEN(FILE)
|
||||||
FROM TOKEN(FROM)
|
FROM TOKEN(FROM)
|
||||||
|
HASH TOKEN(HASH)
|
||||||
INTO TOKEN(INTO)
|
INTO TOKEN(INTO)
|
||||||
JOIN TOKEN(JOIN)
|
JOIN TOKEN(JOIN)
|
||||||
LEFT TOKEN(LEFT)
|
LEFT TOKEN(LEFT)
|
||||||
LIKE TOKEN(LIKE)
|
LIKE TOKEN(LIKE)
|
||||||
LOAD TOKEN(LOAD)
|
LOAD TOKEN(LOAD)
|
||||||
NULL TOKEN(NULL)
|
NULL TOKEN(NULL)
|
||||||
|
SCAN TOKEN(SCAN)
|
||||||
ALL TOKEN(ALL)
|
ALL TOKEN(ALL)
|
||||||
AND TOKEN(AND)
|
AND TOKEN(AND)
|
||||||
ASC TOKEN(ASC)
|
ASC TOKEN(ASC)
|
||||||
|
|
|
@ -27,6 +27,9 @@ RIGHT
|
||||||
CROSS
|
CROSS
|
||||||
USING
|
USING
|
||||||
NATURAL
|
NATURAL
|
||||||
|
HASH
|
||||||
|
RADIX
|
||||||
|
SCAN
|
||||||
|
|
||||||
// Create statement
|
// Create statement
|
||||||
CREATE
|
CREATE
|
||||||
|
|
|
@ -4,11 +4,13 @@ SELECT a FROM foo WHERE a > 12 OR b > 3 AND NOT c LIMIT 10
|
||||||
SELECT col1 AS myname, col2, 'test' FROM "table", foo AS t WHERE age > 12 AND zipcode = 12345 GROUP BY col1;
|
SELECT col1 AS myname, col2, 'test' FROM "table", foo AS t WHERE age > 12 AND zipcode = 12345 GROUP BY col1;
|
||||||
SELECT * from "table" JOIN table2 ON a = b WHERE (b OR NOT a) AND a = 12.5
|
SELECT * from "table" JOIN table2 ON a = b WHERE (b OR NOT a) AND a = 12.5
|
||||||
(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c NOT LIKE 's%' LIMIT 10);
|
(SELECT a FROM foo WHERE a > 12 OR b > 3 AND c NOT LIKE 's%' LIMIT 10);
|
||||||
SELECT t1.a, t1.b, t2.c FROM "table" AS t1 JOIN (SELECT * FROM foo JOIN bar ON foo.id = bar.id) t2 ON t1.a = t2.b WHERE (t1.b OR NOT t1.a) AND t2.c = 12.5
|
|
||||||
SELECT * FROM "table" LIMIT 10 OFFSET 10;
|
SELECT * FROM "table" LIMIT 10 OFFSET 10;
|
||||||
SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY col1;
|
SELECT * FROM t1 UNION SELECT * FROM t2 ORDER BY col1;
|
||||||
SELECT * FROM t1 UNION (SELECT * FROM t2) ORDER BY col1;
|
SELECT * FROM t1 UNION (SELECT * FROM t2) ORDER BY col1;
|
||||||
SELECT * FROM t1 UNION (SELECT * FROM t2 UNION SELECT * FROM t3) ORDER BY col1;
|
SELECT * FROM t1 UNION (SELECT * FROM t2 UNION SELECT * FROM t3) ORDER BY col1;
|
||||||
|
# JOIN
|
||||||
|
SELECT t1.a, t1.b, t2.c FROM "table" AS t1 JOIN (SELECT * FROM foo JOIN bar ON foo.id = bar.id) t2 ON t1.a = t2.b WHERE (t1.b OR NOT t1.a) AND t2.c = 12.5
|
||||||
|
SELECT * FROM t1 HASH JOIN t2 ON c1 = c2;
|
||||||
# CREATE statement
|
# CREATE statement
|
||||||
CREATE TABLE "table" FROM TBL FILE 'students.tbl'
|
CREATE TABLE "table" FROM TBL FILE 'students.tbl'
|
||||||
CREATE TABLE IF NOT EXISTS "table" FROM TBL FILE 'students.tbl'
|
CREATE TABLE IF NOT EXISTS "table" FROM TBL FILE 'students.tbl'
|
||||||
|
|
Loading…
Reference in New Issue