relational operators added

This commit is contained in:
VaclavT 2021-07-08 07:43:10 +02:00
parent 199a5f9e12
commit e44b72ce53
4 changed files with 38 additions and 15 deletions

View File

@ -205,12 +205,19 @@ bool Executor::evalRelationalOperator(const RelationalOperatorNode &filter, Tabl
}
if (filter.op == RelationalOperatorType::greater) {
return comparator > 0.0;
}
if (filter.op == RelationalOperatorType::equal) {
return comparator == 0.0;
switch (filter.op) {
case RelationalOperatorType::equal:
return comparator == 0.0;
case RelationalOperatorType::not_equal:
return comparator != 0.0;
case RelationalOperatorType::greater:
return comparator > 0.0;
case RelationalOperatorType::greater_equal:
return comparator >= 0.0;
case RelationalOperatorType::lesser:
return comparator < 0.0;
case RelationalOperatorType::lesser_equal:
return comparator <= 0.0;
}
throw Exception("invalid relational operator");

View File

@ -19,7 +19,8 @@ int main(int argc, char *argv[]) {
"insert into a (i, s) values(4, 'four')",
"select i, s from a where i > 2",
"select i, s from a where i = 1",
"select i, s from a where s = 'two'"
"select i, s from a where s = 'two'",
"select i, s from a where i <= 3"
// "update a set s = 'three' where i = 3"
// "delete from a where i = 3"
// "select i, s from a where i > 0"

View File

@ -170,7 +170,7 @@ std::unique_ptr<Node> Parser::parse_operand_node() {
case TokenType::identifier:
return std::make_unique<DatabaseValueNode>(tokenString);
default: ;
// Throw exception
throw Exception("Unknown operand node");
}
}
@ -179,9 +179,17 @@ RelationalOperatorType Parser::parse_operator() {
switch (op.type) {
case TokenType::equal:
return RelationalOperatorType::equal;
case TokenType::not_equal:
return RelationalOperatorType::not_equal;
case TokenType::greater:
return RelationalOperatorType::greater;
case TokenType::greater_equal:
return RelationalOperatorType::greater_equal;
case TokenType::lesser:
return RelationalOperatorType::lesser;
case TokenType::lesser_equal:
return RelationalOperatorType::lesser_equal;
default: ;
// Throw exception
throw Exception("Unknown relational operator");
}
}

View File

@ -91,19 +91,26 @@ struct DatabaseValueNode : Node {
DatabaseValueNode(std::string name) : Node(NodeType::database_value), col_name(name) {}
};
enum class LogicalOperatorType {
and_operator,
or_operator,
not_operator
};
struct LogicalOperatorNode : Node {
// and_operator,
// or_operator,
// not_operator,
// and / or / not
LogicalOperatorType op;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
};
enum class RelationalOperatorType {
equal,
greater
// =, !=, >, >=, <, <=, like
greater,
greater_equal,
lesser,
lesser_equal,
not_equal
// like
};
struct RelationalOperatorNode : Node {