diff options
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/regress/expected/arrays.out | 30 | ||||
| -rw-r--r-- | src/test/regress/regress.c | 11 | ||||
| -rw-r--r-- | src/test/regress/sql/arrays.sql | 17 |
3 files changed, 57 insertions, 1 deletions
diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out index 6dce5c9301b..4286691f922 100644 --- a/src/test/regress/expected/arrays.out +++ b/src/test/regress/expected/arrays.out @@ -1676,3 +1676,33 @@ select * from t1; [5:5]={"(42,43)"} (1 row) +-- Check that arrays of composites are safely detoasted when needed +create temp table src (f1 text); +insert into src + select string_agg(random()::text,'') from generate_series(1,10000); +create type textandtext as (c1 text, c2 text); +create temp table dest (f1 textandtext[]); +insert into dest select array[row(f1,f1)::textandtext] from src; +select length(md5((f1[1]).c2)) from dest; + length +-------- + 32 +(1 row) + +delete from src; +select length(md5((f1[1]).c2)) from dest; + length +-------- + 32 +(1 row) + +truncate table src; +drop table src; +select length(md5((f1[1]).c2)) from dest; + length +-------- + 32 +(1 row) + +drop table dest; +drop type textandtext; diff --git a/src/test/regress/regress.c b/src/test/regress/regress.c index c25bf6e09d1..4b69067485d 100644 --- a/src/test/regress/regress.c +++ b/src/test/regress/regress.c @@ -810,5 +810,14 @@ make_tuple_indirect(PG_FUNCTION_ARGS) MemoryContextSwitchTo(old_context); - PG_RETURN_HEAPTUPLEHEADER(newtup->t_data); + /* + * We intentionally don't use PG_RETURN_HEAPTUPLEHEADER here, because that + * would cause the indirect toast pointers to be flattened out of the + * tuple immediately, rendering subsequent testing irrelevant. So just + * return the HeapTupleHeader pointer as-is. This violates the general + * rule that composite Datums shouldn't contain toast pointers, but so + * long as the regression test scripts don't insert the result of this + * function into a container type (record, array, etc) it should be OK. + */ + PG_RETURN_POINTER(newtup->t_data); } diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql index 92af172dfc4..d9f7cbfa8d2 100644 --- a/src/test/regress/sql/arrays.sql +++ b/src/test/regress/sql/arrays.sql @@ -459,3 +459,20 @@ insert into t1 (f1[5].q1) values(42); select * from t1; update t1 set f1[5].q2 = 43; select * from t1; + +-- Check that arrays of composites are safely detoasted when needed + +create temp table src (f1 text); +insert into src + select string_agg(random()::text,'') from generate_series(1,10000); +create type textandtext as (c1 text, c2 text); +create temp table dest (f1 textandtext[]); +insert into dest select array[row(f1,f1)::textandtext] from src; +select length(md5((f1[1]).c2)) from dest; +delete from src; +select length(md5((f1[1]).c2)) from dest; +truncate table src; +drop table src; +select length(md5((f1[1]).c2)) from dest; +drop table dest; +drop type textandtext; |
