From da089d72c53e636383353faa89c6eb6448e061bd Mon Sep 17 00:00:00 2001 From: aykutbozkurt Date: Wed, 6 Jul 2022 14:48:29 +0300 Subject: [PATCH] we should check if relation is valid after fetching a relation --- src/backend/columnar/columnar_customscan.c | 25 +++++++++++++++++++ .../distributed/commands/alter_table.c | 5 ++++ .../citus_add_local_table_to_metadata.c | 5 ++++ src/backend/distributed/commands/index.c | 5 ++++ src/backend/distributed/commands/statistics.c | 10 ++++++++ .../utils/multi_partitioning_utils.c | 5 ++++ 6 files changed, 55 insertions(+) diff --git a/src/backend/columnar/columnar_customscan.c b/src/backend/columnar/columnar_customscan.c index e2451f89d..ddb2104f8 100644 --- a/src/backend/columnar/columnar_customscan.c +++ b/src/backend/columnar/columnar_customscan.c @@ -277,6 +277,11 @@ ColumnarSetRelPathlistHook(PlannerInfo *root, RelOptInfo *rel, Index rti, * into the scan of the table to minimize the data read. */ Relation relation = RelationIdGetRelation(rte->relid); + if (!RelationIsValid(relation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", rte->relid))); + } + if (relation->rd_tableam == GetColumnarTableAmRoutine()) { if (rte->tablesample != NULL) @@ -501,6 +506,11 @@ ColumnarIndexScanAdditionalCost(PlannerInfo *root, RelOptInfo *rel, &indexCorrelation, &fakeIndexPages); Relation relation = RelationIdGetRelation(relationId); + if (!RelationIsValid(relation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", relationId))); + } + uint64 rowCount = ColumnarTableRowCount(relation); RelationClose(relation); double estimatedRows = rowCount * indexSelectivity; @@ -596,6 +606,11 @@ static int RelationIdGetNumberOfAttributes(Oid relationId) { Relation relation = RelationIdGetRelation(relationId); + if (!RelationIsValid(relation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", relationId))); + } + int nattrs = relation->rd_att->natts; RelationClose(relation); return nattrs; @@ -1399,6 +1414,11 @@ static Cost ColumnarPerStripeScanCost(RelOptInfo *rel, Oid relationId, int numberOfColumnsRead) { Relation relation = RelationIdGetRelation(relationId); + if (!RelationIsValid(relation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", relationId))); + } + List *stripeList = StripesForRelfilenode(relation->rd_node); RelationClose(relation); @@ -1451,6 +1471,11 @@ static uint64 ColumnarTableStripeCount(Oid relationId) { Relation relation = RelationIdGetRelation(relationId); + if (!RelationIsValid(relation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", relationId))); + } + List *stripeList = StripesForRelfilenode(relation->rd_node); int stripeCount = list_length(stripeList); RelationClose(relation); diff --git a/src/backend/distributed/commands/alter_table.c b/src/backend/distributed/commands/alter_table.c index f5c5d67bb..9c0f07be3 100644 --- a/src/backend/distributed/commands/alter_table.c +++ b/src/backend/distributed/commands/alter_table.c @@ -857,6 +857,11 @@ static void DropIndexesNotSupportedByColumnar(Oid relationId, bool suppressNoticeMessages) { Relation columnarRelation = RelationIdGetRelation(relationId); + if (!RelationIsValid(columnarRelation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", relationId))); + } + List *indexIdList = RelationGetIndexList(columnarRelation); /* diff --git a/src/backend/distributed/commands/citus_add_local_table_to_metadata.c b/src/backend/distributed/commands/citus_add_local_table_to_metadata.c index e85d07c0b..9d58cc716 100644 --- a/src/backend/distributed/commands/citus_add_local_table_to_metadata.c +++ b/src/backend/distributed/commands/citus_add_local_table_to_metadata.c @@ -891,6 +891,11 @@ static void RenameShardRelationStatistics(Oid shardRelationId, uint64 shardId) { Relation shardRelation = RelationIdGetRelation(shardRelationId); + if (!RelationIsValid(shardRelation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", shardRelationId))); + } + List *statsOidList = RelationGetStatExtList(shardRelation); RelationClose(shardRelation); diff --git a/src/backend/distributed/commands/index.c b/src/backend/distributed/commands/index.c index ac04d9701..2e9d2d58d 100644 --- a/src/backend/distributed/commands/index.c +++ b/src/backend/distributed/commands/index.c @@ -321,6 +321,11 @@ ExecuteFunctionOnEachTableIndex(Oid relationId, PGIndexProcessor pgIndexProcesso List *result = NIL; Relation relation = RelationIdGetRelation(relationId); + if (!RelationIsValid(relation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", relationId))); + } + List *indexIdList = RelationGetIndexList(relation); Oid indexId = InvalidOid; foreach_oid(indexId, indexIdList) diff --git a/src/backend/distributed/commands/statistics.c b/src/backend/distributed/commands/statistics.c index 6f8e6df54..bf48505a5 100644 --- a/src/backend/distributed/commands/statistics.c +++ b/src/backend/distributed/commands/statistics.c @@ -469,6 +469,11 @@ GetExplicitStatisticsCommandList(Oid relationId) List *explicitStatisticsCommandList = NIL; Relation relation = RelationIdGetRelation(relationId); + if (!RelationIsValid(relation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", relationId))); + } + List *statisticsIdList = RelationGetStatExtList(relation); RelationClose(relation); @@ -540,6 +545,11 @@ GetExplicitStatisticsSchemaIdList(Oid relationId) List *schemaIdList = NIL; Relation relation = RelationIdGetRelation(relationId); + if (!RelationIsValid(relation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", relationId))); + } + List *statsIdList = RelationGetStatExtList(relation); RelationClose(relation); diff --git a/src/backend/distributed/utils/multi_partitioning_utils.c b/src/backend/distributed/utils/multi_partitioning_utils.c index e11bc5419..8a046dcd7 100644 --- a/src/backend/distributed/utils/multi_partitioning_utils.c +++ b/src/backend/distributed/utils/multi_partitioning_utils.c @@ -506,6 +506,11 @@ CreateFixPartitionShardIndexNamesTaskList(Oid parentRelationId, Oid partitionRel } Relation parentRelation = RelationIdGetRelation(parentRelationId); + if (!RelationIsValid(parentRelation)) + { + ereport(ERROR, (errmsg("could not open relation with OID %u", parentRelationId))); + } + List *parentIndexIdList = NIL; if (parentIndexOid != InvalidOid)