Added boolean literal support (#103)
* Added boolean support * Made bool literals int vals With a flag indicating if they came from boolean literals. * Add makeLiteral(bool val);
This commit is contained in:
parent
a122effd46
commit
a59deb43c3
File diff suppressed because it is too large
Load Diff
|
@ -212,14 +212,16 @@ extern int hsql_debug;
|
||||||
SQL_DAY = 388,
|
SQL_DAY = 388,
|
||||||
SQL_MONTH = 389,
|
SQL_MONTH = 389,
|
||||||
SQL_YEAR = 390,
|
SQL_YEAR = 390,
|
||||||
SQL_EQUALS = 391,
|
SQL_TRUE = 391,
|
||||||
SQL_NOTEQUALS = 392,
|
SQL_FALSE = 392,
|
||||||
SQL_LESS = 393,
|
SQL_EQUALS = 393,
|
||||||
SQL_GREATER = 394,
|
SQL_NOTEQUALS = 394,
|
||||||
SQL_LESSEQ = 395,
|
SQL_LESS = 395,
|
||||||
SQL_GREATEREQ = 396,
|
SQL_GREATER = 396,
|
||||||
SQL_NOTNULL = 397,
|
SQL_LESSEQ = 397,
|
||||||
SQL_UMINUS = 398
|
SQL_GREATEREQ = 398,
|
||||||
|
SQL_NOTNULL = 399,
|
||||||
|
SQL_UMINUS = 400
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -270,7 +272,7 @@ union HSQL_STYPE
|
||||||
std::vector<hsql::Expr*>* expr_vec;
|
std::vector<hsql::Expr*>* expr_vec;
|
||||||
std::vector<hsql::OrderDescription*>* order_vec;
|
std::vector<hsql::OrderDescription*>* order_vec;
|
||||||
|
|
||||||
#line 274 "bison_parser.h" /* yacc.c:1919 */
|
#line 276 "bison_parser.h" /* yacc.c:1919 */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef union HSQL_STYPE HSQL_STYPE;
|
typedef union HSQL_STYPE HSQL_STYPE;
|
||||||
|
|
|
@ -175,6 +175,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha
|
||||||
%token VIEW WHEN WITH ADD ALL AND ASC CSV END FOR INT KEY
|
%token VIEW WHEN WITH ADD ALL AND ASC CSV END FOR INT KEY
|
||||||
%token NOT OFF SET TBL TOP AS BY IF IN IS OF ON OR TO
|
%token NOT OFF SET TBL TOP AS BY IF IN IS OF ON OR TO
|
||||||
%token ARRAY CONCAT ILIKE SECOND MINUTE HOUR DAY MONTH YEAR
|
%token ARRAY CONCAT ILIKE SECOND MINUTE HOUR DAY MONTH YEAR
|
||||||
|
%token TRUE FALSE
|
||||||
|
|
||||||
/*********************************
|
/*********************************
|
||||||
** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html)
|
** Non-Terminal types (http://www.gnu.org/software/bison/manual/html_node/Type-Decl.html)
|
||||||
|
@ -199,7 +200,7 @@ int yyerror(YYLTYPE* llocp, SQLParserResult* result, yyscan_t scanner, const cha
|
||||||
%type <table> join_clause table_ref_name_no_alias
|
%type <table> join_clause table_ref_name_no_alias
|
||||||
%type <expr> expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr extract_expr
|
%type <expr> expr operand scalar_expr unary_expr binary_expr logic_expr exists_expr extract_expr
|
||||||
%type <expr> function_expr between_expr expr_alias param_expr
|
%type <expr> function_expr between_expr expr_alias param_expr
|
||||||
%type <expr> column_name literal int_literal num_literal string_literal
|
%type <expr> column_name literal int_literal num_literal string_literal bool_literal
|
||||||
%type <expr> comp_expr opt_where join_condition opt_having case_expr case_list in_expr hint
|
%type <expr> comp_expr opt_where join_condition opt_having case_expr case_list in_expr hint
|
||||||
%type <expr> array_expr array_index null_literal
|
%type <expr> array_expr array_index null_literal
|
||||||
%type <limit> opt_limit opt_top
|
%type <limit> opt_limit opt_top
|
||||||
|
@ -888,6 +889,7 @@ column_name:
|
||||||
|
|
||||||
literal:
|
literal:
|
||||||
string_literal
|
string_literal
|
||||||
|
| bool_literal
|
||||||
| num_literal
|
| num_literal
|
||||||
| null_literal
|
| null_literal
|
||||||
| param_expr
|
| param_expr
|
||||||
|
@ -897,6 +899,10 @@ string_literal:
|
||||||
STRING { $$ = Expr::makeLiteral($1); }
|
STRING { $$ = Expr::makeLiteral($1); }
|
||||||
;
|
;
|
||||||
|
|
||||||
|
bool_literal:
|
||||||
|
TRUE { $$ = Expr::makeLiteral(true); }
|
||||||
|
| FALSE { $$ = Expr::makeLiteral(false); }
|
||||||
|
;
|
||||||
|
|
||||||
num_literal:
|
num_literal:
|
||||||
FLOATVAL { $$ = Expr::makeLiteral($1); }
|
FLOATVAL { $$ = Expr::makeLiteral($1); }
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -729,7 +729,7 @@ extern int yylex \
|
||||||
#undef yyTABLES_NAME
|
#undef yyTABLES_NAME
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#line 229 "flex_lexer.l"
|
#line 231 "flex_lexer.l"
|
||||||
|
|
||||||
|
|
||||||
#line 735 "flex_lexer.h"
|
#line 735 "flex_lexer.h"
|
||||||
|
|
|
@ -184,6 +184,8 @@ HOUR TOKEN(HOUR)
|
||||||
DAY TOKEN(DAY)
|
DAY TOKEN(DAY)
|
||||||
MONTH TOKEN(MONTH)
|
MONTH TOKEN(MONTH)
|
||||||
YEAR TOKEN(YEAR)
|
YEAR TOKEN(YEAR)
|
||||||
|
TRUE TOKEN(TRUE)
|
||||||
|
FALSE TOKEN(FALSE)
|
||||||
|
|
||||||
/* Allow =/== see https://sqlite.org/lang_expr.html#collateop */
|
/* Allow =/== see https://sqlite.org/lang_expr.html#collateop */
|
||||||
"==" TOKEN(EQUALS)
|
"==" TOKEN(EQUALS)
|
||||||
|
|
159
src/sql/Expr.cpp
159
src/sql/Expr.cpp
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
#include "Expr.h"
|
#include "Expr.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
@ -6,7 +5,7 @@
|
||||||
|
|
||||||
namespace hsql {
|
namespace hsql {
|
||||||
|
|
||||||
Expr::Expr(ExprType type)
|
Expr::Expr(ExprType type)
|
||||||
: type(type),
|
: type(type),
|
||||||
expr(nullptr),
|
expr(nullptr),
|
||||||
expr2(nullptr),
|
expr2(nullptr),
|
||||||
|
@ -19,10 +18,11 @@ namespace hsql {
|
||||||
ival(0),
|
ival(0),
|
||||||
ival2(0),
|
ival2(0),
|
||||||
datetimeField(kDatetimeNone),
|
datetimeField(kDatetimeNone),
|
||||||
|
isBoolLiteral(false),
|
||||||
opType(kOpNone),
|
opType(kOpNone),
|
||||||
distinct(false) {};
|
distinct(false){};
|
||||||
|
|
||||||
Expr::~Expr() {
|
Expr::~Expr() {
|
||||||
delete expr;
|
delete expr;
|
||||||
delete expr2;
|
delete expr2;
|
||||||
delete select;
|
delete select;
|
||||||
|
@ -31,35 +31,35 @@ namespace hsql {
|
||||||
free(alias);
|
free(alias);
|
||||||
|
|
||||||
if (exprList != nullptr) {
|
if (exprList != nullptr) {
|
||||||
for (Expr* e : *exprList) {
|
for (Expr* e : *exprList) {
|
||||||
delete e;
|
delete e;
|
||||||
}
|
}
|
||||||
delete exprList;
|
delete exprList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::make(ExprType type) {
|
Expr* Expr::make(ExprType type) {
|
||||||
Expr* e = new Expr(type);
|
Expr* e = new Expr(type);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) {
|
Expr* Expr::makeOpUnary(OperatorType op, Expr* expr) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = op;
|
e->opType = op;
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
e->expr2 = nullptr;
|
e->expr2 = nullptr;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2) {
|
Expr* Expr::makeOpBinary(Expr* expr1, OperatorType op, Expr* expr2) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = op;
|
e->opType = op;
|
||||||
e->expr = expr1;
|
e->expr = expr1;
|
||||||
e->expr2 = expr2;
|
e->expr2 = expr2;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeBetween(Expr* expr, Expr* left, Expr* right) {
|
Expr* Expr::makeBetween(Expr* expr, Expr* left, Expr* right) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
e->opType = kOpBetween;
|
e->opType = kOpBetween;
|
||||||
|
@ -67,32 +67,32 @@ namespace hsql {
|
||||||
e->exprList->push_back(left);
|
e->exprList->push_back(left);
|
||||||
e->exprList->push_back(right);
|
e->exprList->push_back(right);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeCaseList(Expr* caseListElement) {
|
Expr* Expr::makeCaseList(Expr* caseListElement) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
// Case list expressions are temporary and will be integrated into the case expressions exprList - thus assign
|
// Case list expressions are temporary and will be integrated into the case
|
||||||
// operator type kOpNone
|
// expressions exprList - thus assign operator type kOpNone
|
||||||
e->opType = kOpNone;
|
e->opType = kOpNone;
|
||||||
e->exprList = new std::vector<Expr*>();
|
e->exprList = new std::vector<Expr*>();
|
||||||
e->exprList->push_back(caseListElement);
|
e->exprList->push_back(caseListElement);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeCaseListElement(Expr* when, Expr* then) {
|
Expr* Expr::makeCaseListElement(Expr* when, Expr* then) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = kOpCaseListElement;
|
e->opType = kOpCaseListElement;
|
||||||
e->expr = when;
|
e->expr = when;
|
||||||
e->expr2 = then;
|
e->expr2 = then;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::caseListAppend(Expr* caseList, Expr* caseListElement) {
|
Expr* Expr::caseListAppend(Expr* caseList, Expr* caseListElement) {
|
||||||
caseList->exprList->push_back(caseListElement);
|
caseList->exprList->push_back(caseListElement);
|
||||||
return caseList;
|
return caseList;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeCase(Expr* expr, Expr* caseList, Expr* elseExpr) {
|
Expr* Expr::makeCase(Expr* expr, Expr* caseList, Expr* elseExpr) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = kOpCase;
|
e->opType = kOpCase;
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
|
@ -101,153 +101,154 @@ namespace hsql {
|
||||||
caseList->exprList = nullptr;
|
caseList->exprList = nullptr;
|
||||||
delete caseList;
|
delete caseList;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeLiteral(int64_t val) {
|
Expr* Expr::makeLiteral(int64_t val) {
|
||||||
Expr* e = new Expr(kExprLiteralInt);
|
Expr* e = new Expr(kExprLiteralInt);
|
||||||
e->ival = val;
|
e->ival = val;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeLiteral(double value) {
|
Expr* Expr::makeLiteral(double value) {
|
||||||
Expr* e = new Expr(kExprLiteralFloat);
|
Expr* e = new Expr(kExprLiteralFloat);
|
||||||
e->fval = value;
|
e->fval = value;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeLiteral(char* string) {
|
Expr* Expr::makeLiteral(char* string) {
|
||||||
Expr* e = new Expr(kExprLiteralString);
|
Expr* e = new Expr(kExprLiteralString);
|
||||||
e->name = string;
|
e->name = string;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeNullLiteral() {
|
Expr* Expr::makeLiteral(bool val) {
|
||||||
|
Expr* e = new Expr(kExprLiteralInt);
|
||||||
|
e->ival = (int)val;
|
||||||
|
e->isBoolLiteral = true;
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
Expr* Expr::makeNullLiteral() {
|
||||||
Expr* e = new Expr(kExprLiteralNull);
|
Expr* e = new Expr(kExprLiteralNull);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeColumnRef(char* name) {
|
Expr* Expr::makeColumnRef(char* name) {
|
||||||
Expr* e = new Expr(kExprColumnRef);
|
Expr* e = new Expr(kExprColumnRef);
|
||||||
e->name = name;
|
e->name = name;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeColumnRef(char* table, char* name) {
|
Expr* Expr::makeColumnRef(char* table, char* name) {
|
||||||
Expr* e = new Expr(kExprColumnRef);
|
Expr* e = new Expr(kExprColumnRef);
|
||||||
e->name = name;
|
e->name = name;
|
||||||
e->table = table;
|
e->table = table;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeStar(void) {
|
Expr* Expr::makeStar(void) {
|
||||||
Expr* e = new Expr(kExprStar);
|
Expr* e = new Expr(kExprStar);
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeStar(char* table) {
|
Expr* Expr::makeStar(char* table) {
|
||||||
Expr* e = new Expr(kExprStar);
|
Expr* e = new Expr(kExprStar);
|
||||||
e->table = table;
|
e->table = table;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeFunctionRef(char* func_name, std::vector<Expr*>* exprList,
|
Expr* Expr::makeFunctionRef(char* func_name, std::vector<Expr*>* exprList,
|
||||||
bool distinct) {
|
bool distinct) {
|
||||||
Expr* e = new Expr(kExprFunctionRef);
|
Expr* e = new Expr(kExprFunctionRef);
|
||||||
e->name = func_name;
|
e->name = func_name;
|
||||||
e->exprList = exprList;
|
e->exprList = exprList;
|
||||||
e->distinct = distinct;
|
e->distinct = distinct;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeArray(std::vector<Expr*>* exprList) {
|
Expr* Expr::makeArray(std::vector<Expr*>* exprList) {
|
||||||
Expr* e = new Expr(kExprArray);
|
Expr* e = new Expr(kExprArray);
|
||||||
e->exprList = exprList;
|
e->exprList = exprList;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeArrayIndex(Expr* expr, int64_t index) {
|
Expr* Expr::makeArrayIndex(Expr* expr, int64_t index) {
|
||||||
Expr* e = new Expr(kExprArrayIndex);
|
Expr* e = new Expr(kExprArrayIndex);
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
e->ival = index;
|
e->ival = index;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeParameter(int id) {
|
Expr* Expr::makeParameter(int id) {
|
||||||
Expr* e = new Expr(kExprParameter);
|
Expr* e = new Expr(kExprParameter);
|
||||||
e->ival = id;
|
e->ival = id;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeSelect(SelectStatement* select) {
|
Expr* Expr::makeSelect(SelectStatement* select) {
|
||||||
Expr* e = new Expr(kExprSelect);
|
Expr* e = new Expr(kExprSelect);
|
||||||
e->select = select;
|
e->select = select;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeExists(SelectStatement* select) {
|
Expr* Expr::makeExists(SelectStatement* select) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = kOpExists;
|
e->opType = kOpExists;
|
||||||
e->select = select;
|
e->select = select;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeInOperator(Expr* expr, std::vector<Expr*>* exprList) {
|
Expr* Expr::makeInOperator(Expr* expr, std::vector<Expr*>* exprList) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = kOpIn;
|
e->opType = kOpIn;
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
e->exprList = exprList;
|
e->exprList = exprList;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) {
|
Expr* Expr::makeInOperator(Expr* expr, SelectStatement* select) {
|
||||||
Expr* e = new Expr(kExprOperator);
|
Expr* e = new Expr(kExprOperator);
|
||||||
e->opType = kOpIn;
|
e->opType = kOpIn;
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
e->select = select;
|
e->select = select;
|
||||||
|
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
Expr* Expr::makeExtract(DatetimeField datetimeField, Expr* expr) {
|
Expr* Expr::makeExtract(DatetimeField datetimeField, Expr* expr) {
|
||||||
Expr* e = new Expr(kExprFunctionRef);
|
Expr* e = new Expr(kExprFunctionRef);
|
||||||
e->name = strdup("EXTRACT");
|
e->name = strdup("EXTRACT");
|
||||||
e->datetimeField = datetimeField;
|
e->datetimeField = datetimeField;
|
||||||
e->expr = expr;
|
e->expr = expr;
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Expr::isType(ExprType exprType) const {
|
bool Expr::isType(ExprType exprType) const { return exprType == type; }
|
||||||
return exprType == type;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Expr::isLiteral() const {
|
bool Expr::isLiteral() const {
|
||||||
return isType(kExprLiteralInt) || isType(kExprLiteralFloat) ||
|
return isType(kExprLiteralInt) || isType(kExprLiteralFloat) ||
|
||||||
isType(kExprLiteralString) || isType(kExprParameter) ||
|
isType(kExprLiteralString) || isType(kExprParameter) ||
|
||||||
isType(kExprLiteralNull);
|
isType(kExprLiteralNull);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Expr::hasAlias() const {
|
bool Expr::hasAlias() const { return alias != nullptr; }
|
||||||
return alias != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Expr::hasTable() const {
|
bool Expr::hasTable() const { return table != nullptr; }
|
||||||
return table != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* Expr::getName() const {
|
const char* Expr::getName() const {
|
||||||
if (alias != nullptr)
|
if (alias != nullptr)
|
||||||
return alias;
|
return alias;
|
||||||
else
|
else
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
char* substr(const char* source, int from, int to) {
|
char* substr(const char* source, int from, int to) {
|
||||||
int len = to - from;
|
int len = to - from;
|
||||||
char* copy = (char*)malloc(len + 1);
|
char* copy = (char*)malloc(len + 1);
|
||||||
;
|
;
|
||||||
strncpy(copy, source + from, len);
|
strncpy(copy, source + from, len);
|
||||||
copy[len] = '\0';
|
copy[len] = '\0';
|
||||||
return copy;
|
return copy;
|
||||||
}
|
}
|
||||||
} // namespace hsql
|
} // namespace hsql
|
||||||
|
|
|
@ -6,13 +6,13 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace hsql {
|
namespace hsql {
|
||||||
struct SelectStatement;
|
struct SelectStatement;
|
||||||
|
|
||||||
// Helper function used by the lexer.
|
// Helper function used by the lexer.
|
||||||
// TODO: move to more appropriate place.
|
// TODO: move to more appropriate place.
|
||||||
char* substr(const char* source, int from, int to);
|
char* substr(const char* source, int from, int to);
|
||||||
|
|
||||||
enum ExprType {
|
enum ExprType {
|
||||||
kExprLiteralFloat,
|
kExprLiteralFloat,
|
||||||
kExprLiteralString,
|
kExprLiteralString,
|
||||||
kExprLiteralInt,
|
kExprLiteralInt,
|
||||||
|
@ -27,10 +27,10 @@ namespace hsql {
|
||||||
kExprArray,
|
kExprArray,
|
||||||
kExprArrayIndex,
|
kExprArrayIndex,
|
||||||
kExprDatetimeField
|
kExprDatetimeField
|
||||||
};
|
};
|
||||||
|
|
||||||
// Operator types. These are important for expressions of type kExprOperator.
|
// Operator types. These are important for expressions of type kExprOperator.
|
||||||
enum OperatorType {
|
enum OperatorType {
|
||||||
kOpNone,
|
kOpNone,
|
||||||
|
|
||||||
// Ternary operator
|
// Ternary operator
|
||||||
|
@ -38,7 +38,7 @@ namespace hsql {
|
||||||
|
|
||||||
// n-nary special case
|
// n-nary special case
|
||||||
kOpCase,
|
kOpCase,
|
||||||
kOpCaseListElement, // `WHEN expr THEN expr`
|
kOpCaseListElement, // `WHEN expr THEN expr`
|
||||||
|
|
||||||
// Binary operators.
|
// Binary operators.
|
||||||
kOpPlus,
|
kOpPlus,
|
||||||
|
@ -67,9 +67,9 @@ namespace hsql {
|
||||||
kOpUnaryMinus,
|
kOpUnaryMinus,
|
||||||
kOpIsNull,
|
kOpIsNull,
|
||||||
kOpExists
|
kOpExists
|
||||||
};
|
};
|
||||||
|
|
||||||
enum DatetimeField {
|
enum DatetimeField {
|
||||||
kDatetimeNone,
|
kDatetimeNone,
|
||||||
kDatetimeSecond,
|
kDatetimeSecond,
|
||||||
kDatetimeMinute,
|
kDatetimeMinute,
|
||||||
|
@ -77,14 +77,14 @@ namespace hsql {
|
||||||
kDatetimeDay,
|
kDatetimeDay,
|
||||||
kDatetimeMonth,
|
kDatetimeMonth,
|
||||||
kDatetimeYear,
|
kDatetimeYear,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct Expr Expr;
|
typedef struct Expr Expr;
|
||||||
|
|
||||||
// Represents SQL expressions (i.e. literals, operators, column_refs).
|
// Represents SQL expressions (i.e. literals, operators, column_refs).
|
||||||
// TODO: When destructing a placeholder expression, we might need to alter the
|
// TODO: When destructing a placeholder expression, we might need to alter the
|
||||||
// placeholder_list.
|
// placeholder_list.
|
||||||
struct Expr {
|
struct Expr {
|
||||||
Expr(ExprType type);
|
Expr(ExprType type);
|
||||||
virtual ~Expr();
|
virtual ~Expr();
|
||||||
|
|
||||||
|
@ -102,6 +102,7 @@ namespace hsql {
|
||||||
int64_t ival;
|
int64_t ival;
|
||||||
int64_t ival2;
|
int64_t ival2;
|
||||||
DatetimeField datetimeField;
|
DatetimeField datetimeField;
|
||||||
|
bool isBoolLiteral;
|
||||||
|
|
||||||
OperatorType opType;
|
OperatorType opType;
|
||||||
bool distinct;
|
bool distinct;
|
||||||
|
@ -142,6 +143,8 @@ namespace hsql {
|
||||||
|
|
||||||
static Expr* makeLiteral(char* val);
|
static Expr* makeLiteral(char* val);
|
||||||
|
|
||||||
|
static Expr* makeLiteral(bool val);
|
||||||
|
|
||||||
static Expr* makeNullLiteral();
|
static Expr* makeNullLiteral();
|
||||||
|
|
||||||
static Expr* makeColumnRef(char* name);
|
static Expr* makeColumnRef(char* name);
|
||||||
|
@ -170,7 +173,7 @@ namespace hsql {
|
||||||
static Expr* makeInOperator(Expr* expr, SelectStatement* select);
|
static Expr* makeInOperator(Expr* expr, SelectStatement* select);
|
||||||
|
|
||||||
static Expr* makeExtract(DatetimeField datetimeField1, Expr* expr);
|
static Expr* makeExtract(DatetimeField datetimeField1, Expr* expr);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Zero initializes an Expr object and assigns it to a space in the heap
|
// Zero initializes an Expr object and assigns it to a space in the heap
|
||||||
// For Hyrise we still had to put in the explicit NULL constructor
|
// For Hyrise we still had to put in the explicit NULL constructor
|
||||||
|
|
|
@ -428,19 +428,24 @@ TEST(Operators) {
|
||||||
SQLParserResult result;
|
SQLParserResult result;
|
||||||
|
|
||||||
SQLParser::parse("SELECT * FROM foo where a = 1; \
|
SQLParser::parse("SELECT * FROM foo where a = 1; \
|
||||||
SELECT * FROM foo where a == 1; \
|
SELECT * FROM foo where a == 2; \
|
||||||
SELECT * FROM foo where a != 1; \
|
SELECT * FROM foo where a != 1; \
|
||||||
SELECT * FROM foo where a <> 1; \
|
SELECT * FROM foo where a <> 1; \
|
||||||
SELECT * FROM foo where a > 1; \
|
SELECT * FROM foo where a > 1; \
|
||||||
SELECT * FROM foo where a < 1; \
|
SELECT * FROM foo where a < 1; \
|
||||||
SELECT * FROM foo where a >= 1; \
|
SELECT * FROM foo where a >= 1; \
|
||||||
SELECT * FROM foo where a <= 1;", &result);
|
SELECT * FROM foo where a <= 1; \
|
||||||
|
SELECT * FROM foo where a = TRUE; \
|
||||||
|
SELECT * FROM foo where a = false;", &result);
|
||||||
|
|
||||||
stmt = (SelectStatement*) result.getStatement(0);
|
stmt = (SelectStatement*) result.getStatement(0);
|
||||||
ASSERT_EQ(stmt->whereClause->opType, kOpEquals);
|
ASSERT_EQ(stmt->whereClause->opType, kOpEquals);
|
||||||
|
ASSERT_EQ(stmt->whereClause->expr2->ival, 1);
|
||||||
|
ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, false);
|
||||||
|
|
||||||
stmt = (SelectStatement*) result.getStatement(1);
|
stmt = (SelectStatement*) result.getStatement(1);
|
||||||
ASSERT_EQ(stmt->whereClause->opType, kOpEquals);
|
ASSERT_EQ(stmt->whereClause->opType, kOpEquals);
|
||||||
|
ASSERT_EQ(stmt->whereClause->expr2->ival, 2);
|
||||||
|
|
||||||
stmt = (SelectStatement*) result.getStatement(2);
|
stmt = (SelectStatement*) result.getStatement(2);
|
||||||
ASSERT_EQ(stmt->whereClause->opType, kOpNotEquals);
|
ASSERT_EQ(stmt->whereClause->opType, kOpNotEquals);
|
||||||
|
@ -459,6 +464,16 @@ TEST(Operators) {
|
||||||
|
|
||||||
stmt = (SelectStatement*) result.getStatement(7);
|
stmt = (SelectStatement*) result.getStatement(7);
|
||||||
ASSERT_EQ(stmt->whereClause->opType, kOpLessEq);
|
ASSERT_EQ(stmt->whereClause->opType, kOpLessEq);
|
||||||
|
|
||||||
|
stmt = (SelectStatement*) result.getStatement(8);
|
||||||
|
ASSERT_EQ(stmt->whereClause->opType, kOpEquals);
|
||||||
|
ASSERT_EQ(stmt->whereClause->expr2->ival, 1);
|
||||||
|
ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, true);
|
||||||
|
|
||||||
|
stmt = (SelectStatement*) result.getStatement(9);
|
||||||
|
ASSERT_EQ(stmt->whereClause->opType, kOpEquals);
|
||||||
|
ASSERT_EQ(stmt->whereClause->expr2->ival, 0);
|
||||||
|
ASSERT_EQ(stmt->whereClause->expr2->isBoolLiteral, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(JoinTypes) {
|
TEST(JoinTypes) {
|
||||||
|
|
Loading…
Reference in New Issue