OSDN Git Service

Someone forgot about aligning in fastgetiattr()...
authorVadim B. Mikheev <vadim4o@yahoo.com>
Thu, 12 Jun 1997 15:41:52 +0000 (15:41 +0000)
committerVadim B. Mikheev <vadim4o@yahoo.com>
Thu, 12 Jun 1997 15:41:52 +0000 (15:41 +0000)
src/backend/access/common/indextuple.c

index bb5925e..80e7c71 100644 (file)
@@ -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));
     }
 }