aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDean Rasheed <dean.a.rasheed@gmail.com>2023-10-29 11:14:37 +0000
committerDean Rasheed <dean.a.rasheed@gmail.com>2023-10-29 11:14:37 +0000
commit849172ff4883d44168f96f39d3fde96d0aa34c99 (patch)
tree07dcdf077ca8c7e206acc71599f9915778b0bc91
parent237f8765dfd9149471d37f3754d15cef888338a8 (diff)
downloadpostgresql-849172ff4883d44168f96f39d3fde96d0aa34c99.tar.gz
postgresql-849172ff4883d44168f96f39d3fde96d0aa34c99.zip
btree_gin: Fix calculation of leftmost interval value.
Formerly, the value computed by leftmostvalue_interval() was a long way short of the minimum possible interval value. As a result, an index scan on a GIN index on an interval column with < or <= operators would miss large negative interval values. Fix by setting all fields of the leftmost interval to their minimum values, ensuring that the result is less than any other possible interval. Since this only affects index searches, no index rebuild is necessary. Back-patch to all supported branches. Dean Rasheed, reviewed by Heikki Linnakangas. Discussion: https://postgr.es/m/CAEZATCV80%2BgOfF8ehNUUfaKBZgZMDfCfL-g1HhWGb6kC3rpDfw%40mail.gmail.com
-rw-r--r--contrib/btree_gin/btree_gin.c6
-rw-r--r--contrib/btree_gin/expected/interval.out16
-rw-r--r--contrib/btree_gin/sql/interval.sql4
3 files changed, 17 insertions, 9 deletions
diff --git a/contrib/btree_gin/btree_gin.c b/contrib/btree_gin/btree_gin.c
index c50d68ce186..b09bb8df964 100644
--- a/contrib/btree_gin/btree_gin.c
+++ b/contrib/btree_gin/btree_gin.c
@@ -306,9 +306,9 @@ leftmostvalue_interval(void)
{
Interval *v = palloc(sizeof(Interval));
- v->time = DT_NOBEGIN;
- v->day = 0;
- v->month = 0;
+ v->time = PG_INT64_MIN;
+ v->day = PG_INT32_MIN;
+ v->month = PG_INT32_MIN;
return IntervalPGetDatum(v);
}
diff --git a/contrib/btree_gin/expected/interval.out b/contrib/btree_gin/expected/interval.out
index 1f6ef54070e..8bb9806650d 100644
--- a/contrib/btree_gin/expected/interval.out
+++ b/contrib/btree_gin/expected/interval.out
@@ -3,30 +3,34 @@ CREATE TABLE test_interval (
i interval
);
INSERT INTO test_interval VALUES
+ ( '-178000000 years' ),
( '03:55:08' ),
( '04:55:08' ),
( '05:55:08' ),
( '08:55:08' ),
( '09:55:08' ),
- ( '10:55:08' )
+ ( '10:55:08' ),
+ ( '178000000 years' )
;
CREATE INDEX idx_interval ON test_interval USING gin (i);
SELECT * FROM test_interval WHERE i<'08:55:08'::interval ORDER BY i;
i
--------------------------
+ @ 178000000 years ago
@ 3 hours 55 mins 8 secs
@ 4 hours 55 mins 8 secs
@ 5 hours 55 mins 8 secs
-(3 rows)
+(4 rows)
SELECT * FROM test_interval WHERE i<='08:55:08'::interval ORDER BY i;
i
--------------------------
+ @ 178000000 years ago
@ 3 hours 55 mins 8 secs
@ 4 hours 55 mins 8 secs
@ 5 hours 55 mins 8 secs
@ 8 hours 55 mins 8 secs
-(4 rows)
+(5 rows)
SELECT * FROM test_interval WHERE i='08:55:08'::interval ORDER BY i;
i
@@ -40,12 +44,14 @@ SELECT * FROM test_interval WHERE i>='08:55:08'::interval ORDER BY i;
@ 8 hours 55 mins 8 secs
@ 9 hours 55 mins 8 secs
@ 10 hours 55 mins 8 secs
-(3 rows)
+ @ 178000000 years
+(4 rows)
SELECT * FROM test_interval WHERE i>'08:55:08'::interval ORDER BY i;
i
---------------------------
@ 9 hours 55 mins 8 secs
@ 10 hours 55 mins 8 secs
-(2 rows)
+ @ 178000000 years
+(3 rows)
diff --git a/contrib/btree_gin/sql/interval.sql b/contrib/btree_gin/sql/interval.sql
index e3851587833..7a2f3ac0d85 100644
--- a/contrib/btree_gin/sql/interval.sql
+++ b/contrib/btree_gin/sql/interval.sql
@@ -5,12 +5,14 @@ CREATE TABLE test_interval (
);
INSERT INTO test_interval VALUES
+ ( '-178000000 years' ),
( '03:55:08' ),
( '04:55:08' ),
( '05:55:08' ),
( '08:55:08' ),
( '09:55:08' ),
- ( '10:55:08' )
+ ( '10:55:08' ),
+ ( '178000000 years' )
;
CREATE INDEX idx_interval ON test_interval USING gin (i);