From 3cc28231f97b7ccd1f305baf8d7175bf8cff3d2e Mon Sep 17 00:00:00 2001 From: eelke Date: Tue, 21 Mar 2023 16:20:25 +0100 Subject: [PATCH] Support expressions as partitioning keys --- pglablib/catalog/PgClass.cpp | 2 +- pglablib/catalog/PgClassContainer.cpp | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/pglablib/catalog/PgClass.cpp b/pglablib/catalog/PgClass.cpp index 15751ff..c959dbb 100644 --- a/pglablib/catalog/PgClass.cpp +++ b/pglablib/catalog/PgClass.cpp @@ -292,7 +292,7 @@ QString PgClass::partitionKeyItemSql( ) const { if (keyItem.attNum == 0) - return "\"\""; // TODO add expression support for now use this to prevent a crash here because column 0 does not exist + return keyItem.expression; const PgAttribute *col = catalog().attributes()->findIf( [this, &keyItem] (const auto &att) diff --git a/pglablib/catalog/PgClassContainer.cpp b/pglablib/catalog/PgClassContainer.cpp index f1a3360..58e743c 100644 --- a/pglablib/catalog/PgClassContainer.cpp +++ b/pglablib/catalog/PgClassContainer.cpp @@ -1,8 +1,6 @@ #include "PgClassContainer.h" -#include "Pgsql_Connection.h" #include "Pgsql_Col.h" #include "PgDatabaseCatalog.h" -#include "PgNamespaceContainer.h" #include std::string PgClassContainer::getLoadQuery() const @@ -18,13 +16,12 @@ std::string PgClassContainer::getLoadQuery() const q += ", relhasoids "; if (minimumVersion(100000)) q += - ", pg_get_expr(relpartbound, oid)" - ", partstrat, partnatts, partattrs, partclass, partcollation"; // TODO: , partexprs"; + ", pg_get_expr(relpartbound, pg_class.oid)" + ", partstrat, partnatts, partattrs, partclass, partcollation " + ", pg_get_expr(partexprs, partrelid) AS partexprs"; if (minimumVersion(110000)) q += ", partdefid"; - // pg_get_expr must be called on each element in partexprs - q += "\nFROM pg_catalog.pg_class \n" " LEFT JOIN pg_catalog.pg_description AS d ON (objoid=pg_class.oid AND objsubid=0) \n"; @@ -46,9 +43,11 @@ namespace { std::vector attNums; std::vector attOpClass; std::vector attCollation; + std::vector expressions; PartitioningKeyItems Build() { + int expr_idx = 0; PartitioningKeyItems result(attCount); for (int attIdx = 0; attIdx < attCount; ++attIdx) { @@ -56,6 +55,8 @@ namespace { item.attNum = attNums[attIdx]; item.opClass = attOpClass[attIdx]; item.collation = attCollation[attIdx]; + if (item.attNum == 0) + item.expression = expressions[expr_idx++]; } return result; } @@ -111,6 +112,7 @@ PgClass PgClassContainer::loadElem(const Pgsql::Row &row) col.getAsVector(std::back_inserter(kibuilder.attNums)); col.getAsVector(std::back_inserter(kibuilder.attOpClass)); col.getAsVector(std::back_inserter(kibuilder.attCollation)); + col.getAsVector(std::back_inserter(kibuilder.expressions)); pt.keyColumns = kibuilder.Build(); if (minimumVersion(110000))