We should not allow editing of system catalogs.

This commit is contained in:
eelke 2026-10-18 10:35:39 +02:00
parent 5e7fb68c55
commit 66267334c8
2 changed files with 28 additions and 7 deletions

View file

@ -1,8 +1,12 @@
#include "ResultSourceMapping.h"
#include "Pgsql_Result.h"
#include "catalog/PgClass.h"
#include "catalog/PgDatabaseCatalog.h"
#include "catalog/PgConstraintContainer.h"
#include "catalog/PgNamespace.h"
#include "catalog/PgNamespaceContainer.h"
#include "catalog/PgClassContainer.h"
#include <algorithm>
#include <stdexcept>
@ -107,6 +111,20 @@ const ResultSourceMapping::TableInfo *ResultSourceMapping::findTable(Oid tableOi
return found == m_tables.end() ? nullptr : &*found;
}
namespace {
/// Catalog tables (pg_catalog, information_schema, ...) are views or system tables and must never be edited.
bool isSystemCatalogTable(const PgDatabaseCatalog &catalog, Oid tableOid)
{
const PgClass *cls = catalog.classes()->getByKey(tableOid);
if (!cls)
return false;
const PgNamespace *ns = catalog.namespaces()->getByKey(cls->nsOid());
return ns && ns->isSystemCatalog();
}
}
ResultSourceMapping createResultSourceMapping(const Pgsql::Result &result, const PgDatabaseCatalog &catalog)
{
std::vector<ResultColumnSource> columns;
@ -129,9 +147,11 @@ ResultSourceMapping createResultSourceMapping(const Pgsql::Result &result, const
TablePrimaryKey pk;
pk.tableOid = source.tableOid;
auto constraint = catalog.constraints()->getPrimaryForRelation(source.tableOid);
if (constraint)
pk.attnums.assign(constraint->key.begin(), constraint->key.end());
if (!isSystemCatalogTable(catalog, source.tableOid)) {
auto constraint = catalog.constraints()->getPrimaryForRelation(source.tableOid);
if (constraint)
pk.attnums.assign(constraint->key.begin(), constraint->key.end());
}
primaryKeys.push_back(pk);
}