From d04e0b06effaa57b2ae8e93cd5d946f9e8a0f57e Mon Sep 17 00:00:00 2001 From: Emre Hasegeli Date: Sun, 22 Mar 2015 17:32:14 +0100 Subject: [PATCH 4/7] fix brin deform tuple --- src/backend/access/brin/brin_tuple.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/backend/access/brin/brin_tuple.c b/src/backend/access/brin/brin_tuple.c index 08fa998..416715a 100644 --- a/src/backend/access/brin/brin_tuple.c +++ b/src/backend/access/brin/brin_tuple.c @@ -30,20 +30,21 @@ * src/backend/access/brin/brin_tuple.c */ #include "postgres.h" #include "access/htup_details.h" #include "access/brin_tuple.h" #include "access/tupdesc.h" #include "access/tupmacs.h" #include "utils/datum.h" #include "utils/memutils.h" +#include "utils/typcache.h" static inline void brin_deconstruct_tuple(BrinDesc *brdesc, char *tp, bits8 *nullbits, bool nulls, Datum *values, bool *allnulls, bool *hasnulls); /* * Return a tuple descriptor used for on-disk storage of BRIN tuples. */ @@ -423,36 +424,41 @@ brin_deform_tuple(BrinDesc *brdesc, BrinTuple *tuple) values, allnulls, hasnulls); /* * Iterate to assign each of the values to the corresponding item in the * values array of each column. The copies occur in the tuple's context. */ oldcxt = MemoryContextSwitchTo(dtup->bt_context); for (valueno = 0, keyno = 0; keyno < brdesc->bd_tupdesc->natts; keyno++) { int i; + TypeCacheEntry *typcache; if (allnulls[keyno]) { valueno += brdesc->bd_info[keyno]->oi_nstored; continue; } /* * We would like to skip datumCopy'ing the values datum in some cases, * caller permitting ... */ for (i = 0; i < brdesc->bd_info[keyno]->oi_nstored; i++) + { + typcache = lookup_type_cache(brdesc->bd_info[keyno]->oi_typids[i], + 0); + dtup->bt_columns[keyno].bv_values[i] = - datumCopy(values[valueno++], - brdesc->bd_tupdesc->attrs[keyno]->attbyval, - brdesc->bd_tupdesc->attrs[keyno]->attlen); + datumCopy(values[valueno++], typcache->typbyval, + typcache->typlen); + } dtup->bt_columns[keyno].bv_hasnulls = hasnulls[keyno]; dtup->bt_columns[keyno].bv_allnulls = false; } MemoryContextSwitchTo(oldcxt); pfree(values); pfree(allnulls); pfree(hasnulls); -- 2.3.2