Remove redundant has_null member from PartitionBoundInfoData.
authorRobert Haas <rhaas@postgresql.org>
Wed, 17 May 2017 16:48:16 +0000 (12:48 -0400)
committerRobert Haas <rhaas@postgresql.org>
Wed, 17 May 2017 16:50:01 +0000 (12:50 -0400)
Jeevan Ladhe, with some changes by me.

Discussion: http://postgr.es/m/CAOgcT0NZ_30-pjBpW2OgneV1ammArHkZDZ8B_KFC3q+_Xb2H9A@mail.gmail.com

src/backend/catalog/partition.c

index 832049c1ee579aae4cf7a72100a748609147429b..2e9b727fe78f5a686e9894dfc7d94a3d4d0a4168 100644 (file)
@@ -53,7 +53,7 @@
  * Information about bounds of a partitioned relation
  *
  * A list partition datum that is known to be NULL is never put into the
- * datums array. Instead, it is tracked using has_null and null_index fields.
+ * datums array. Instead, it is tracked using the null_index field.
  *
  * In the case of range partitioning, ndatums will typically be far less than
  * 2 * nparts, because a partition's upper bound and the next partition's lower
@@ -86,12 +86,12 @@ typedef struct PartitionBoundInfoData
    int        *indexes;        /* Partition indexes; one entry per member of
                                 * the datums array (plus one if range
                                 * partitioned table) */
-   bool        has_null;       /* Is there a null-accepting partition? false
-                                * for range partitioned tables */
    int         null_index;     /* Index of the null-accepting partition; -1
-                                * for range partitioned tables */
+                                * if there isn't one */
 } PartitionBoundInfoData;
 
+#define partition_bound_accepts_nulls(bi) ((bi)->null_index != -1)
+
 /*
  * When qsort'ing partition bounds after reading from the catalog, each bound
  * is represented with one of the following structs.
@@ -173,7 +173,6 @@ RelationBuildPartitionDesc(Relation rel)
 
    /* List partitioning specific */
    PartitionListValue **all_values = NULL;
-   bool        found_null = false;
    int         null_index = -1;
 
    /* Range partitioning specific */
@@ -245,7 +244,6 @@ RelationBuildPartitionDesc(Relation rel)
             * Create a unified list of non-null values across all partitions.
             */
            i = 0;
-           found_null = false;
            null_index = -1;
            foreach(cell, boundspecs)
            {
@@ -274,9 +272,8 @@ RelationBuildPartitionDesc(Relation rel)
                         * instead for the code further down below where we
                         * construct the actual relcache struct.
                         */
-                       if (found_null)
+                       if (null_index != -1)
                            elog(ERROR, "found null more than once");
-                       found_null = true;
                        null_index = i;
                    }
 
@@ -466,7 +463,6 @@ RelationBuildPartitionDesc(Relation rel)
        {
            case PARTITION_STRATEGY_LIST:
                {
-                   boundinfo->has_null = found_null;
                    boundinfo->indexes = (int *) palloc(ndatums * sizeof(int));
 
                    /*
@@ -498,20 +494,18 @@ RelationBuildPartitionDesc(Relation rel)
                     * accepts only null and hence not covered in the above
                     * loop which only handled non-null values.
                     */
-                   if (found_null)
+                   if (null_index != -1)
                    {
                        Assert(null_index >= 0);
                        if (mapping[null_index] == -1)
                            mapping[null_index] = next_index++;
+                       boundinfo->null_index = mapping[null_index];
                    }
+                   else
+                       boundinfo->null_index = -1;
 
                    /* All partition must now have a valid mapping */
                    Assert(next_index == nparts);
-
-                   if (found_null)
-                       boundinfo->null_index = mapping[null_index];
-                   else
-                       boundinfo->null_index = -1;
                    break;
                }
 
@@ -611,9 +605,6 @@ partition_bounds_equal(PartitionKey key,
    if (b1->ndatums != b2->ndatums)
        return false;
 
-   if (b1->has_null != b2->has_null)
-       return false;
-
    if (b1->null_index != b2->null_index)
        return false;
 
@@ -696,7 +687,8 @@ check_new_partition_bound(char *relname, Relation parent, Node *bound)
 
                    Assert(boundinfo &&
                           boundinfo->strategy == PARTITION_STRATEGY_LIST &&
-                          (boundinfo->ndatums > 0 || boundinfo->has_null));
+                          (boundinfo->ndatums > 0 ||
+                           partition_bound_accepts_nulls(boundinfo)));
 
                    foreach(cell, spec->listdatums)
                    {
@@ -717,7 +709,7 @@ check_new_partition_bound(char *relname, Relation parent, Node *bound)
                                break;
                            }
                        }
-                       else if (boundinfo->has_null)
+                       else if (partition_bound_accepts_nulls(boundinfo))
                        {
                            overlap = true;
                            with = boundinfo->null_index;
@@ -1985,7 +1977,7 @@ get_partition_for_tuple(PartitionDispatch *pd,
         * partition exists.
         */
        cur_index = -1;
-       if (isnull[0] && partdesc->boundinfo->has_null)
+       if (isnull[0] && partition_bound_accepts_nulls(partdesc->boundinfo))
            cur_index = partdesc->boundinfo->null_index;
        else if (!isnull[0])
        {