Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5cc9c83

Browse files
committed
Fix alignment in multirange_get_range() function
The multirange_get_range() function fails when two boundaries of the same range have different alignments. Fix that by adding proper pointer alignment. Reported-by: Alexander Lakhin Discussion: https://postgr.es/m/17300-dced2d01ddeb1f2f%40postgresql.org Backpatch-through: 14
1 parent c8b733c commit 5cc9c83

File tree

5 files changed

+23
-12
lines changed

5 files changed

+23
-12
lines changed

src/backend/utils/adt/multirangetypes.c

+3
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,10 @@ multirange_get_range(TypeCacheEntry *rangetyp,
713713
if (RANGE_HAS_LBOUND(flags))
714714
ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
715715
if (RANGE_HAS_UBOUND(flags))
716+
{
717+
ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
716718
ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
719+
}
717720
len = (ptr - begin) + sizeof(RangeType) + sizeof(uint8);
718721

719722
range = palloc0(len);

src/test/regress/expected/multirangetypes.out

+17-4
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ select ' {( " a " " a ", " z " " z " ) }'::textmultirange;
9797
{(" a a "," z z ")}
9898
(1 row)
9999

100+
select textrange('\\\\', repeat('a', 200))::textmultirange;
101+
textrange
102+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
103+
{["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)}
104+
(1 row)
105+
100106
select '{(,z)}'::textmultirange;
101107
textmultirange
102108
----------------
@@ -289,10 +295,10 @@ select textmultirange(textrange('a', 'c'), textrange('f', 'g'));
289295
{[a,c),[f,g)}
290296
(1 row)
291297

292-
select textmultirange(textrange('a', 'c'), textrange('b', 'd'));
293-
textmultirange
294-
----------------
295-
{[a,d)}
298+
select textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd'));
299+
textmultirange
300+
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
301+
{["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),[c,d)}
296302
(1 row)
297303

298304
--
@@ -363,6 +369,13 @@ select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e')));
363369
[d,e)
364370
(2 rows)
365371

372+
select unnest(textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd')));
373+
unnest
374+
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
375+
["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)
376+
[c,d)
377+
(2 rows)
378+
366379
--
367380
-- create some test data and test the operators
368381
--

src/test/regress/expected/rangetypes.out

-6
Original file line numberDiff line numberDiff line change
@@ -72,12 +72,6 @@ select ' ( " a " " a ", " z " " z " ) '::textrange;
7272
(" a a "," z z ")
7373
(1 row)
7474

75-
select '(,z)'::textrange;
76-
textrange
77-
-----------
78-
(,z)
79-
(1 row)
80-
8175
select '(a,)'::textrange;
8276
textrange
8377
-----------

src/test/regress/sql/multirangetypes.sql

+3-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ select '{}'::textmultirange;
2525
select ' {} '::textmultirange;
2626
select ' { empty, empty } '::textmultirange;
2727
select ' {( " a " " a ", " z " " z " ) }'::textmultirange;
28+
select textrange('\\\\', repeat('a', 200))::textmultirange;
2829
select '{(,z)}'::textmultirange;
2930
select '{(a,)}'::textmultirange;
3031
select '{[,z]}'::textmultirange;
@@ -63,7 +64,7 @@ select '{(a,a)}'::textmultirange;
6364
select textmultirange();
6465
select textmultirange(textrange('a', 'c'));
6566
select textmultirange(textrange('a', 'c'), textrange('f', 'g'));
66-
select textmultirange(textrange('a', 'c'), textrange('b', 'd'));
67+
select textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd'));
6768

6869
--
6970
-- test casts, both a built-in range type and a user-defined one:
@@ -82,6 +83,7 @@ select textrange(null, null)::textmultirange;
8283
--
8384
select unnest(int4multirange(int4range('5', '6'), int4range('1', '2')));
8485
select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e')));
86+
select unnest(textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd')));
8587

8688
--
8789
-- create some test data and test the operators

src/test/regress/sql/rangetypes.sql

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ select '[z,a]'::textrange;
2222
select ' empty '::textrange;
2323
select ' ( empty, empty ) '::textrange;
2424
select ' ( " a " " a ", " z " " z " ) '::textrange;
25-
select '(,z)'::textrange;
2625
select '(a,)'::textrange;
2726
select '[,z]'::textrange;
2827
select '[a,]'::textrange;

0 commit comments

Comments
 (0)