Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitb5489b7

Browse files
committed
Fix overflow when calculating timestamp distance in BRIN
When calculating distances for timestamp values for BRIN minmax-multiindexes, we need to be careful about overflows for extreme values. Ifthe value overflows into a negative value, the index may be inefficient.The new regression test checks this for the timestamp type by adding atable with enough values to force range compaction/merging. The valuesare close to min/max, which means a risk of overflow.Fixed by converting the int64 values to double first, before calculatingthe distance. This prevents the overflow. We may lose some precision, ofcourse, but that's good enough. In the worst case we build a slightlyless efficient index, but for large distances this won't matter.This only affects minmax-multi indexes on timestamp columns, with rangescontaining values sufficiently distant to cause an overflow. That seemslike a fairly rare case in practice.Backpatch to 14, where minmax-multi indexes were introduced.Reported-by: Ashutosh BapatReviewed-by: Ashutosh Bapat, Dean RasheedBackpatch-through: 14Discussion:https://postgr.es/m/eef0ea8c-4aaa-8d0d-027f-58b1f35dd170@enterprisedb.com
1 parent16ace6f commitb5489b7

File tree

3 files changed

+37
-1
lines changed

3 files changed

+37
-1
lines changed

‎src/backend/access/brin/brin_minmax_multi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2144,7 +2144,7 @@ brin_minmax_multi_distance_timestamp(PG_FUNCTION_ARGS)
21442144
if (TIMESTAMP_NOT_FINITE(dt1)||TIMESTAMP_NOT_FINITE(dt2))
21452145
PG_RETURN_FLOAT8(0);
21462146

2147-
delta=dt2-dt1;
2147+
delta=(float8)dt2- (float8)dt1;
21482148

21492149
Assert(delta >=0);
21502150

‎src/test/regress/expected/brin_multi.out

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,3 +823,18 @@ SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = 'aab32389-22bc-c25a-6f60-6eb525
823823

824824
DROP TABLE brin_test_multi_2;
825825
RESET enable_seqscan;
826+
-- test overflows during CREATE INDEX with extreme timestamp values
827+
CREATE TABLE brin_timestamp_test(a TIMESTAMPTZ);
828+
SET datestyle TO iso;
829+
-- values close to timetamp minimum
830+
INSERT INTO brin_timestamp_test
831+
SELECT '4713-01-01 00:00:01 BC'::timestamptz + (i || ' seconds')::interval
832+
FROM generate_series(1,30) s(i);
833+
-- values close to timetamp maximum
834+
INSERT INTO brin_timestamp_test
835+
SELECT '294276-12-01 00:00:01'::timestamptz + (i || ' seconds')::interval
836+
FROM generate_series(1,30) s(i);
837+
CREATE INDEX ON brin_timestamp_test USING brin (a timestamptz_minmax_multi_ops) WITH (pages_per_range=1);
838+
DROP TABLE brin_timestamp_test;
839+
RESET enable_seqscan;
840+
RESET datestyle;

‎src/test/regress/sql/brin_multi.sql

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -586,3 +586,24 @@ SELECT COUNT(*) FROM brin_test_multi_2 WHERE a = 'aab32389-22bc-c25a-6f60-6eb525
586586

587587
DROPTABLE brin_test_multi_2;
588588
RESET enable_seqscan;
589+
590+
-- test overflows during CREATE INDEX with extreme timestamp values
591+
CREATETABLEbrin_timestamp_test(aTIMESTAMPTZ);
592+
593+
SET datestyle TO iso;
594+
595+
-- values close to timetamp minimum
596+
INSERT INTO brin_timestamp_test
597+
SELECT'4713-01-01 00:00:01 BC'::timestamptz+ (i||' seconds')::interval
598+
FROM generate_series(1,30) s(i);
599+
600+
-- values close to timetamp maximum
601+
INSERT INTO brin_timestamp_test
602+
SELECT'294276-12-01 00:00:01'::timestamptz+ (i||' seconds')::interval
603+
FROM generate_series(1,30) s(i);
604+
605+
CREATEINDEXON brin_timestamp_test USING brin (a timestamptz_minmax_multi_ops) WITH (pages_per_range=1);
606+
DROPTABLE brin_timestamp_test;
607+
608+
RESET enable_seqscan;
609+
RESET datestyle;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp