1
0
mirror of https://github.com/postgres/postgres.git synced 2025-06-11 20:28:21 +03:00

MAXALIGN the target address where we store flattened value.

The API (EOH_flatten_into) that flattens the expanded value representation
expects the target address to be maxaligned.  All it's usage adhere to that
principle except when serializing datums for parallel query.  Fix that
usage.

Diagnosed-by: Tom Lane
Author: Tom Lane and Amit Kapila
Backpatch-through: 9.6
Discussion: https://postgr.es/m/11629.1536550032@sss.pgh.pa.us
This commit is contained in:
Amit Kapila
2018-10-03 09:38:07 +05:30
parent 6483381a4d
commit 9718c93f53
3 changed files with 55 additions and 1 deletions

View File

@ -338,8 +338,19 @@ datumSerialize(Datum value, bool isnull, bool typByVal, int typLen,
}
else if (eoh)
{
EOH_flatten_into(eoh, (void *) *start_address, header);
char *tmp;
/*
* EOH_flatten_into expects the target address to be maxaligned,
* so we can't store directly to *start_address.
*/
tmp = (char *) palloc(header);
EOH_flatten_into(eoh, (void *) tmp, header);
memcpy(*start_address, tmp, header);
*start_address += header;
/* be tidy. */
pfree(tmp);
}
else
{

View File

@ -628,6 +628,33 @@ EXPLAIN (analyze, timing off, summary off, costs off) SELECT * FROM tenk1;
-> Parallel Seq Scan on tenk1 (actual rows=2000 loops=5)
(4 rows)
-- test passing expanded-value representations to workers
CREATE FUNCTION make_some_array(int,int) returns int[] as
$$declare x int[];
begin
x[1] := $1;
x[2] := $2;
return x;
end$$ language plpgsql parallel safe;
CREATE TABLE fooarr(f1 text, f2 int[], f3 text);
INSERT INTO fooarr VALUES('1', ARRAY[1,2], 'one');
PREPARE pstmt(text, int[]) AS SELECT * FROM fooarr WHERE f1 = $1 AND f2 = $2;
EXPLAIN (COSTS OFF) EXECUTE pstmt('1', make_some_array(1,2));
QUERY PLAN
------------------------------------------------------------------
Gather
Workers Planned: 3
-> Parallel Seq Scan on fooarr
Filter: ((f1 = '1'::text) AND (f2 = '{1,2}'::integer[]))
(4 rows)
EXECUTE pstmt('1', make_some_array(1,2));
f1 | f2 | f3
----+-------+-----
1 | {1,2} | one
(1 row)
DEALLOCATE pstmt;
-- provoke error in worker
select stringu1::int2 from tenk1 where unique1 = 1;
ERROR: invalid input syntax for integer: "BAAAAA"

View File

@ -218,6 +218,22 @@ explain (costs off)
-- to increase the parallel query test coverage
EXPLAIN (analyze, timing off, summary off, costs off) SELECT * FROM tenk1;
-- test passing expanded-value representations to workers
CREATE FUNCTION make_some_array(int,int) returns int[] as
$$declare x int[];
begin
x[1] := $1;
x[2] := $2;
return x;
end$$ language plpgsql parallel safe;
CREATE TABLE fooarr(f1 text, f2 int[], f3 text);
INSERT INTO fooarr VALUES('1', ARRAY[1,2], 'one');
PREPARE pstmt(text, int[]) AS SELECT * FROM fooarr WHERE f1 = $1 AND f2 = $2;
EXPLAIN (COSTS OFF) EXECUTE pstmt('1', make_some_array(1,2));
EXECUTE pstmt('1', make_some_array(1,2));
DEALLOCATE pstmt;
-- provoke error in worker
select stringu1::int2 from tenk1 where unique1 = 1;