]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Fix comparison logic in partition_bounds_equal for non-finite bounds.
authorRobert Haas <rhaas@postgresql.org>
Fri, 20 Jan 2017 20:47:31 +0000 (15:47 -0500)
committerRobert Haas <rhaas@postgresql.org>
Fri, 20 Jan 2017 20:49:38 +0000 (15:49 -0500)
If either bound is infinite, then we shouldn't even try to perform a
comparison of the values themselves.  Rearrange the logic so that
we don't.

Per buildfarm member skink and Tom Lane.

src/backend/catalog/partition.c

index 3f8a950f37dc57ff70db340a6ee7e808fb42a2d1..ad95b1bc55d78b67df6f74634b17f9079e459c92 100644 (file)
@@ -624,16 +624,28 @@ partition_bounds_equal(PartitionKey key,
                {
                        int32           cmpval;
 
+                       /* For range partitions, the bounds might not be finite. */
+                       if (b1->content != NULL)
+                       {
+                               /*
+                                * A finite bound always differs from an infinite bound, and
+                                * different kinds of infinities differ from each other.
+                                */
+                               if (b1->content[i][j] != b2->content[i][j])
+                                       return false;
+
+                               /* Non-finite bounds are equal without further examination. */
+                               if (b1->content[i][j] != RANGE_DATUM_FINITE)
+                                       continue;
+                       }
+
+                       /* Compare the actual values */
                        cmpval = DatumGetInt32(FunctionCall2Coll(&key->partsupfunc[j],
                                                                                                         key->partcollation[j],
                                                                                                         b1->datums[i][j],
                                                                                                         b2->datums[i][j]));
                        if (cmpval != 0)
                                return false;
-
-                       /* Range partitions can have infinite datums */
-                       if (b1->content != NULL && b1->content[i][j] != b2->content[i][j])
-                               return false;
                }
 
                if (b1->indexes[i] != b2->indexes[i])