fixed PostgreSQL tests

This commit is contained in:
2026-01-01 17:08:20 +01:00
parent 7cb64515bd
commit a79d50e6e8
17 changed files with 230 additions and 329 deletions
+3 -109
View File
@@ -12,116 +12,10 @@ utils::error make_error(const error_code ec, const std::string &msg) {
return utils::error(ec, msg);
}
session::session(session_context&& ctx)
session::session(session_context&& ctx, const query::schema &scm)
: cache_(ctx.bus, ctx.pool, ctx.cache_size)
, dialect_(sql::backend_provider::instance().connection_dialect(ctx.pool.info().type))
, schema_(std::make_unique<query::schema>(dialect_.default_schema_name())) {
}
utils::result<void, utils::error> session::create_schema() const {
// Step 1: Build dependency graph
// std::unordered_map<std::string, std::vector<std::string> > dependency_graph;
// std::unordered_map<std::string, std::pair<int,object::repository::node_ptr>> in_degree;
// for (const auto &node: *schema_) {
// for (auto it = node->info().endpoint_begin(); it != node->info().endpoint_end(); ++it) {
// dependency_graph[node->name()].push_back(it->second->node().name());
//
// if (const auto dit = in_degree.find(it->second->node().name()); dit == in_degree.end()) {
// in_degree[it->second->node().name()] = std::make_pair(1, it->second->node_ptr());
// } else {
// in_degree[it->second->node().name()].first++;
// }
// }
//
// // Ensure the current node exists in the graph representation
// if (in_degree.find(node->name()) == in_degree.end()) {
// in_degree[node->name()] = std::make_pair(0, node);
// }
// }
//
// for (const auto &it : dependency_graph) {
// std::cout << "Dependency graph " << it.first << std::endl;
// for (const auto &neighbor: it.second) {
// std::cout << " " << neighbor << std::endl;
// }
// std::cout << std::endl;
// }
auto c = cache_.pool().acquire();
for (const auto &node: schema_->repo()) {
auto ctx = query::query::create()
.table(node->name())
.columns(node->info().attributes())
.compile(*c);
std::cout << ctx.sql << std::endl;
if (auto result = c->execute(ctx.sql); !result) {
return utils::failure(result.err());
}
}
// create table constraints
for (const auto &node: schema_->repo()) {
for (const auto& cons : node->info().constraints()) {
auto ctx = build_add_constraint_context(node->name(), cons, c);
std::cout << ctx.sql << std::endl;
if (auto result = c->execute(ctx.sql); !result) {
return utils::failure(result.err());
}
}
}
return utils::ok<void>();
}
sql::query_context session::build_add_constraint_context(const std::string& table_name, const class object::restriction& cons, const sql::connection_ptr &conn) {
if (cons.is_foreign_key_constraint()) {
return query::query::alter()
.table(table_name)
.add_constraint(cons)
.compile(*conn);
}
if (cons.is_primary_key_constraint()) {
return query::query::alter()
.table(table_name)
.add_constraint(cons)
.compile(*conn);
}
return {};
}
utils::result<void, utils::error> session::drop_schema() const {
auto c = cache_.pool().acquire();
// drop table constraints
for (const auto &node: schema_->repo()) {
for (const auto& cons : node->info().constraints()) {
auto ctx = query::query::alter()
.table(node->name())
.drop_constraint(cons)
.compile(*c);
std::cout << ctx.sql << std::endl;
if (auto result = c->execute(ctx.sql); !result) {
return utils::failure(result.err());
}
}
}
// drop table
for (const auto &node: schema_->repo()) {
auto ctx = query::query::drop()
.table(node->name())
.compile(*c);
std::cout << ctx.sql << std::endl;
if (auto result = c->execute(ctx.sql); !result) {
return utils::failure(result.err());
}
}
return utils::ok<void>();
, schema_(scm) {
}
utils::result<void, utils::error> session::drop_table(const std::string &table_name) const {
@@ -191,7 +85,7 @@ const class sql::dialect &session::dialect() const {
}
void session::dump_schema(std::ostream &os) const {
schema_->repo().dump(os);
schema_.repo().dump(os);
}
utils::result<std::unique_ptr<sql::query_result_impl>, utils::error> session::fetch(const sql::query_context& ctx) const {
+1 -1
View File
@@ -8,7 +8,7 @@ table_column alias(const std::string &column, const std::string &as) {
table_column alias(table_column &&col, const std::string &as) {
col.as(as);
return std::move(col);
return col;
}
table_column count(const std::string &column) {
+4 -3
View File
@@ -39,10 +39,10 @@ sql::query_context query_compiler::compile(const query_data &data,
std::string handle_column(sql::query_context &ctx, const sql::dialect *d, const query_data &data, const table_column &col) {
if (col.is_function()) {
ctx.prototype.emplace_back(col.has_alias() ? col.alias() : col.name());
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.name());
ctx.prototype.emplace_back(col.canonical_name());
}
@@ -128,7 +128,8 @@ void query_compiler::visit(internal::query_drop_key_constraint_part_by_name& par
query_.sql += " " + dialect_->token_at(part.token()) + " " + part.name();
}
void query_compiler::visit(internal::query_drop_key_constraint_part_by_constraint& /*part*/) {
void query_compiler::visit(internal::query_drop_key_constraint_part_by_constraint& part) {
query_.sql += " " + build_drop_constraint_string(part.constraint());
}
void query_compiler::visit(internal::query_select_part &part) {
+10 -11
View File
@@ -56,12 +56,14 @@ table_column::table_column(const class table* tab,
std::string name,
std::string alias,
utils::basic_type type,
const utils::field_attributes &attributes)
const utils::field_attributes &attributes,
const sql::sql_function_t func)
: table_(tab)
, name_(std::move(name))
, alias_(std::move(alias))
, type_(type)
, attributes_(attributes) {}
, attributes_(attributes)
, function_(func) {}
table_column & table_column::operator=(const table_column &other) {
if (this == &other) {
@@ -72,17 +74,10 @@ table_column & table_column::operator=(const table_column &other) {
alias_ = other.alias_;
type_ = other.type_;
attributes_ = other.attributes_;
function_ = other.function_;
return *this;
}
table_column::table_column(const table_column &other)
: table_(other.table_)
, name_(other.name_)
, alias_(other.alias_)
, type_(other.type_)
, attributes_(other.attributes_) {
}
bool table_column::equals(const table_column &x) const {
if (table_ != nullptr && x.table_ != nullptr) {
return *table_ == *x.table_ &&
@@ -98,13 +93,17 @@ bool table_column::equals(const table_column &x) const {
table_column table_column::as(std::string a) {
alias_ = std::move(a);
return {table_, name_, alias_, type_, attributes_};
return {table_, name_, alias_, type_, attributes_, function_};
}
const std::string& table_column::name() const {
return name_;
}
std::string table_column::canonical_name() const {
return table_ ? table_->name() + "." + name_ : name_;
}
const std::string& table_column::alias() const {
return alias_;
}
+12 -24
View File
@@ -35,8 +35,7 @@ field &field::operator=(field &&x) noexcept {
return *this;
}
const std::string &field::name() const
{
const std::string &field::name() const {
return name_;
}
@@ -44,59 +43,48 @@ utils::constraints field::type() const {
return type_;
}
size_t field::size() const
{
size_t field::size() const {
return value_.size();
}
int field::index() const
{
int field::index() const {
return index_;
}
std::ostream &operator<<(std::ostream &out, const field &col)
{
std::ostream &operator<<(std::ostream &out, const field &col) {
out << col.str();
return out;
}
std::string field::str() const
{
std::string field::str() const {
return as<std::string>().value_or("");
}
bool field::is_integer() const
{
bool field::is_integer() const {
return value_.is_integer();
}
bool field::is_floating_point() const
{
bool field::is_floating_point() const {
return value_.is_floating_point();
}
bool field::is_bool() const
{
bool field::is_bool() const {
return value_.is_bool();
}
bool field::is_string() const
{
bool field::is_string() const {
return value_.is_string();
}
bool field::is_varchar() const
{
bool field::is_varchar() const {
return value_.is_varchar();
}
bool field::is_blob() const
{
bool field::is_blob() const {
return value_.is_blob();
}
bool field::is_null() const
{
bool field::is_null() const {
return value_.is_null();
}
+4 -30
View File
@@ -5,16 +5,14 @@
namespace matador::sql {
record::record(std::initializer_list<field> columns)
{
record::record(const std::initializer_list<field> columns) {
for (auto &&col :columns) {
const auto it = fields_by_name_.emplace(col.name(), field_index_pair {col, fields_.size()});
fields_.push_back(std::ref(it.first->second.first));
}
}
record::record(const std::vector<field> &columns)
{
record::record(const std::vector<field> &columns) {
for (auto &&col :columns) {
const auto it = fields_by_name_.emplace(col.name(), field_index_pair {col, fields_.size()});
fields_.push_back(std::ref(it.first->second.first));
@@ -23,7 +21,6 @@ record::record(const std::vector<field> &columns)
record::record(const record &x)
: fields_by_name_(x.fields_by_name_)
//, pk_index_(x.pk_index_)
{
for (auto& col : x.fields_) {
auto &it = fields_by_name_.at(col.get().name());
@@ -47,25 +44,10 @@ record &record::operator=(const record &x)
return *this;
}
const std::vector<record::field_ref> &record::columns() const
{
const std::vector<record::field_ref> &record::columns() const {
return fields_;
}
//bool record::has_primary_key() const
//{
// return pk_index_ > -1;
//}
//
//std::optional<field> record::primary_key() const
//{
// if (!has_primary_key()) {
// return std::nullopt;
// }
//
// return columns_[pk_index_];
//}
const field &record::at(const std::string &name) const {
const auto &res = fields_by_name_.at(name);
const auto &f = res.first;
@@ -88,8 +70,7 @@ record::const_iterator record::find(const std::string &column_name) const {
return it != fields_by_name_.end() ? fields_.begin() + it->second.second : fields_.end();
}
void record::append(const field &col)
{
void record::append(const field &col) {
const auto it = fields_by_name_.emplace(col.name(), field_index_pair {col, fields_.size()});
fields_.push_back(std::ref(it.first->second.first));
}
@@ -140,13 +121,6 @@ void record::clear()
fields_by_name_.clear();
}
//bool record::unknown() const
//{
// return std::all_of(std::begin(columns_), std::end(columns_), [](const auto &col) {
// return col.type() == data_type_t::type_unknown;
// });
//}
void record::init()
{
size_t index{0};