added returning token for insert query

This commit is contained in:
2026-02-15 18:34:12 +01:00
parent 9065355ee0
commit f38be4c6d9
16 changed files with 178 additions and 58 deletions
@@ -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) {
+13
View File
@@ -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)) {
+38 -37
View File
@@ -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()) {
+12
View File
@@ -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()) {