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

Commit5cc9c83

Browse files
committed
Fix alignment in multirange_get_range() function
The multirange_get_range() function fails when two boundaries of the samerange have different alignments. Fix that by adding proper pointer alignment.Reported-by: Alexander LakhinDiscussion:https://postgr.es/m/17300-dced2d01ddeb1f2f%40postgresql.orgBackpatch-through: 14
1 parentc8b733c commit5cc9c83

File tree

5 files changed

+23
-12
lines changed

5 files changed

+23
-12
lines changed

‎src/backend/utils/adt/multirangetypes.c

Lines changed: 3 additions & 0 deletions
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

Lines changed: 17 additions & 4 deletions
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

Lines changed: 0 additions & 6 deletions
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

Lines changed: 3 additions & 1 deletion
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

Lines changed: 0 additions & 1 deletion
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)

[8]ページ先頭

©2009-2025 Movatter.jp