diff --git a/pglablib/ResultSourceMapping.cpp b/pglablib/ResultSourceMapping.cpp index d597504..8197133 100644 --- a/pglablib/ResultSourceMapping.cpp +++ b/pglablib/ResultSourceMapping.cpp @@ -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 #include @@ -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 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); } diff --git a/releasenotes/notes/query-results-editable-grid-b265a193a39f3245.yaml b/releasenotes/notes/query-results-editable-grid-b265a193a39f3245.yaml index 14be544..a54b9f5 100644 --- a/releasenotes/notes/query-results-editable-grid-b265a193a39f3245.yaml +++ b/releasenotes/notes/query-results-editable-grid-b265a193a39f3245.yaml @@ -4,9 +4,10 @@ features: Query results are now shown in the same grid as the table data tab. Columns can be sorted by clicking their headers, and cells that belong to a table with a primary key present in the result can be edited directly. Changes - are saved with an ``UPDATE`` by primary key. + are saved with an ``UPDATE`` by primary key. Tables in system catalog + schemas such as ``pg_catalog`` and ``information_schema`` are never editable. other: - | - Read-only cells in query results, such as expression columns or columns of - tables without a primary key in the result, are now shown in grey so they - can be told apart from editable cells. + Read-only cells in query results, such as expression columns, columns of + tables without a primary key in the result, or columns of system catalog + tables, are now shown in grey so they can be told apart from editable cells.