Avoid redundant checks in partition_bounds_copy().
authorEtsuro Fujita <efujita@postgresql.org>
Fri, 21 Feb 2020 11:00:45 +0000 (20:00 +0900)
committerEtsuro Fujita <efujita@postgresql.org>
Fri, 21 Feb 2020 11:00:45 +0000 (20:00 +0900)
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

index 2d61c3f6e368d415553918bbb6ff29ccd20c759b..54eb83a0d1ac99e4d7740dff60621d8efc10109f 100644 (file)
@@ -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++)