Commit 7615edd1 authored by Alexander Korotkov's avatar Alexander Korotkov

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
parent a04fc56d
...@@ -713,7 +713,10 @@ multirange_get_range(TypeCacheEntry *rangetyp, ...@@ -713,7 +713,10 @@ multirange_get_range(TypeCacheEntry *rangetyp,
if (RANGE_HAS_LBOUND(flags)) if (RANGE_HAS_LBOUND(flags))
ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr); ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
if (RANGE_HAS_UBOUND(flags)) if (RANGE_HAS_UBOUND(flags))
{
ptr = (Pointer) att_align_pointer(ptr, typalign, typlen, ptr);
ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr); ptr = (Pointer) att_addlength_pointer(ptr, typlen, ptr);
}
len = (ptr - begin) + sizeof(RangeType) + sizeof(uint8); len = (ptr - begin) + sizeof(RangeType) + sizeof(uint8);
range = palloc0(len); range = palloc0(len);
......
...@@ -97,6 +97,12 @@ select ' {( " a " " a ", " z " " z " ) }'::textmultirange; ...@@ -97,6 +97,12 @@ select ' {( " a " " a ", " z " " z " ) }'::textmultirange;
{(" a a "," z z ")} {(" a a "," z z ")}
(1 row) (1 row)
select textrange('\\\\', repeat('a', 200))::textmultirange;
textrange
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)}
(1 row)
select '{(,z)}'::textmultirange; select '{(,z)}'::textmultirange;
textmultirange textmultirange
---------------- ----------------
...@@ -289,10 +295,10 @@ select textmultirange(textrange('a', 'c'), textrange('f', 'g')); ...@@ -289,10 +295,10 @@ select textmultirange(textrange('a', 'c'), textrange('f', 'g'));
{[a,c),[f,g)} {[a,c),[f,g)}
(1 row) (1 row)
select textmultirange(textrange('a', 'c'), textrange('b', 'd')); select textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd'));
textmultirange textmultirange
---------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{[a,d)} {["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa),[c,d)}
(1 row) (1 row)
-- --
...@@ -363,6 +369,13 @@ select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e'))); ...@@ -363,6 +369,13 @@ select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e')));
[d,e) [d,e)
(2 rows) (2 rows)
select unnest(textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd')));
unnest
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
["\\\\\\\\",aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)
[c,d)
(2 rows)
-- --
-- create some test data and test the operators -- create some test data and test the operators
-- --
......
...@@ -72,12 +72,6 @@ select ' ( " a " " a ", " z " " z " ) '::textrange; ...@@ -72,12 +72,6 @@ select ' ( " a " " a ", " z " " z " ) '::textrange;
(" a a "," z z ") (" a a "," z z ")
(1 row) (1 row)
select '(,z)'::textrange;
textrange
-----------
(,z)
(1 row)
select '(a,)'::textrange; select '(a,)'::textrange;
textrange textrange
----------- -----------
......
...@@ -25,6 +25,7 @@ select '{}'::textmultirange; ...@@ -25,6 +25,7 @@ select '{}'::textmultirange;
select ' {} '::textmultirange; select ' {} '::textmultirange;
select ' { empty, empty } '::textmultirange; select ' { empty, empty } '::textmultirange;
select ' {( " a " " a ", " z " " z " ) }'::textmultirange; select ' {( " a " " a ", " z " " z " ) }'::textmultirange;
select textrange('\\\\', repeat('a', 200))::textmultirange;
select '{(,z)}'::textmultirange; select '{(,z)}'::textmultirange;
select '{(a,)}'::textmultirange; select '{(a,)}'::textmultirange;
select '{[,z]}'::textmultirange; select '{[,z]}'::textmultirange;
...@@ -63,7 +64,7 @@ select '{(a,a)}'::textmultirange; ...@@ -63,7 +64,7 @@ select '{(a,a)}'::textmultirange;
select textmultirange(); select textmultirange();
select textmultirange(textrange('a', 'c')); select textmultirange(textrange('a', 'c'));
select textmultirange(textrange('a', 'c'), textrange('f', 'g')); select textmultirange(textrange('a', 'c'), textrange('f', 'g'));
select textmultirange(textrange('a', 'c'), textrange('b', 'd')); select textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd'));
-- --
-- test casts, both a built-in range type and a user-defined one: -- test casts, both a built-in range type and a user-defined one:
...@@ -82,6 +83,7 @@ select textrange(null, null)::textmultirange; ...@@ -82,6 +83,7 @@ select textrange(null, null)::textmultirange;
-- --
select unnest(int4multirange(int4range('5', '6'), int4range('1', '2'))); select unnest(int4multirange(int4range('5', '6'), int4range('1', '2')));
select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e'))); select unnest(textmultirange(textrange('a', 'b'), textrange('d', 'e')));
select unnest(textmultirange(textrange('\\\\', repeat('a', 200)), textrange('c', 'd')));
-- --
-- create some test data and test the operators -- create some test data and test the operators
......
...@@ -22,7 +22,6 @@ select '[z,a]'::textrange; ...@@ -22,7 +22,6 @@ select '[z,a]'::textrange;
select ' empty '::textrange; select ' empty '::textrange;
select ' ( empty, empty ) '::textrange; select ' ( empty, empty ) '::textrange;
select ' ( " a " " a ", " z " " z " ) '::textrange; select ' ( " a " " a ", " z " " z " ) '::textrange;
select '(,z)'::textrange;
select '(a,)'::textrange; select '(a,)'::textrange;
select '[,z]'::textrange; select '[,z]'::textrange;
select '[a,]'::textrange; select '[a,]'::textrange;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment