mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +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:
		@@ -36,7 +36,7 @@
 | 
			
		||||
 *
 | 
			
		||||
 * The OIDVECTOR and INT2VECTOR datatypes are storage-compatible with
 | 
			
		||||
 * 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
 | 
			
		||||
 * 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 */
 | 
			
		||||
	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 &&
 | 
			
		||||
						   OidIsValid(typeStruct->typelem));
 | 
			
		||||
						   OidIsValid(typeStruct->typelem) &&
 | 
			
		||||
						   typeStruct->typstorage != 'p');
 | 
			
		||||
	}
 | 
			
		||||
	else if (typeStruct->typtype == TYPTYPE_DOMAIN)
 | 
			
		||||
	{
 | 
			
		||||
		/* we can short-circuit looking up base types if it's not varlena */
 | 
			
		||||
		typ->typisarray = (typeStruct->typlen == -1 &&
 | 
			
		||||
						   typeStruct->typstorage != 'p' &&
 | 
			
		||||
				 OidIsValid(get_base_element_type(typeStruct->typbasetype)));
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user