From 032f9ae012d87c730be0e261a6bae9323c2b2d6c Mon Sep 17 00:00:00 2001 From: Etsuro Fujita Date: Fri, 21 Feb 2020 20:00:45 +0900 Subject: [PATCH] Avoid redundant checks in partition_bounds_copy(). Previously, partition_bounds_copy() checked whether the strategy for the given partition bounds was hash or not, and then determined the number of elements in the datums in the datums array for the partition bounds, on each iteration of the loop for copying the datums array, but there is no need to do that. Perform the checks only once before the loop iteration. Author: Etsuro Fujita Reported-by: Amit Langote and Julien Rouhaud Discussion: https://postgr.es/m/CAPmGK14Rvxrm8DHWvCjdoks6nwZuHBPvMnWZ6rkEx2KhFeEoPQ@mail.gmail.com --- src/backend/partitioning/partbounds.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/backend/partitioning/partbounds.c b/src/backend/partitioning/partbounds.c index 2d61c3f6e3..54eb83a0d1 100644 --- a/src/backend/partitioning/partbounds.c +++ b/src/backend/partitioning/partbounds.c @@ -789,6 +789,8 @@ partition_bounds_copy(PartitionBoundInfo src, int ndatums; int partnatts; int num_indexes; + bool hash_part; + int natts; dest = (PartitionBoundInfo) palloc(sizeof(PartitionBoundInfoData)); @@ -819,17 +821,17 @@ partition_bounds_copy(PartitionBoundInfo src, else dest->kind = NULL; + /* + * For hash partitioning, datums array will have two elements - modulus and + * remainder. + */ + hash_part = (key->strategy == PARTITION_STRATEGY_HASH); + natts = hash_part ? 2 : partnatts; + for (i = 0; i < ndatums; i++) { int j; - /* - * For a corresponding hash partition, datums array will have two - * elements - modulus and remainder. - */ - bool hash_part = (key->strategy == PARTITION_STRATEGY_HASH); - int natts = hash_part ? 2 : partnatts; - dest->datums[i] = (Datum *) palloc(sizeof(Datum) * natts); for (j = 0; j < natts; j++)