This is an automated email from the ASF dual-hosted git repository. leborchuk pushed a commit to branch REL_2_STABLE in repository https://gitbox.apache.org/repos/asf/cloudberry.git
commit 8c69144781f9d2ea8039e1d45ca91a2ce0391ba9 Author: Michael Paquier <[email protected]> AuthorDate: Thu Jan 18 15:04:39 2024 +0900 Add try_index_open(), conditional variant of index_open() try_index_open() is able to open an index if its relkind fits, except that it would return NULL instead of generated an error if the relation does not exist. This new routine will be used by an upcoming patch to make REINDEX on partitioned relations more robust when an index in a partition tree is dropped. Extracted from a larger patch by the same author. Author: Fei Changhong Discussion: https://postgr.es/m/[email protected] Backpatch-through: 14 (cherry picked from commit b685b41cf0a3d7523ed4781be23497da0e9507b4) --- src/backend/access/index/indexam.c | 49 +++++++++++++++++++++++++++++++++----- src/include/access/genam.h | 1 + 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c index fc12e7819d6..421843e02e3 100644 --- a/src/backend/access/index/indexam.c +++ b/src/backend/access/index/indexam.c @@ -109,6 +109,7 @@ do { \ static IndexScanDesc index_beginscan_internal(Relation indexRelation, int nkeys, int norderbys, Snapshot snapshot, ParallelIndexScanDesc pscan, bool temp_snap); +static inline void validate_relation_kind(Relation r); /* ---------------------------------------------------------------- @@ -137,12 +138,30 @@ index_open(Oid relationId, LOCKMODE lockmode) r = relation_open(relationId, lockmode); - if (r->rd_rel->relkind != RELKIND_INDEX && - r->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) - ereport(ERROR, - (errcode(ERRCODE_WRONG_OBJECT_TYPE), - errmsg("\"%s\" is not an index", - RelationGetRelationName(r)))); + validate_relation_kind(r); + + return r; +} + +/* ---------------- + * try_index_open - open a index relation by relation OID + * + * Same as index_open, except return NULL instead of failing + * if the relation does not exist. + * ---------------- + */ +Relation +try_index_open(Oid relationId, LOCKMODE lockmode) +{ + Relation r; + + r = try_relation_open(relationId, lockmode); + + /* leave if index does not exist */ + if (!r) + return NULL; + + validate_relation_kind(r); return r; } @@ -170,6 +189,24 @@ index_close(Relation relation, LOCKMODE lockmode) UnlockRelationId(&relid, lockmode); } +/* ---------------- + * validate_relation_kind - check the relation's kind + * + * Make sure relkind is an index or a partitioned index. + * ---------------- + */ +static inline void +validate_relation_kind(Relation r) +{ + if (r->rd_rel->relkind != RELKIND_INDEX && + r->rd_rel->relkind != RELKIND_PARTITIONED_INDEX) + ereport(ERROR, + (errcode(ERRCODE_WRONG_OBJECT_TYPE), + errmsg("\"%s\" is not an index", + RelationGetRelationName(r)))); +} + + /* ---------------- * index_insert - insert an index tuple into a relation * ---------------- diff --git a/src/include/access/genam.h b/src/include/access/genam.h index 3c87c3c4900..39e66b56da6 100644 --- a/src/include/access/genam.h +++ b/src/include/access/genam.h @@ -138,6 +138,7 @@ typedef struct IndexOrderByDistance #define IndexScanIsValid(scan) PointerIsValid(scan) extern Relation index_open(Oid relationId, LOCKMODE lockmode); +extern Relation try_index_open(Oid relationId, LOCKMODE lockmode); extern void index_close(Relation relation, LOCKMODE lockmode); extern bool index_insert(Relation indexRelation, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
