added returning token for insert query
This commit is contained in:
@@ -4,18 +4,21 @@
|
||||
#include "matador/query/query_data.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
fetchable_query query_values_intermediate::returning(const table_column &col) {
|
||||
context_->parts.push_back(std::make_unique<internal::query_returning_part>(std::vector{col}));
|
||||
return {context_};
|
||||
}
|
||||
|
||||
executable_query query_into_intermediate::values(const std::initializer_list<std::variant<utils::placeholder, utils::database_type>> values)
|
||||
{
|
||||
query_values_intermediate query_into_intermediate::values(const std::initializer_list<std::variant<utils::placeholder, utils::database_type>> values) {
|
||||
return this->values(std::vector(values));
|
||||
}
|
||||
|
||||
executable_query query_into_intermediate::values(std::vector<std::variant<utils::placeholder, utils::database_type>> &&values) {
|
||||
query_values_intermediate query_into_intermediate::values(std::vector<std::variant<utils::placeholder, utils::database_type>> &&values) {
|
||||
context_->parts.push_back(std::make_unique<internal::query_values_part>(std::move(values)));
|
||||
return {context_};
|
||||
}
|
||||
|
||||
executable_query query_into_intermediate::values(std::vector<utils::placeholder>&& values) {
|
||||
query_values_intermediate query_into_intermediate::values(std::vector<utils::placeholder>&& values) {
|
||||
std::vector<std::variant<utils::placeholder, utils::database_type>> transformed_values;
|
||||
transformed_values.reserve(values.size());
|
||||
for (auto&& val : values) {
|
||||
@@ -24,7 +27,7 @@ executable_query query_into_intermediate::values(std::vector<utils::placeholder>
|
||||
return this->values(std::move(transformed_values));
|
||||
}
|
||||
|
||||
executable_query query_into_intermediate::values(std::vector<utils::database_type>&& values) {
|
||||
query_values_intermediate query_into_intermediate::values(std::vector<utils::database_type>&& values) {
|
||||
std::vector<std::variant<utils::placeholder, utils::database_type>> transformed_values;
|
||||
transformed_values.reserve(values.size());
|
||||
for (auto&& val : values) {
|
||||
|
||||
@@ -311,6 +311,19 @@ void query_values_part::accept(query_part_visitor &visitor) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
query_returning_part::query_returning_part(std::vector<table_column> columns)
|
||||
: query_part(sql::dialect_token::Returning)
|
||||
, columns_(std::move(columns)) {
|
||||
}
|
||||
|
||||
const std::vector<table_column> & query_returning_part::columns() const {
|
||||
return columns_;
|
||||
}
|
||||
|
||||
void query_returning_part::accept(query_part_visitor &visitor) {
|
||||
visitor.visit(*this);
|
||||
}
|
||||
|
||||
query_update_part::query_update_part(class table tab)
|
||||
: query_part(sql::dialect_token::Update)
|
||||
, table_(std::move(tab)) {
|
||||
|
||||
@@ -36,16 +36,10 @@ sql::query_context query_builder::compile(const query_data &data,
|
||||
return {query_};
|
||||
}
|
||||
|
||||
std::string handle_column(sql::query_context &ctx, const sql::dialect *d, const table_column &col) {
|
||||
if (col.is_function()) {
|
||||
ctx.prototype.emplace_back(col.has_alias() ? col.alias() : col.canonical_name());
|
||||
ctx.prototype.back().change_type(utils::basic_type::Int32);
|
||||
} else {
|
||||
ctx.prototype.emplace_back(col.has_alias() ? col.alias() : col.canonical_name());
|
||||
}
|
||||
|
||||
return prepare_identifier(*d, col);
|
||||
}
|
||||
void build_columns_with_name_only(std::string &out, const std::vector<table_column> &cols, const sql::dialect &d);
|
||||
void build_columns(std::string &out, const std::vector<table_column> &cols, const sql::dialect &d);
|
||||
void build_fetchable_columns(sql::query_context &ctx, const std::vector<table_column> &cols, const sql::dialect &d);
|
||||
void prepare_prototype(std::vector<object::attribute> &prototype, const table_column &col);
|
||||
|
||||
void query_builder::visit(internal::query_alter_part& part) {
|
||||
query_.sql = dialect_->token_at(part.token());
|
||||
@@ -61,9 +55,6 @@ void query_builder::visit(internal::query_add_key_constraint_part& part) {
|
||||
query_.sql += " " + dialect_->add_constraint() + " " + part.name();
|
||||
}
|
||||
|
||||
void build_columns_with_name_only(std::string &out, const std::vector<table_column> &cols, const sql::dialect &d);
|
||||
void build_columns(std::string &out, const std::vector<table_column> &cols, const sql::dialect &d);
|
||||
|
||||
void query_builder::visit(internal::query_add_foreign_key_constraint_part& part) {
|
||||
query_.sql += " " + dialect_->token_at(part.token()) + " (";
|
||||
build_columns(query_.sql, part.columns(), *dialect_);
|
||||
@@ -100,23 +91,7 @@ void query_builder::visit(internal::query_select_part &part) {
|
||||
|
||||
query_.prototype.clear();
|
||||
|
||||
std::string result;
|
||||
if (part.columns().empty()) {
|
||||
result = dialect_->asterisk();
|
||||
} else if (const auto &columns = part.columns(); columns.size() < 2) {
|
||||
for (const auto &col: columns) {
|
||||
result.append(handle_column(query_, dialect_, col ));
|
||||
}
|
||||
} else {
|
||||
auto it = columns.begin();
|
||||
result.append(handle_column(query_, dialect_, *it++));
|
||||
for (; it != columns.end(); ++it) {
|
||||
result.append(", ");
|
||||
result.append(handle_column(query_, dialect_, *it));
|
||||
}
|
||||
}
|
||||
|
||||
query_.sql += result;
|
||||
build_fetchable_columns(query_, part.columns(), *dialect_);
|
||||
}
|
||||
|
||||
void query_builder::visit(internal::query_from_part &part) {
|
||||
@@ -265,15 +240,20 @@ void query_builder::visit(internal::query_values_part &part) {
|
||||
query_.sql += " " + result;
|
||||
}
|
||||
|
||||
void query_builder::visit(internal::query_update_part &part)
|
||||
{
|
||||
query_.command = sql::sql_command::Update;
|
||||
query_.table_name = part.table().name();
|
||||
query_.sql += query_builder::build_table_name(part.token(), *dialect_, query_.table_name);
|
||||
void query_builder::visit(internal::query_returning_part &part) {
|
||||
query_.mode = sql::return_mode::Rows;
|
||||
query_.sql += " " + dialect_->returning() + " ";
|
||||
|
||||
build_fetchable_columns(query_, part.columns(), *dialect_);
|
||||
}
|
||||
|
||||
void query_builder::visit(internal::query_delete_part &/*delete_part*/)
|
||||
{
|
||||
void query_builder::visit(internal::query_update_part &part) {
|
||||
query_.command = sql::sql_command::Update;
|
||||
query_.table_name = part.table().name();
|
||||
query_.sql += build_table_name(part.token(), *dialect_, query_.table_name);
|
||||
}
|
||||
|
||||
void query_builder::visit(internal::query_delete_part &/*delete_part*/) {
|
||||
query_.command = sql::sql_command::Delete;
|
||||
query_.sql = dialect_->remove();
|
||||
}
|
||||
@@ -408,6 +388,27 @@ void build_columns(std::string &out, const std::vector<table_column> &cols, con
|
||||
}
|
||||
}
|
||||
|
||||
void build_fetchable_columns(sql::query_context &ctx, const std::vector<table_column> &cols, const sql::dialect &d) {
|
||||
bool first = true;
|
||||
for (const auto& col : cols) {
|
||||
if (!first) {
|
||||
ctx.sql.append(", ");
|
||||
}
|
||||
prepare_prototype(ctx.prototype, col);
|
||||
prepare_column(ctx.sql, d, col);
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
|
||||
void prepare_prototype(std::vector<object::attribute> &prototype, const table_column &col) {
|
||||
if (col.is_function()) {
|
||||
prototype.emplace_back(col.has_alias() ? col.alias() : col.canonical_name());
|
||||
prototype.back().change_type(utils::basic_type::Int32);
|
||||
} else {
|
||||
prototype.emplace_back(col.has_alias() ? col.alias() : col.canonical_name());
|
||||
}
|
||||
}
|
||||
|
||||
std::string build_constraint(const table_constraint& cons, const sql::dialect& d) {
|
||||
std::string result;
|
||||
if (!cons.name().empty()) {
|
||||
|
||||
@@ -4,6 +4,18 @@
|
||||
#include "matador/query/internal/string_builder_utils.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
void prepare_column(std::string &out, const sql::dialect &d, const table_column &col) {
|
||||
if (!col.is_function()) {
|
||||
prepare_identifier_string_append(out, col.name(), d);
|
||||
} else {
|
||||
if (col.column_name() == d.asterisk()) {
|
||||
out += d.sql_function_at(col.function()) + "(" + col.column_name() + ")";
|
||||
} else {
|
||||
out += d.sql_function_at(col.function()) + "(" + col.column_name() + ") " + d.as() + " " + col.alias();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string prepare_identifier(const sql::dialect& d, const table_column& col) {
|
||||
std::string result;
|
||||
if (!col.is_function()) {
|
||||
|
||||
Reference in New Issue
Block a user