Compare commits
4 Commits
48a5d70cc4
...
1aa5fe3002
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1aa5fe3002 | ||
|
|
8f60b11c25 | ||
|
|
316bd953f4 | ||
|
|
41bdeeda89 |
@@ -385,19 +385,18 @@ namespace usql {
|
||||
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_where_clause() {
|
||||
if (m_lexer.tokenType() != TokenType::keyword_where) {
|
||||
return std::make_unique<TrueNode>();
|
||||
}
|
||||
if (m_lexer.tokenType() != TokenType::keyword_where) {
|
||||
return std::make_unique<TrueNode>();
|
||||
}
|
||||
|
||||
m_lexer.skipToken(TokenType::keyword_where);
|
||||
m_lexer.skipToken(TokenType::keyword_where);
|
||||
|
||||
std::unique_ptr<Node> left = parse_expression();
|
||||
do {
|
||||
left = parse_expression(std::move(left));
|
||||
|
||||
} while (m_lexer.tokenType() != TokenType::eof && m_lexer.tokenType() != TokenType::keyword_order && m_lexer.tokenType() != TokenType::keyword_offset && m_lexer.tokenType() != TokenType::keyword_limit);
|
||||
std::unique_ptr<Node> left = parse_expression();
|
||||
do {
|
||||
left = parse_expression(std::move(left));
|
||||
} while (m_lexer.tokenType() != TokenType::eof && m_lexer.tokenType() != TokenType::keyword_order && m_lexer.tokenType() != TokenType::keyword_offset && m_lexer.tokenType() != TokenType::keyword_limit && m_lexer.tokenType() != TokenType::semicolon);
|
||||
|
||||
return left;
|
||||
return left;
|
||||
}
|
||||
|
||||
std::unique_ptr<Node> Parser::parse_expression() {
|
||||
|
||||
@@ -175,9 +175,6 @@ struct FunctionNode : Node {
|
||||
};
|
||||
|
||||
|
||||
Type function;
|
||||
std::vector<std::unique_ptr<Node>> params;
|
||||
|
||||
FunctionNode(std::string func_name, std::vector<std::unique_ptr<Node>> pars) :
|
||||
Node(NodeType::function), function(get_function(func_name)), params(std::move(pars)) {}
|
||||
|
||||
@@ -199,6 +196,9 @@ struct FunctionNode : Node {
|
||||
}
|
||||
std::cout << ")" << std::endl;
|
||||
}
|
||||
|
||||
Type function;
|
||||
std::vector<std::unique_ptr<Node>> params;
|
||||
};
|
||||
|
||||
struct TrueNode : Node {
|
||||
@@ -581,7 +581,6 @@ struct CreateIndexNode : Node {
|
||||
};
|
||||
|
||||
class Parser {
|
||||
private:
|
||||
public:
|
||||
Parser();
|
||||
|
||||
|
||||
@@ -171,7 +171,7 @@ public:
|
||||
case 5:
|
||||
return (ColValue &) *std::get_if<ColBooleanValue>(&m_columns[i]);
|
||||
default:
|
||||
throw Exception("should not happen");
|
||||
throw Exception("ColValue &operator[](int i), type index invalid :" + std::to_string(type_index));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,9 +6,36 @@
|
||||
|
||||
namespace usql {
|
||||
|
||||
USql::USql() {
|
||||
// create catalogue tables first
|
||||
|
||||
std::vector<std::string> k_debug_sql_commands {
|
||||
"create table usql_tables(name varchar(32) not null, modified boolean not null)",
|
||||
"create table usql_columns(table_name varchar(32) not null, column_name varchar(32) not null, column_type varchar(16) not null, column_length integer not null, nullable boolean not null, column_order integer not null)"
|
||||
};
|
||||
|
||||
// create cataloque tables
|
||||
for (const auto &command : k_debug_sql_commands) {
|
||||
std::unique_ptr<Node> create_table_node = m_parser.parse(command);
|
||||
const CreateTableNode &node = static_cast<CreateTableNode &>(*create_table_node);
|
||||
|
||||
Table table{node.table_name, node.cols_defs};
|
||||
m_tables.push_back(table);
|
||||
|
||||
}
|
||||
// insert data into cataloque tables
|
||||
for (const auto &command : k_debug_sql_commands) {
|
||||
std::unique_ptr<Node> create_table_node = m_parser.parse(command);
|
||||
const CreateTableNode &node = static_cast<CreateTableNode &>(*create_table_node);
|
||||
|
||||
execute_create_table_sys_catalogue(node);
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<Table> USql::execute(const std::string &command) {
|
||||
try {
|
||||
std::unique_ptr<Node> node = m_parser.parse(command);
|
||||
// node->dump();
|
||||
return execute(*node);
|
||||
|
||||
} catch (const std::exception &e) {
|
||||
|
||||
14
usql/usql.h
14
usql/usql.h
@@ -11,16 +11,16 @@
|
||||
namespace usql {
|
||||
|
||||
class USql {
|
||||
|
||||
|
||||
public:
|
||||
USql() = default;
|
||||
|
||||
USql();
|
||||
std::unique_ptr<Table> execute(const std::string &command);
|
||||
|
||||
private:
|
||||
std::unique_ptr<Table> execute(Node &node);
|
||||
|
||||
std::unique_ptr<Table> execute_create_table(const CreateTableNode &node);
|
||||
bool execute_create_table_sys_catalogue(const CreateTableNode &node);
|
||||
std::unique_ptr<Table> execute_create_index(const CreateIndexNode &node);
|
||||
std::unique_ptr<Table> execute_create_table_as_table(const CreateTableAsSelectNode &node);
|
||||
std::unique_ptr<Table> execute_load(const LoadIntoTableNode &node);
|
||||
@@ -59,9 +59,6 @@ private:
|
||||
void check_index_not_exists(const std::string &index_name);
|
||||
|
||||
private:
|
||||
Parser m_parser;
|
||||
std::list<Table> m_tables;
|
||||
|
||||
static void execute_distinct(SelectFromTableNode &node, Table *result);
|
||||
static void execute_order_by(SelectFromTableNode &node, Table *result);
|
||||
static void execute_offset_limit(OffsetLimitNode &node, Table *result);
|
||||
@@ -97,6 +94,11 @@ private:
|
||||
bool normalize_where(const Node *node) const;
|
||||
|
||||
Table::rows_scanner get_iterator(Table *table, const Node *where) const;
|
||||
|
||||
|
||||
private:
|
||||
Parser m_parser;
|
||||
std::list<Table> m_tables;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -15,10 +15,35 @@ std::unique_ptr<Table> USql::execute_create_table(const CreateTableNode &node) {
|
||||
Table table{node.table_name, node.cols_defs};
|
||||
m_tables.push_back(table);
|
||||
|
||||
execute_create_table_sys_catalogue(node);
|
||||
|
||||
return create_stmt_result_table(0, "table created", 0);
|
||||
}
|
||||
|
||||
|
||||
bool USql::execute_create_table_sys_catalogue(const CreateTableNode &node) {
|
||||
// usql_tables
|
||||
auto r = execute("insert into usql_tables(name, modified) values('" + node.table_name + "', false)");
|
||||
|
||||
// usql_columns
|
||||
for(const ColDefNode & col_def : node.cols_defs) {
|
||||
std::string i {"insert into usql_columns(table_name, column_name, column_type, column_length, nullable, column_order) values("};
|
||||
i += "'" + node.table_name + "', ";
|
||||
i += "'" + col_def.name + "', ";
|
||||
i += "'" + column_type_name(col_def.type) + "', ";
|
||||
i += std::to_string(col_def.length) + ", ";
|
||||
i += (col_def.null ? "true, " : "false, ");
|
||||
i += std::to_string(col_def.order);
|
||||
i += ")";
|
||||
|
||||
auto r = execute(i);
|
||||
// r->print();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
std::unique_ptr<Table> USql::execute_create_index(const CreateIndexNode &node) {
|
||||
Table *table_def = find_table(node.table_name); // throws exception if not found
|
||||
ColDefNode col_def = table_def->get_column_def(node.column_name); // throws exception if not found
|
||||
@@ -57,7 +82,6 @@ std::unique_ptr<Table> USql::execute_create_table_as_table(const CreateTableAsSe
|
||||
}
|
||||
|
||||
|
||||
|
||||
std::unique_ptr<Table> USql::execute_drop(const DropTableNode &node) {
|
||||
auto name_cmp = [node](const Table& t) { return t.m_name == node.table_name; };
|
||||
|
||||
@@ -70,11 +94,13 @@ std::unique_ptr<Table> USql::execute_drop(const DropTableNode &node) {
|
||||
throw Exception("table not found (" + node.table_name + ")");
|
||||
}
|
||||
|
||||
|
||||
std::unique_ptr<Table> USql::execute_set(const SetNode &node) {
|
||||
Settings::set_setting(node.name, node.value);
|
||||
return create_stmt_result_table(0, "set succeeded", 1);
|
||||
}
|
||||
|
||||
|
||||
std::unique_ptr<Table> USql::execute_show(const ShowNode &node) {
|
||||
std::string value = Settings::get_setting(node.name);
|
||||
return create_stmt_result_table(0, "show succeeded: " + value, 1);
|
||||
|
||||
@@ -155,8 +155,7 @@ void USql::setup_order_columns(std::vector<ColOrderNode> &node, Table *table) {
|
||||
void USql::execute_distinct(SelectFromTableNode &node, Table *result) {
|
||||
if (!node.distinct) return;
|
||||
|
||||
auto compare_rows = [](const Row &a, const Row &b) { return a.compare(b) >= 0; };
|
||||
std::sort(result->m_rows.begin(), result->m_rows.end(), compare_rows);
|
||||
std::sort(result->m_rows.begin(), result->m_rows.end(), [](const Row &a, const Row &b) { return a.compare(b) > 0; });
|
||||
|
||||
result->m_rows.erase(std::unique(result->m_rows.begin(), result->m_rows.end()), result->m_rows.end());
|
||||
}
|
||||
|
||||
@@ -55,29 +55,6 @@
|
||||
<key>name</key>
|
||||
<string>meta.function.lisp</string>
|
||||
</dict>
|
||||
<!-- <dict>
|
||||
<key>match</key>
|
||||
<string>(?<=\s)(?i:&allow-other-keys|&aux|&body|&environment|&key|&optional|&rest|&whole)(?=\s+)</string>
|
||||
<key>name</key>
|
||||
<string>meta.function-parameters.lisp</string>
|
||||
</dict> -->
|
||||
<!-- <dict>
|
||||
<key>captures</key>
|
||||
<dict>
|
||||
<key>1</key>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>storage.type.function-type.lisp</string>
|
||||
</dict>
|
||||
<key>2</key>
|
||||
<dict>
|
||||
<key>name</key>
|
||||
<string>entity.name.type.lisp</string>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>match</key>
|
||||
<string>(?:\()((?i:deftype|defstruct|define-condition|defpackage|defclass))\s+((?:\w|[+\-<>/*&=.?!$%:@\[\]^{}~#|])+)</string>
|
||||
</dict> -->
|
||||
<dict>
|
||||
<key>captures</key>
|
||||
<dict>
|
||||
|
||||
@@ -19,8 +19,8 @@ mv ./ml /usr/local/bin/ml
|
||||
echo ""
|
||||
echo "if syntax has changed you may use"
|
||||
echo "cp utils/Lisp.tmLanguage ~/.vscode/extensions/mattn.lisp-0.1.12/syntaxes/"
|
||||
# echo "or"
|
||||
# echo "cp utils/Lisp.tmLanguage ~/.local/share/code-server/extensions/mattn.lisp-0.1.11/syntaxes/Lisp.tmLanguage"
|
||||
echo "or"
|
||||
echo "cp utils/Lisp.tmLanguage ~/.local/share/code-server/extensions/mattn.lisp-0.1.11/syntaxes/Lisp.tmLanguage"
|
||||
echo ""
|
||||
|
||||
ml -v
|
||||
|
||||
Reference in New Issue
Block a user