summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/regress/expected/arrays.out30
-rw-r--r--src/test/regress/regress.c11
-rw-r--r--src/test/regress/sql/arrays.sql17
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;