1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-12 16:21:30 +03:00

Test ALIGNOF_DOUBLE==4 compatibility under ALIGNOF_DOUBLE==8.

Today's test case detected alignment problems only when executing on
AIX.  This change lets popular platforms detect the same problems.

Reviewed by Masahiko Sawada.

Discussion: https://postgr.es/m/20220415072601.GG862547@rfd.leadboat.com
This commit is contained in:
Noah Misch 2022-04-22 20:20:11 -07:00
parent a66e722cc1
commit c1da0acbb0
5 changed files with 16 additions and 20 deletions

View File

@ -39,18 +39,18 @@ WITH check_columns AS (
SELECT t.oid SELECT t.oid
FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid
WHERE pa.attrelid = a.attrelid AND WHERE pa.attrelid = a.attrelid AND
pa.attnum > 0 AND pa.attnum <= a.attnum pa.attnum > 0 AND pa.attnum < a.attnum
ORDER BY pa.attnum) AS coltypes ORDER BY pa.attnum) AS coltypes
FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid
JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE attalign = 'd' AND relkind = 'r' AND WHERE attalign = 'd' AND relkind = 'r' AND
attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog' attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog'
) )
SELECT relname, attname, coltypes, get_column_offset(coltypes) SELECT relname, attname, coltypes, get_columns_length(coltypes)
FROM check_columns FROM check_columns
WHERE get_column_offset(coltypes) % 8 != 0 OR WHERE get_columns_length(coltypes) % 8 != 0 OR
'name'::regtype::oid = ANY(coltypes); 'name'::regtype::oid = ANY(coltypes);
relname | attname | coltypes | get_column_offset relname | attname | coltypes | get_columns_length
---------+---------+----------+------------------- ---------+---------+----------+--------------------
(0 rows) (0 rows)

View File

@ -206,7 +206,7 @@ CREATE FUNCTION ttdummy ()
RETURNS trigger RETURNS trigger
AS :'regresslib' AS :'regresslib'
LANGUAGE C; LANGUAGE C;
CREATE FUNCTION get_column_offset (oid[]) CREATE FUNCTION get_columns_length(oid[])
RETURNS int RETURNS int
AS :'regresslib' AS :'regresslib'
LANGUAGE C STRICT STABLE PARALLEL SAFE; LANGUAGE C STRICT STABLE PARALLEL SAFE;

View File

@ -1219,12 +1219,12 @@ binary_coercible(PG_FUNCTION_ARGS)
} }
/* /*
* Return the column offset of the last data in the given array of * Return the length of the portion of a tuple consisting of the given array
* data types. The input data types must be fixed-length data types. * of data types. The input data types must be fixed-length data types.
*/ */
PG_FUNCTION_INFO_V1(get_column_offset); PG_FUNCTION_INFO_V1(get_columns_length);
Datum Datum
get_column_offset(PG_FUNCTION_ARGS) get_columns_length(PG_FUNCTION_ARGS)
{ {
ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0); ArrayType *ta = PG_GETARG_ARRAYTYPE_P(0);
Oid *type_oids; Oid *type_oids;
@ -1249,14 +1249,10 @@ get_column_offset(PG_FUNCTION_ARGS)
get_typlenbyvalalign(typeoid, &typlen, &typbyval, &typalign); get_typlenbyvalalign(typeoid, &typlen, &typbyval, &typalign);
/* the data type must be fixed-length */ /* the data type must be fixed-length */
if (!(typbyval || (typlen > 0))) if (typlen < 0)
elog(ERROR, "type %u is not fixed-length data type", typeoid); elog(ERROR, "type %u is not fixed-length data type", typeoid);
column_offset = att_align_nominal(column_offset, typalign); column_offset = att_align_nominal(column_offset + typlen, typalign);
/* not include the last type size */
if (i != (ntypes - 1))
column_offset += typlen;
} }
PG_RETURN_INT32(column_offset); PG_RETURN_INT32(column_offset);

View File

@ -34,14 +34,14 @@ WITH check_columns AS (
SELECT t.oid SELECT t.oid
FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid FROM pg_type t JOIN pg_attribute pa ON t.oid = pa.atttypid
WHERE pa.attrelid = a.attrelid AND WHERE pa.attrelid = a.attrelid AND
pa.attnum > 0 AND pa.attnum <= a.attnum pa.attnum > 0 AND pa.attnum < a.attnum
ORDER BY pa.attnum) AS coltypes ORDER BY pa.attnum) AS coltypes
FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid FROM pg_attribute a JOIN pg_class c ON c.oid = attrelid
JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE attalign = 'd' AND relkind = 'r' AND WHERE attalign = 'd' AND relkind = 'r' AND
attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog' attnotnull AND attlen <> -1 AND n.nspname = 'pg_catalog'
) )
SELECT relname, attname, coltypes, get_column_offset(coltypes) SELECT relname, attname, coltypes, get_columns_length(coltypes)
FROM check_columns FROM check_columns
WHERE get_column_offset(coltypes) % 8 != 0 OR WHERE get_columns_length(coltypes) % 8 != 0 OR
'name'::regtype::oid = ANY(coltypes); 'name'::regtype::oid = ANY(coltypes);

View File

@ -253,7 +253,7 @@ CREATE FUNCTION ttdummy ()
AS :'regresslib' AS :'regresslib'
LANGUAGE C; LANGUAGE C;
CREATE FUNCTION get_column_offset (oid[]) CREATE FUNCTION get_columns_length(oid[])
RETURNS int RETURNS int
AS :'regresslib' AS :'regresslib'
LANGUAGE C STRICT STABLE PARALLEL SAFE; LANGUAGE C STRICT STABLE PARALLEL SAFE;