Someone forgot about aligning in fastgetiattr()...
This commit is contained in:
parent
9392a19196
commit
7540eda8f4
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
*
|
||||
* 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 $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
|
@ -135,6 +135,7 @@ fastgetiattr(IndexTuple tup,
|
|||
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
|
||||
|
@ -162,14 +163,14 @@ fastgetiattr(IndexTuple tup,
|
|||
/* 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;
|
||||
|
@ -226,14 +227,14 @@ fastgetiattr(IndexTuple tup,
|
|||
/* 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -251,12 +252,12 @@ fastgetiattr(IndexTuple tup,
|
|||
* 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++) {
|
||||
/*
|
||||
|
@ -264,10 +265,10 @@ fastgetiattr(IndexTuple tup,
|
|||
* 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):
|
||||
|
@ -279,22 +280,22 @@ fastgetiattr(IndexTuple tup,
|
|||
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;
|
||||
|
@ -312,16 +313,16 @@ fastgetiattr(IndexTuple tup,
|
|||
}
|
||||
}
|
||||
|
||||
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++;
|
||||
|
@ -334,24 +335,52 @@ fastgetiattr(IndexTuple tup,
|
|||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue