Skip to content
Snippets Groups Projects
Commit 7540eda8 authored by Vadim B. Mikheev's avatar Vadim B. Mikheev
Browse files

Someone forgot about aligning in fastgetiattr()...

parent 9392a191
No related branches found
No related tags found
No related merge requests found
......@@ -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));
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment