*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/common/indextuple.c,v 1.13 1997/03/26 02:24:38 vadim Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/common/indextuple.c,v 1.14 1997/06/12 15:41:52 vadim Exp $
*
*-------------------------------------------------------------------------
*/
register char *bp = NULL; /* ptr to att in tuple */
int slow; /* do we have to walk nulls? */
register int data_off; /* tuple data offset */
+ AttributeTupleForm *att = tupleDesc->attrs;
/* ----------------
* sanity checks
/* first attribute is always at position zero */
if (attnum == 1) {
- return(fetchatt(&(tupleDesc->attrs[0]), (char *) tup + data_off));
+ return(fetchatt(&(att[0]), (char *) tup + data_off));
}
attnum--;
- if (tupleDesc->attrs[attnum]->attcacheoff > 0) {
- return(fetchatt(&(tupleDesc->attrs[attnum]),
+ if (att[attnum]->attcacheoff > 0) {
+ return(fetchatt(&(att[attnum]),
(char *) tup + data_off +
- tupleDesc->attrs[attnum]->attcacheoff));
+ att[attnum]->attcacheoff));
}
tp = (char *) tup + data_off;
/* now check for any non-fixed length attrs before our attribute */
if (!slow) {
- if (tupleDesc->attrs[attnum]->attcacheoff > 0) {
- return(fetchatt(&(tupleDesc->attrs[attnum]),
- tp + tupleDesc->attrs[attnum]->attcacheoff));
+ if (att[attnum]->attcacheoff > 0) {
+ return(fetchatt(&(att[attnum]),
+ tp + att[attnum]->attcacheoff));
}else if (!IndexTupleAllFixed(tup)) {
register int j = 0;
for (j = 0; j < attnum && !slow; j++)
- if (tupleDesc->attrs[j]->attlen < 1) slow = 1;
+ if (att[j]->attlen < 1) slow = 1;
}
}
* need to set cache for some atts
*/
- tupleDesc->attrs[0]->attcacheoff = 0;
+ att[0]->attcacheoff = 0;
- while (tupleDesc->attrs[j]->attcacheoff > 0) j++;
+ while (att[j]->attcacheoff > 0) j++;
- off = tupleDesc->attrs[j-1]->attcacheoff +
- tupleDesc->attrs[j-1]->attlen;
+ off = att[j-1]->attcacheoff +
+ att[j-1]->attlen;
for (; j < attnum + 1; j++) {
/*
* word!
*/
- switch(tupleDesc->attrs[j]->attlen)
+ switch(att[j]->attlen)
{
case -1:
- off = (tupleDesc->attrs[j]->attalign=='d')?
+ off = (att[j]->attalign=='d')?
DOUBLEALIGN(off):INTALIGN(off);
break;
case sizeof(char):
off = INTALIGN(off);
break;
default:
- if (tupleDesc->attrs[j]->attlen > sizeof(int32))
- off = (tupleDesc->attrs[j]->attalign=='d')?
+ if (att[j]->attlen > sizeof(int32))
+ off = (att[j]->attalign=='d')?
DOUBLEALIGN(off) : LONGALIGN(off);
else
elog(WARN, "fastgetiattr: attribute %d has len %d",
- j, tupleDesc->attrs[j]->attlen);
+ j, att[j]->attlen);
break;
}
- tupleDesc->attrs[j]->attcacheoff = off;
- off += tupleDesc->attrs[j]->attlen;
+ att[j]->attcacheoff = off;
+ off += att[j]->attlen;
}
- return(fetchatt( &(tupleDesc->attrs[attnum]),
- tp + tupleDesc->attrs[attnum]->attcacheoff));
+ return(fetchatt( &(att[attnum]),
+ tp + att[attnum]->attcacheoff));
}else {
register bool usecache = true;
register int off = 0;
}
}
- if (usecache && tupleDesc->attrs[i]->attcacheoff > 0) {
- off = tupleDesc->attrs[i]->attcacheoff;
- if (tupleDesc->attrs[i]->attlen == -1)
+ if (usecache && att[i]->attcacheoff > 0) {
+ off = att[i]->attcacheoff;
+ if (att[i]->attlen == -1)
usecache = false;
else
continue;
}
- if (usecache) tupleDesc->attrs[i]->attcacheoff = off;
- switch(tupleDesc->attrs[i]->attlen)
+ if (usecache) att[i]->attcacheoff = off;
+ switch(att[i]->attlen)
{
case sizeof(char):
off++;
break;
case -1:
usecache = false;
- off = (tupleDesc->attrs[i]->attalign=='d')?
+ off = (att[i]->attalign=='d')?
DOUBLEALIGN(off):INTALIGN(off);
off += VARSIZE(tp + off);
break;
default:
- if (tupleDesc->attrs[i]->attlen > sizeof(int32))
- off = (tupleDesc->attrs[i]->attalign=='d') ?
- DOUBLEALIGN(off) + tupleDesc->attrs[i]->attlen :
- LONGALIGN(off) + tupleDesc->attrs[i]->attlen;
+ if (att[i]->attlen > sizeof(int32))
+ off = (att[i]->attalign=='d') ?
+ DOUBLEALIGN(off) + att[i]->attlen :
+ LONGALIGN(off) + att[i]->attlen;
else
elog(WARN, "fastgetiattr2: attribute %d has len %d",
- i, tupleDesc->attrs[i]->attlen);
+ i, att[i]->attlen);
break;
}
}
+ /*
+ * I don't know why this code was missed here!
+ * I've got it from heaptuple.c:fastgetattr().
+ * - vadim 06/12/97
+ */
+ switch (att[attnum]->attlen) {
+ case -1:
+ off = (att[attnum]->attalign=='d')?
+ DOUBLEALIGN(off) : INTALIGN(off);
+ break;
+ case sizeof(char):
+ break;
+ case sizeof(short):
+ off = SHORTALIGN(off);
+ break;
+ case sizeof(int32):
+ off = INTALIGN(off);
+ break;
+ default:
+ if (att[attnum]->attlen < sizeof(int32))
+ elog(WARN, "fastgetattr3: attribute %d has len %d",
+ attnum, att[attnum]->attlen);
+ if (att[attnum]->attalign == 'd')
+ off = DOUBLEALIGN(off);
+ else
+ off = LONGALIGN(off);
+ break;
+ }
- return(fetchatt(&tupleDesc->attrs[attnum], tp + off));
+ return(fetchatt(&att[attnum], tp + off));
}
}