Hi, On 2017/05/05 17:26, 甄明洋 wrote: > The function of initializing rel-cache is RelationCacheInitializePhase3 and > in src/backend/utils/cache/relcache.c file. > When initializing the partition description information, we forget to check > if partition key or descriptor is NULL. > Therefore, after the loop restarts, the partition information will be > initialized again, resulting in an infinite loop. > Code: > /* > * Reload partition key and descriptor for a partitioned table. > */ > if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) > { > RelationBuildPartitionKey(relation); > Assert(relation->rd_partkey != NULL); > > > RelationBuildPartitionDesc(relation); > Assert(relation->rd_partdesc != NULL); > > > restart = true; > }
Thanks for bringing it to the notice. The above code should follow what's done for other fields that are initialized by RelationCacheInitializePhase3(). Although, since none of the entries in the relcache init file are partitioned tables, infinite loop won't occur in practice, but it's a good idea to fix the code anyway. Attached patch does that. Thanks, Amit
>From 6706999b159a76a3eb812eb3f7aad6e066a1c587 Mon Sep 17 00:00:00 2001 From: amit <amitlangot...@gmail.com> Date: Mon, 8 May 2017 18:03:09 +0900 Subject: [PATCH] Check partitioning fields are NULL in RelationCacheInitializePhase3 --- src/backend/utils/cache/relcache.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c index 30789c1edc..c3721d9e43 100644 --- a/src/backend/utils/cache/relcache.c +++ b/src/backend/utils/cache/relcache.c @@ -3858,13 +3858,20 @@ RelationCacheInitializePhase3(void) } /* - * Reload partition key and descriptor for a partitioned table. + * Reload the partition key and descriptor for a partitioned table. */ - if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE && + relation->rd_partkey == NULL) { RelationBuildPartitionKey(relation); Assert(relation->rd_partkey != NULL); + restart = true; + } + + if (relation->rd_rel->relkind == RELKIND_PARTITIONED_TABLE && + relation->rd_partdesc == NULL) + { RelationBuildPartitionDesc(relation); Assert(relation->rd_partdesc != NULL); -- 2.11.0
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers