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++)
78 untoasted_values[
i] = values[
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))
111 if (untoasted_free[i])
113 untoasted_values[
i] = cvalue;
114 untoasted_free[
i] =
true;
120 for (i = 0; i < numberOfAttributes; i++)
133 #ifdef TOAST_INDEX_HACK 135 untoasted_values, isnull);
140 size = hoff + data_size;
158 #ifdef TOAST_INDEX_HACK 159 for (i = 0; i < numberOfAttributes; i++)
161 if (untoasted_free[i])
176 #ifdef TOAST_INDEX_HACK 186 (
errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
187 errmsg(
"index row requires %zu bytes, maximum size is %zu",
188 size, (
Size) INDEX_SIZE_MASK)));
257 int byte = attnum >> 3;
258 int finalbit = attnum & 0x07;
261 if ((~bp[byte]) & ((1 << finalbit) - 1))
268 for (i = 0; i <
byte; i++)
280 tp = (
char *) tup + data_off;
291 if (att->attcacheoff >= 0)
292 return fetchatt(att, tp + att->attcacheoff);
303 for (j = 0; j <=
attnum; j++)
316 int natts = tupleDesc->
natts;
331 while (j < natts &&
TupleDescAttr(tupleDesc, j)->attcacheoff > 0)
337 for (; j < natts; j++)
341 if (att->attlen <= 0)
346 att->attcacheoff = off;
357 bool usecache =
true;
382 if (usecache && att->attcacheoff >= 0)
383 off = att->attcacheoff;
384 else if (att->attlen == -1)
394 att->attcacheoff = off;
408 att->attcacheoff = off;
416 if (usecache && att->attlen <= 0)
438 int natts = tupleDescriptor->
natts;
454 for (attnum = 0; attnum < natts; attnum++)
468 if (!slow && thisatt->attcacheoff >= 0)
469 off = thisatt->attcacheoff;
470 else if (thisatt->attlen == -1)
480 thisatt->attcacheoff = off;
494 thisatt->attcacheoff = off;
501 if (thisatt->attlen <= 0)
517 memcpy(result, source, size);
547 Assert(leavenatts <= sourceDescriptor->natts);
550 if (leavenatts == sourceDescriptor->
natts)
556 truncdesc->
natts = leavenatts;
void heap_fill_tuple(TupleDesc tupleDesc, Datum *values, bool *isnull, char *data, Size data_size, uint16 *infomask, bits8 *bit)
#define IndexInfoFindDataOffset(t_info)
#define att_align_nominal(cur_offset, attalign)
#define att_isnull(ATT, BITS)
#define PointerGetDatum(X)
#define TupleDescAttr(tupdesc, i)
struct varlena * detoast_external_attr(struct varlena *attr)
int errcode(int sqlerrcode)
#define IndexTupleHasNulls(itup)
#define TupleDescSize(src)
#define VARATT_IS_EXTERNAL(PTR)
IndexTuple index_form_tuple(TupleDesc tupleDescriptor, Datum *values, bool *isnull)
void pfree(void *pointer)
#define TOAST_INDEX_TARGET
IndexTuple CopyIndexTuple(IndexTuple source)
IndexTupleData * IndexTuple
IndexTuple index_truncate_tuple(TupleDesc sourceDescriptor, IndexTuple source, int leavenatts)
FormData_pg_attribute * Form_pg_attribute
void index_deform_tuple(IndexTuple tup, TupleDesc tupleDescriptor, Datum *values, bool *isnull)
#define att_addlength_pointer(cur_offset, attlen, attptr)
Datum nocache_index_getattr(IndexTuple tup, int attnum, TupleDesc tupleDesc)
void * palloc0(Size size)
struct IndexTupleData IndexTupleData
#define att_align_pointer(cur_offset, attalign, attlen, attptr)
#define ereport(elevel,...)
#define Assert(condition)
static rewind_source * source
#define IndexTupleHasVarwidths(itup)
Size heap_compute_data_size(TupleDesc tupleDesc, Datum *values, bool *isnull)
#define VARATT_IS_EXTENDED(PTR)
#define DatumGetPointer(X)
static Datum values[MAXATTR]
void TupleDescCopy(TupleDesc dst, TupleDesc src)
Datum toast_compress_datum(Datum value)
int errmsg(const char *fmt,...)
#define IndexTupleSize(itup)