From 4dfb6e8434a2d8d3e22b88689ad4482dd9187c91 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 26 Dec 2020 19:35:10 +0300
Subject: [PATCH 1/5] Fix bugs in comparison functions for
 multirange_bsearch_match()

Two functions multirange_range_overlaps_bsearch_comparison() and
multirange_range_contains_bsearch_comparison() contain bugs of returning -1
instead of 1.  This commit fixes these bugs and adds corresponding regression
tests.
---
 src/backend/utils/adt/multirangetypes.c       |  4 ++--
 src/test/regress/expected/multirangetypes.out | 12 ++++++++++++
 src/test/regress/sql/multirangetypes.sql      |  2 ++
 3 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/src/backend/utils/adt/multirangetypes.c b/src/backend/utils/adt/multirangetypes.c
index 06316ba6b65..46f661fee49 100644
--- a/src/backend/utils/adt/multirangetypes.c
+++ b/src/backend/utils/adt/multirangetypes.c
@@ -1660,7 +1660,7 @@ multirange_range_contains_bsearch_comparison(TypeCacheEntry *typcache,
 	if (range_cmp_bounds(typcache, keyUpper, lower) < 0)
 		return -1;
 	if (range_cmp_bounds(typcache, keyLower, upper) > 0)
-		return -1;
+		return 1;
 
 	/*
 	 * At this point we found overlapping range.  But we have to check if it
@@ -1825,7 +1825,7 @@ multirange_range_overlaps_bsearch_comparison(TypeCacheEntry *typcache,
 	if (range_cmp_bounds(typcache, keyUpper, lower) < 0)
 		return -1;
 	if (range_cmp_bounds(typcache, keyLower, upper) > 0)
-		return -1;
+		return 1;
 
 	*match = true;
 	return 0;
diff --git a/src/test/regress/expected/multirangetypes.out b/src/test/regress/expected/multirangetypes.out
index e81e565cab7..180aa1e8a53 100644
--- a/src/test/regress/expected/multirangetypes.out
+++ b/src/test/regress/expected/multirangetypes.out
@@ -834,6 +834,12 @@ SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && nummultirange(numrange(3
  t
 (1 row)
 
+select '{(10,20),(30,40),(50,60)}'::nummultirange && '(42,92)'::numrange;
+ ?column? 
+----------
+ t
+(1 row)
+
 -- contains
 SELECT nummultirange() @> nummultirange();
  ?column? 
@@ -967,6 +973,12 @@ SELECT '{[1,5), [6,9)}'::nummultirange @> '{[6,7)}';
  t
 (1 row)
 
+select '{(10,20),(30,40),(50,60)}'::nummultirange @> '(52,56)'::numrange;
+ ?column? 
+----------
+ t
+(1 row)
+
 -- is contained by
 SELECT nummultirange() <@ nummultirange();
  ?column? 
diff --git a/src/test/regress/sql/multirangetypes.sql b/src/test/regress/sql/multirangetypes.sql
index 9be26f10d38..c9f84cf81d4 100644
--- a/src/test/regress/sql/multirangetypes.sql
+++ b/src/test/regress/sql/multirangetypes.sql
@@ -162,6 +162,7 @@ SELECT nummultirange(numrange(1,2), numrange(7,8)) && nummultirange(numrange(3,4
 SELECT nummultirange(numrange(3,4)) && nummultirange(numrange(1,2), numrange(3.5,8));
 SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && numrange(3,4);
 SELECT nummultirange(numrange(1,2), numrange(3.5,8)) && nummultirange(numrange(3,4));
+select '{(10,20),(30,40),(50,60)}'::nummultirange && '(42,92)'::numrange;
 
 -- contains
 SELECT nummultirange() @> nummultirange();
@@ -186,6 +187,7 @@ SELECT '{[-4,-2), [1,5)}'::nummultirange @> '{[1,5)}';
 SELECT '{[1,5), [8,9)}'::nummultirange @> '{[1,5)}';
 SELECT '{[1,5), [8,9)}'::nummultirange @> '{[6,7)}';
 SELECT '{[1,5), [6,9)}'::nummultirange @> '{[6,7)}';
+select '{(10,20),(30,40),(50,60)}'::nummultirange @> '(52,56)'::numrange;
 
 -- is contained by
 SELECT nummultirange() <@ nummultirange();
-- 
2.24.3 (Apple Git-128)

