diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 625067d..68f4084 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -10,13 +10,12 @@ }, "includePath": [ "${workspaceFolder}/**", - "${workspaceFolder}/stdlib", "/usr/local/opt/openssl/include", "${workspaceFolder}" ], "defines": [], "macFrameworkPath": [ - "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks" + "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath": "/usr/bin/clang", "cStandard": "c11", diff --git a/Readme.md b/Readme.md index 971ac34..4cfde06 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,6 @@ +### WIP +compare in row.cpp shoud take into account m_visible + ### TODO - create local_install.sh @@ -14,7 +17,6 @@ - add drop m_index - support for joining -- use string_to_double and string_to_long (from Table) everywhere - add const wherever should be - use static methods where posible - use references where pointer cannot be nullptr diff --git a/main.cpp b/main.cpp index 36fa181..d09309c 100644 --- a/main.cpp +++ b/main.cpp @@ -117,7 +117,7 @@ void repl() { result->print(); code += input + "\n"; - } catch (std::exception &e) { + } catch (const std::exception &e) { std::cerr << e.what() << std::endl; } } diff --git a/settings.cpp b/settings.cpp index ca36be8..f884af9 100644 --- a/settings.cpp +++ b/settings.cpp @@ -19,7 +19,7 @@ std::vector> Settings::m_settings = long Settings::string_to_long(const std::string &intstr) { try { return std::stol(intstr); - } catch (std::invalid_argument &e) { + } catch (const std::invalid_argument &e) { throw Exception("error parsing as integer: " + intstr); } } diff --git a/table.cpp b/table.cpp index aa92412..f04e18b 100644 --- a/table.cpp +++ b/table.cpp @@ -183,7 +183,7 @@ void Table::commit_row(Row &row) { try { validate_row(row); index_row(row); - } catch (Exception &e) { + } catch (const Exception &e) { throw e; } } @@ -250,9 +250,9 @@ void Table::create_index(const Index& index) { bool Table::drop_index(const std::string &index_name) { auto it = std::find_if(m_indexes.begin(), m_indexes.end(), - [&index_name](const Index &idx) { - return idx.get_index_name() == index_name; - }); + [&index_name](const Index &idx) { + return idx.get_index_name() == index_name; + }); if (it != m_indexes.end()) { m_indexes.erase(it); @@ -317,24 +317,25 @@ void Table::index_rows(const std::string &index_name) { Index * Table::get_index(const std::string &index_name) { auto it = std::find_if(m_indexes.begin(), m_indexes.end(), - [&index_name](const Index &idx) { - return idx.get_index_name() == index_name; - }); + [&index_name](const Index &idx) { + return idx.get_index_name() == index_name; + }); return (it != m_indexes.end()) ? &(*it) : nullptr; } Index * Table::get_index_for_column(const std::string &col_name) { auto it = std::find_if(m_indexes.begin(), m_indexes.end(), - [&col_name](const Index &idx) { - return idx.get_column_name() == col_name; - }); + [&col_name](const Index &idx) { + return idx.get_column_name() == col_name; + }); return (it != m_indexes.end()) ? &(*it) : nullptr; } -bool Table::empty() { +bool Table::empty() const { if (m_rows.empty()) return true; + for (const auto & r : m_rows) if (r.is_visible()) return false; diff --git a/table.h b/table.h index 736de59..706558d 100644 --- a/table.h +++ b/table.h @@ -36,8 +36,8 @@ struct Table { void print(); - std::string m_name; - std::vector m_col_defs; + std::string m_name; + std::vector m_col_defs; std::vector m_rows; std::vector m_indexes; @@ -59,7 +59,7 @@ struct Table { Index * get_index(const std::string &index_name); Index * get_index_for_column(const std::string &col_name); - bool empty(); + bool empty() const; struct rows_scanner { explicit rows_scanner(Table *tbl) : m_use_rowids(false), m_table(tbl), m_fscan_itr(tbl->m_rows.begin()) {} @@ -72,7 +72,7 @@ struct Table { Table * m_table; std::vector::iterator m_fscan_itr; std::vector m_rowids; - size_t m_rowids_idx{}; + size_t m_rowids_idx{}; }; }; diff --git a/usql.cpp b/usql.cpp index dc901fe..3835007 100644 --- a/usql.cpp +++ b/usql.cpp @@ -11,7 +11,7 @@ std::unique_ptr USql::execute(const std::string &command) { std::unique_ptr node = m_parser.parse(command); return execute(*node); - } catch (std::exception &e) { + } catch (const std::exception &e) { return create_stmt_result_table(-1, e.what(), 0); } diff --git a/usql.h b/usql.h index 1e13978..17a9ee3 100644 --- a/usql.h +++ b/usql.h @@ -84,10 +84,10 @@ private: static std::unique_ptr count_function(ColValue *agg_func_value, const std::vector> &evaluatedPars); static void select_row(SelectFromTableNode &where_node, - Table *src_table, Row *src_row, - Table *rslt_table, - const std::vector &rslt_tbl_col_defs, const std::vector &src_table_col_index, - bool is_aggregated) ; + Table *src_table, Row *src_row, + Table *rslt_table, + const std::vector &rslt_tbl_col_defs, const std::vector &src_table_col_index, + bool is_aggregated); std::pair> probe_index_scan(const Node *where, Table *table) const; std::pair> look_for_usable_index(const Node *where, Table *table) const; diff --git a/usql_dml.cpp b/usql_dml.cpp index 0e810fe..791aad3 100644 --- a/usql_dml.cpp +++ b/usql_dml.cpp @@ -4,8 +4,9 @@ #include -namespace usql { +namespace usql { + std::pair> USql::probe_index_scan(const Node *where, Table *table) const { bool indexscan_possible = normalize_where(where); @@ -85,28 +86,28 @@ void USql::select_row(SelectFromTableNode &where_node, const std::vector &src_table_col_index, bool is_aggregated) { - Row *rslt_row = nullptr; + Row *rslt_row = nullptr; // when aggregate functions in rslt_table only one row exists - if (is_aggregated && !rslt_table->empty()) - rslt_row = &rslt_table->m_rows[0]; - else - rslt_row = &rslt_table->create_empty_row(); + if (is_aggregated && !rslt_table->empty()) + rslt_row = &rslt_table->m_rows[0]; + else + rslt_row = &rslt_table->create_empty_row(); - for (auto idx = 0; idx < rslt_table->columns_count(); idx++) { - auto src_table_col_idx = src_table_col_index[idx]; + for (auto idx = 0; idx < rslt_table->columns_count(); idx++) { + auto src_table_col_idx = src_table_col_index[idx]; - if (src_table_col_idx == FUNCTION_CALL) { - auto evaluated_value = eval_value_node(src_table, *src_row, where_node.cols_names->operator[](idx).value.get(), - const_cast(&rslt_tbl_col_defs[idx]), &rslt_row->operator[](idx)); - ValueNode *col_value = evaluated_value.get(); + if (src_table_col_idx == FUNCTION_CALL) { + auto evaluated_value = eval_value_node(src_table, *src_row, where_node.cols_names->operator[](idx).value.get(), + const_cast(&rslt_tbl_col_defs[idx]), &rslt_row->operator[](idx)); + ValueNode *col_value = evaluated_value.get(); - rslt_row->setColumnValue((ColDefNode *) &rslt_tbl_col_defs[idx], col_value); - } else { - ColValue &col_value = src_row->operator[](src_table_col_idx); - rslt_row->setColumnValue((ColDefNode *) &rslt_tbl_col_defs[idx], col_value); - } + rslt_row->setColumnValue((ColDefNode *) &rslt_tbl_col_defs[idx], col_value); + } else { + ColValue &col_value = src_row->operator[](src_table_col_idx); + rslt_row->setColumnValue((ColDefNode *) &rslt_tbl_col_defs[idx], col_value); } + } // for aggregate is validated more than needed rslt_table->commit_row(*rslt_row); diff --git a/usql_function.cpp b/usql_function.cpp index dba9ccc..deef75c 100644 --- a/usql_function.cpp +++ b/usql_function.cpp @@ -82,8 +82,7 @@ std::unique_ptr USql::pp_function(const std::vector(parsed_value->getStringValue()); } -std::unique_ptr -USql::max_function(const std::vector> &evaluatedPars, const ColDefNode *col_def_node, ColValue *agg_func_value) { +std::unique_ptr USql::max_function(const std::vector> &evaluatedPars, const ColDefNode *col_def_node, ColValue *agg_func_value) { if (col_def_node->type == ColumnType::integer_type || col_def_node->type == ColumnType::date_type) { if (!evaluatedPars[0]->isNull()) { auto val = evaluatedPars[0]->getIntegerValue();