min,max function better data type
This commit is contained in:
parent
3abc9184e1
commit
ccd759a8b9
1
usql.h
1
usql.h
|
|
@ -48,6 +48,7 @@ private:
|
||||||
|
|
||||||
static std::unique_ptr<Table> create_stmt_result_table(long code, const std::string &text, size_t affected_rows);
|
static std::unique_ptr<Table> create_stmt_result_table(long code, const std::string &text, size_t affected_rows);
|
||||||
static std::tuple<int, ColDefNode> get_column_definition(Table *table, SelectColNode *select_col_node, int col_order);
|
static std::tuple<int, ColDefNode> get_column_definition(Table *table, SelectColNode *select_col_node, int col_order);
|
||||||
|
static ColDefNode get_db_column_definition(Table *table, Node *node);
|
||||||
static std::tuple<int, ColDefNode> get_node_definition(Table *table, Node *select_col_node, const std::string & col_name, int col_order);
|
static std::tuple<int, ColDefNode> get_node_definition(Table *table, Node *select_col_node, const std::string & col_name, int col_order);
|
||||||
Table *find_table(const std::string &name);
|
Table *find_table(const std::string &name);
|
||||||
|
|
||||||
|
|
|
||||||
26
usql_dml.cpp
26
usql_dml.cpp
|
|
@ -148,11 +148,18 @@ std::tuple<int, ColDefNode> USql::get_column_definition(Table *table, SelectColN
|
||||||
return get_node_definition(table, select_col_node->value.get(), select_col_node->name, col_order );
|
return get_node_definition(table, select_col_node->value.get(), select_col_node->name, col_order );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ColDefNode USql::get_db_column_definition(Table *table, Node *node) {
|
||||||
|
if (node->node_type == NodeType::database_value) {
|
||||||
|
auto db_node = static_cast<DatabaseValueNode *>(node);
|
||||||
|
return table->get_column_def(db_node->col_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw Exception("Undefined table node - get_db_column_definition");
|
||||||
|
}
|
||||||
|
|
||||||
std::tuple<int, ColDefNode> USql::get_node_definition(Table *table, Node * node, const std::string & col_name, int col_order ) {
|
std::tuple<int, ColDefNode> USql::get_node_definition(Table *table, Node * node, const std::string & col_name, int col_order ) {
|
||||||
if (node->node_type == NodeType::database_value) {
|
if (node->node_type == NodeType::database_value) {
|
||||||
auto dbval_node = static_cast<DatabaseValueNode *>(node);
|
ColDefNode src_col_def = get_db_column_definition(table, node);
|
||||||
|
|
||||||
ColDefNode src_col_def = table->get_column_def(dbval_node->col_name);
|
|
||||||
ColDefNode col_def = ColDefNode{col_name, src_col_def.type, col_order, src_col_def.length, src_col_def.null};
|
ColDefNode col_def = ColDefNode{col_name, src_col_def.type, col_order, src_col_def.length, src_col_def.null};
|
||||||
return std::make_tuple(src_col_def.order, col_def);
|
return std::make_tuple(src_col_def.order, col_def);
|
||||||
|
|
||||||
|
|
@ -169,12 +176,19 @@ std::tuple<int, ColDefNode> USql::get_node_definition(Table *table, Node * node,
|
||||||
ColDefNode col_def = ColDefNode{col_name, ColumnType::varchar_type, col_order, 10, true};
|
ColDefNode col_def = ColDefNode{col_name, ColumnType::varchar_type, col_order, 10, true};
|
||||||
return std::make_tuple(-1, col_def);
|
return std::make_tuple(-1, col_def);
|
||||||
} else if (func_node->function == "lower" || func_node->function == "upper") {
|
} else if (func_node->function == "lower" || func_node->function == "upper") {
|
||||||
// TODO get length
|
// TODO get length, use get_db_column_definition
|
||||||
ColDefNode col_def = ColDefNode{col_name, ColumnType::varchar_type, col_order, 256, true};
|
ColDefNode col_def = ColDefNode{col_name, ColumnType::varchar_type, col_order, 256, true};
|
||||||
return std::make_tuple(-1, col_def);
|
return std::make_tuple(-1, col_def);
|
||||||
} else if (func_node->function == "min" || func_node->function == "max") {
|
} else if (func_node->function == "min" || func_node->function == "max") {
|
||||||
// TODO get correct type and length
|
auto col_type= ColumnType::float_type;
|
||||||
ColDefNode col_def = ColDefNode{col_name, ColumnType::integer_type, col_order, 1, true};
|
int col_len = 1;
|
||||||
|
auto & v = func_node->params[0];
|
||||||
|
if (v->node_type == NodeType::database_value) {
|
||||||
|
ColDefNode src_col_def = get_db_column_definition(table, v.get());
|
||||||
|
col_type = src_col_def.type;
|
||||||
|
col_len = src_col_def.length;
|
||||||
|
}
|
||||||
|
ColDefNode col_def = ColDefNode{col_name, col_type, col_order, col_len, true};
|
||||||
return std::make_tuple(-1, col_def);
|
return std::make_tuple(-1, col_def);
|
||||||
} else if (func_node->function == "count") {
|
} else if (func_node->function == "count") {
|
||||||
ColDefNode col_def = ColDefNode{col_name, ColumnType::integer_type, col_order, 1, true};
|
ColDefNode col_def = ColDefNode{col_name, ColumnType::integer_type, col_order, 1, true};
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue