mirror of
https://github.com/postgres/postgres.git
synced 2025-05-06 19:59:18 +03:00
In plpgsql, don't try to convert int2vector or oidvector to expanded array.
These types are storage-compatible with real arrays, but they don't support toasting, so of course they can't support expansion either. Per bug #14289 from Michael Overmeyer. Back-patch to 9.5 where expanded arrays were introduced. Report: <20160818174414.1529.37913@wrigleys.postgresql.org>
This commit is contained in:
parent
191d45793d
commit
c81c71d884
@ -36,7 +36,7 @@
|
|||||||
*
|
*
|
||||||
* The OIDVECTOR and INT2VECTOR datatypes are storage-compatible with
|
* The OIDVECTOR and INT2VECTOR datatypes are storage-compatible with
|
||||||
* generic arrays, but they support only one-dimensional arrays with no
|
* generic arrays, but they support only one-dimensional arrays with no
|
||||||
* nulls (and no null bitmap).
|
* nulls (and no null bitmap). They don't support being toasted, either.
|
||||||
*
|
*
|
||||||
* There are also some "fixed-length array" datatypes, such as NAME and
|
* There are also some "fixed-length array" datatypes, such as NAME and
|
||||||
* POINT. These are simply a sequence of a fixed number of items each
|
* POINT. These are simply a sequence of a fixed number of items each
|
||||||
|
@ -2192,14 +2192,19 @@ build_datatype(HeapTuple typeTup, int32 typmod, Oid collation)
|
|||||||
/* NB: this is only used to decide whether to apply expand_array */
|
/* NB: this is only used to decide whether to apply expand_array */
|
||||||
if (typeStruct->typtype == TYPTYPE_BASE)
|
if (typeStruct->typtype == TYPTYPE_BASE)
|
||||||
{
|
{
|
||||||
/* this test should match what get_element_type() checks */
|
/*
|
||||||
|
* This test should include what get_element_type() checks. We also
|
||||||
|
* disallow non-toastable array types (i.e. oidvector and int2vector).
|
||||||
|
*/
|
||||||
typ->typisarray = (typeStruct->typlen == -1 &&
|
typ->typisarray = (typeStruct->typlen == -1 &&
|
||||||
OidIsValid(typeStruct->typelem));
|
OidIsValid(typeStruct->typelem) &&
|
||||||
|
typeStruct->typstorage != 'p');
|
||||||
}
|
}
|
||||||
else if (typeStruct->typtype == TYPTYPE_DOMAIN)
|
else if (typeStruct->typtype == TYPTYPE_DOMAIN)
|
||||||
{
|
{
|
||||||
/* we can short-circuit looking up base types if it's not varlena */
|
/* we can short-circuit looking up base types if it's not varlena */
|
||||||
typ->typisarray = (typeStruct->typlen == -1 &&
|
typ->typisarray = (typeStruct->typlen == -1 &&
|
||||||
|
typeStruct->typstorage != 'p' &&
|
||||||
OidIsValid(get_base_element_type(typeStruct->typbasetype)));
|
OidIsValid(get_base_element_type(typeStruct->typbasetype)));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user