better table print, order by/offset/limit improvements
This commit is contained in:
39
parser.cpp
39
parser.cpp
@@ -235,12 +235,12 @@ namespace usql {
|
||||
|
||||
std::unique_ptr<Node> where_node = parse_where_clause();
|
||||
|
||||
std::vector<ColOrderNode> orderby_node = parse_orderby_clause();
|
||||
std::vector<ColOrderNode> orderby_node = parse_order_by_clause();
|
||||
|
||||
// if (m_lexer.tokenType() == TokenType::keyword_offset) {}
|
||||
// if (m_lexer.tokenType() == TokenType::keyword_limit) {}
|
||||
OffsetLimitNode offsetlimit_node = parse_offset_limit_clause();
|
||||
|
||||
return std::make_unique<SelectFromTableNode>(table_name, std::move(cols), std::move(where_node), orderby_node);
|
||||
|
||||
return std::make_unique<SelectFromTableNode>(table_name, std::move(cols), std::move(where_node), orderby_node, offsetlimit_node);
|
||||
}
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_delete_from_table() {
|
||||
@@ -312,7 +312,7 @@ namespace usql {
|
||||
}
|
||||
|
||||
|
||||
std::vector<ColOrderNode> Parser::parse_orderby_clause() {
|
||||
std::vector<ColOrderNode> Parser::parse_order_by_clause() {
|
||||
std::vector<ColOrderNode> order_cols;
|
||||
|
||||
if (m_lexer.tokenType() == TokenType::keyword_order) {
|
||||
@@ -330,7 +330,7 @@ namespace usql {
|
||||
col_index = std::stoi(tokenString);
|
||||
break;
|
||||
default:
|
||||
throw Exception("column index alloved in order by clause at this moment");
|
||||
throw Exception("column index allowed in order by clause at this moment");
|
||||
}
|
||||
|
||||
if (m_lexer.tokenType() == TokenType::keyword_asc) {
|
||||
@@ -344,12 +344,37 @@ namespace usql {
|
||||
|
||||
m_lexer.skipTokenOptional(TokenType::comma);
|
||||
|
||||
} while (m_lexer.tokenType() != TokenType::eof); // && m_lexer.tokenType() != TokenType::keyword_offset && m_lexer.tokenType() != TokenType::keyword_limit);
|
||||
} while (m_lexer.tokenType() != TokenType::eof && m_lexer.tokenType() != TokenType::keyword_offset && m_lexer.tokenType() != TokenType::keyword_limit);
|
||||
}
|
||||
|
||||
return order_cols;
|
||||
}
|
||||
|
||||
OffsetLimitNode Parser::parse_offset_limit_clause() {
|
||||
int offset = 0;
|
||||
int limit = 999999999;
|
||||
|
||||
if (m_lexer.tokenType() == TokenType::keyword_offset) {
|
||||
m_lexer.skipToken(TokenType::keyword_offset);
|
||||
|
||||
if (m_lexer.tokenType() != TokenType::int_number)
|
||||
throw Exception("expecting integer in offset clause");
|
||||
|
||||
offset = std::stoi(m_lexer.consumeCurrentToken().token_string);
|
||||
}
|
||||
|
||||
if (m_lexer.tokenType() == TokenType::keyword_limit) {
|
||||
m_lexer.skipToken(TokenType::keyword_limit);
|
||||
|
||||
if (m_lexer.tokenType() != TokenType::int_number)
|
||||
throw Exception("expecting integer in limit clause");
|
||||
|
||||
limit = std::stoi(m_lexer.consumeCurrentToken().token_string);
|
||||
}
|
||||
|
||||
return OffsetLimitNode{offset, limit};
|
||||
}
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_relational_expression() {
|
||||
auto left = parse_operand_node();
|
||||
auto operation = parse_relational_operator();
|
||||
|
||||
Reference in New Issue
Block a user