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:
parent
a66e722cc1
commit
c1da0acbb0
@ -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)
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user