work on settings (set and show), perf improvement when adding row into table
This commit is contained in:
37
usql.cpp
37
usql.cpp
@@ -25,6 +25,8 @@ std::unique_ptr<Table> USql::execute(Node &node) {
|
||||
return execute_create_table(static_cast<CreateTableNode &>(node));
|
||||
case NodeType::create_table_as_select:
|
||||
return execute_create_table_as_table(static_cast<CreateTableAsSelectNode &>(node));
|
||||
case NodeType::drop_table:
|
||||
return execute_drop(static_cast<DropTableNode &>(node));
|
||||
case NodeType::insert_into:
|
||||
return execute_insert_into_table(static_cast<InsertIntoTableNode &>(node));
|
||||
case NodeType::select_from:
|
||||
@@ -37,8 +39,10 @@ std::unique_ptr<Table> USql::execute(Node &node) {
|
||||
return execute_load(static_cast<LoadIntoTableNode &>(node));
|
||||
case NodeType::save_table:
|
||||
return execute_save(static_cast<SaveTableNode &>(node));
|
||||
case NodeType::drop_table:
|
||||
return execute_drop(static_cast<DropTableNode &>(node));
|
||||
case NodeType::set:
|
||||
return execute_set(static_cast<SetNode &>(node));
|
||||
case NodeType::show:
|
||||
return execute_show(static_cast<ShowNode &>(node));
|
||||
default:
|
||||
return create_stmt_result_table(-1, "unknown statement", 0);
|
||||
}
|
||||
@@ -68,7 +72,7 @@ std::unique_ptr<Table> USql::execute_create_table_as_table(CreateTableAsSelectNo
|
||||
// must be here, if rows are put into new_table, they are lost during m_tables.push_table
|
||||
Table *table = find_table(node.table_name);
|
||||
for( Row& orig_row : select->m_rows) {
|
||||
table->add_copy_of_row(orig_row);
|
||||
table->commit_copy_of_row(orig_row);
|
||||
}
|
||||
|
||||
select.release(); // is it correct? hoping not to release select table here and then when releasing CreateTableAsSelectNode
|
||||
@@ -121,6 +125,16 @@ std::unique_ptr<Table> USql::execute_drop(DropTableNode &node) {
|
||||
throw Exception("table not found (" + node.table_name + ")");
|
||||
}
|
||||
|
||||
std::unique_ptr<Table> USql::execute_set(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(ShowNode &node) {
|
||||
std::string value = Settings::get_setting(node.name);
|
||||
return create_stmt_result_table(0, "show succeeded: " + value, 1);
|
||||
}
|
||||
|
||||
std::unique_ptr<Table> USql::execute_insert_into_table(InsertIntoTableNode &node) {
|
||||
// TODO check column names.size = values.size
|
||||
|
||||
@@ -128,7 +142,7 @@ std::unique_ptr<Table> USql::execute_insert_into_table(InsertIntoTableNode &node
|
||||
Table *table_def = find_table(node.table_name);
|
||||
|
||||
// prepare empty new_row
|
||||
Row new_row = table_def->create_empty_row();
|
||||
Row& new_row = table_def->create_empty_row();
|
||||
|
||||
// copy values
|
||||
for (size_t i = 0; i < node.cols_names.size(); i++) {
|
||||
@@ -139,7 +153,7 @@ std::unique_ptr<Table> USql::execute_insert_into_table(InsertIntoTableNode &node
|
||||
}
|
||||
|
||||
// append new_row
|
||||
table_def->add_row(new_row);
|
||||
table_def->commit_row(new_row);
|
||||
|
||||
return create_stmt_result_table(0, "insert succeeded", 1);
|
||||
}
|
||||
@@ -175,10 +189,9 @@ std::unique_ptr<Table> USql::execute_select(SelectFromTableNode &node) {
|
||||
for (auto row = begin(table->m_rows); row != end(table->m_rows); ++row) {
|
||||
// eval where for row
|
||||
if (eval_where(node.where.get(), table, *row)) {
|
||||
// prepare empty row
|
||||
Row new_row = result->create_empty_row();
|
||||
// prepare empty row and copy column values
|
||||
Row& new_row = result->create_empty_row();
|
||||
|
||||
// copy column values
|
||||
for (auto idx = 0; idx < result->columns_count(); idx++) {
|
||||
auto row_col_index = source_table_col_index[idx];
|
||||
|
||||
@@ -194,7 +207,7 @@ std::unique_ptr<Table> USql::execute_select(SelectFromTableNode &node) {
|
||||
}
|
||||
|
||||
// add row to result
|
||||
result->m_rows.push_back(new_row);
|
||||
result->commit_row(new_row);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -317,7 +330,7 @@ std::unique_ptr<Table> USql::execute_update(UpdateTableNode &node) {
|
||||
|
||||
|
||||
bool USql::eval_where(Node *where, Table *table, Row &row) {
|
||||
switch (where->node_type) { // no where clause
|
||||
switch (where->node_type) {
|
||||
case NodeType::true_node:
|
||||
return true;
|
||||
case NodeType::relational_operator: // just one condition
|
||||
@@ -544,11 +557,11 @@ std::unique_ptr<Table> USql::create_stmt_result_table(long code, const std::stri
|
||||
|
||||
auto table_def = std::make_unique<Table>("result", result_tbl_col_defs);
|
||||
|
||||
Row new_row = table_def->create_empty_row();
|
||||
Row& new_row = table_def->create_empty_row();
|
||||
new_row.setIntColumnValue(0, code);
|
||||
new_row.setStringColumnValue(1, text);
|
||||
new_row.setIntColumnValue(2, affected_rows);
|
||||
table_def->add_row(new_row);
|
||||
table_def->commit_row(new_row);
|
||||
|
||||
return std::move(table_def);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user