work on settings (set and show), perf improvement when adding row into table

This commit is contained in:
2021-08-09 14:15:42 +02:00
parent 474b789d12
commit 710531c455
13 changed files with 124 additions and 49 deletions

View File

@@ -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);
}