29 #define TOAST_INDEX_HACK
57 unsigned short infomask = 0;
60 int numberOfAttributes = tupleDescriptor->
natts;
62 #ifdef TOAST_INDEX_HACK
69 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
70 errmsg(
"number of index columns (%d) exceeds limit (%d)",
73 #ifdef TOAST_INDEX_HACK
74 for (
i = 0;
i < numberOfAttributes;
i++)
79 untoasted_free[
i] =
false;
82 if (isnull[
i] || att->attlen != -1)
94 untoasted_free[
i] =
true;
103 (att->attstorage == TYPSTORAGE_EXTENDED ||
104 att->attstorage == TYPSTORAGE_MAIN))
109 att->attcompression);
114 if (untoasted_free[
i])
116 untoasted_values[
i] = cvalue;
117 untoasted_free[
i] =
true;
123 for (
i = 0;
i < numberOfAttributes;
i++)
136 #ifdef TOAST_INDEX_HACK
138 untoasted_values, isnull);
143 size = hoff + data_size;
161 #ifdef TOAST_INDEX_HACK
162 for (
i = 0;
i < numberOfAttributes;
i++)
164 if (untoasted_free[
i])
179 #ifdef TOAST_INDEX_HACK
189 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
190 errmsg(
"index row requires %zu bytes, maximum size is %zu",
261 int finalbit =
attnum & 0x07;
264 if ((~bp[
byte]) & ((1 << finalbit) - 1))
271 for (
i = 0;
i < byte;
i++)
283 tp = (
char *) tup + data_off;
294 if (att->attcacheoff >= 0)
295 return fetchatt(att, tp + att->attcacheoff);
319 int natts = tupleDesc->
natts;
340 for (;
j < natts;
j++)
344 if (att->attlen <= 0)
349 att->attcacheoff = off;
360 bool usecache =
true;
385 if (usecache && att->attcacheoff >= 0)
386 off = att->attcacheoff;
387 else if (att->attlen == -1)
397 att->attcacheoff = off;
411 att->attcacheoff = off;
419 if (usecache && att->attlen <= 0)
462 char *tp,
bits8 *bp,
int hasnulls)
464 int natts = tupleDescriptor->
natts;
486 if (!slow && thisatt->attcacheoff >= 0)
487 off = thisatt->attcacheoff;
488 else if (thisatt->attlen == -1)
498 thisatt->attcacheoff = off;
512 thisatt->attcacheoff = off;
519 if (thisatt->attlen <= 0)
535 memcpy(result,
source, size);
565 Assert(leavenatts <= sourceDescriptor->natts);
568 if (leavenatts == sourceDescriptor->
natts)
574 truncdesc->
natts = leavenatts;
static Datum values[MAXATTR]
struct varlena * detoast_external_attr(struct varlena *attr)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
#define TOAST_INDEX_TARGET
Size heap_compute_data_size(TupleDesc tupleDesc, Datum *values, bool *isnull)
void heap_fill_tuple(TupleDesc tupleDesc, Datum *values, bool *isnull, char *data, Size data_size, uint16 *infomask, bits8 *bit)
void index_deform_tuple(IndexTuple tup, TupleDesc tupleDescriptor, Datum *values, bool *isnull)
IndexTuple index_truncate_tuple(TupleDesc sourceDescriptor, IndexTuple source, int leavenatts)
IndexTuple index_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
IndexTuple CopyIndexTuple(IndexTuple source)
void index_deform_tuple_internal(TupleDesc tupleDescriptor, Datum *values, bool *isnull, char *tp, bits8 *bp, int hasnulls)
Datum nocache_index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc)
#define IndexTupleHasVarwidths(itup)
#define IndexTupleHasNulls(itup)
#define IndexInfoFindDataOffset(t_info)
IndexTupleData * IndexTuple
#define IndexTupleSize(itup)
struct IndexTupleData IndexTupleData
Assert(fmt[strlen(fmt) - 1] !='\n')
void pfree(void *pointer)
void * palloc0(Size size)
FormData_pg_attribute * Form_pg_attribute
static rewind_source * source
#define VARATT_IS_EXTENDED(PTR)
#define DatumGetPointer(X)
#define VARATT_IS_EXTERNAL(PTR)
#define PointerGetDatum(X)
Datum toast_compress_datum(Datum value, char cmethod)
void TupleDescCopy(TupleDesc dst, TupleDesc src)
#define TupleDescSize(src)
#define TupleDescAttr(tupdesc, i)
#define att_isnull(ATT, BITS)
#define att_align_pointer(cur_offset, attalign, attlen, attptr)
#define att_align_nominal(cur_offset, attalign)
#define att_addlength_pointer(cur_offset, attlen, attptr)