|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.43 1998/09/04 18:21:10 momjian Exp $ |
| 11 | + * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.44 1998/09/07 05:35:27 momjian Exp $ |
12 | 12 | * |
13 | 13 | * NOTES |
14 | 14 | * The old interface functions have been converted to macros |
@@ -68,44 +68,8 @@ ComputeDataSize(TupleDesc tupleDesc, |
68 | 68 | if (nulls[i]!=' ') |
69 | 69 | continue; |
70 | 70 |
|
71 | | -switch (att[i]->attlen) |
72 | | -{ |
73 | | -case-1: |
74 | | - |
75 | | -/* |
76 | | - * This is the size of the disk representation and so must |
77 | | - * include the additional sizeof long. |
78 | | - */ |
79 | | -if (att[i]->attalign=='d') |
80 | | -{ |
81 | | -data_length=DOUBLEALIGN(data_length) |
82 | | -+VARSIZE(DatumGetPointer(value[i])); |
83 | | -} |
84 | | -else |
85 | | -{ |
86 | | -data_length=INTALIGN(data_length) |
87 | | -+VARSIZE(DatumGetPointer(value[i])); |
88 | | -} |
89 | | -break; |
90 | | -casesizeof(char): |
91 | | -data_length++; |
92 | | -break; |
93 | | -casesizeof(short): |
94 | | -data_length=SHORTALIGN(data_length+sizeof(short)); |
95 | | -break; |
96 | | -casesizeof(int32): |
97 | | -data_length=INTALIGN(data_length+sizeof(int32)); |
98 | | -break; |
99 | | -default: |
100 | | -if (att[i]->attlen<sizeof(int32)) |
101 | | -elog(ERROR,"ComputeDataSize: attribute %d has len %d", |
102 | | -i,att[i]->attlen); |
103 | | -if (att[i]->attalign=='d') |
104 | | -data_length=DOUBLEALIGN(data_length)+att[i]->attlen; |
105 | | -else |
106 | | -data_length=LONGALIGN(data_length)+att[i]->attlen; |
107 | | -break; |
108 | | -} |
| 71 | +data_length=att_align(data_length,att[i]->attlen,att[i]->attalign); |
| 72 | +data_length=att_addlength(data_length,att[i]->attlen,value[i]); |
109 | 73 | } |
110 | 74 |
|
111 | 75 | returndata_length; |
@@ -160,57 +124,34 @@ DataFill(char *data, |
160 | 124 | *bitP |=bitmask; |
161 | 125 | } |
162 | 126 |
|
| 127 | +data= (char*)att_align((long)data,att[i]->attlen,att[i]->attalign); |
163 | 128 | switch (att[i]->attlen) |
164 | 129 | { |
165 | 130 | case-1: |
166 | 131 | *infomask |=HEAP_HASVARLENA; |
167 | | -if (att[i]->attalign=='d') |
168 | | -data= (char*)DOUBLEALIGN(data); |
169 | | -else |
170 | | -data= (char*)INTALIGN(data); |
171 | 132 | data_length=VARSIZE(DatumGetPointer(value[i])); |
172 | 133 | memmove(data,DatumGetPointer(value[i]),data_length); |
173 | | -data+=data_length; |
174 | 134 | break; |
175 | 135 | casesizeof(char): |
176 | 136 | *data=att[i]->attbyval ? |
177 | 137 | DatumGetChar(value[i]) :*((char*)value[i]); |
178 | | -data+=sizeof(char); |
179 | 138 | break; |
180 | 139 | casesizeof(int16): |
181 | | -data= (char*)SHORTALIGN(data); |
182 | 140 | *(short*)data= (att[i]->attbyval ? |
183 | 141 | DatumGetInt16(value[i]) : |
184 | 142 | *((short*)value[i])); |
185 | | -data+=sizeof(short); |
186 | 143 | break; |
187 | 144 | casesizeof(int32): |
188 | | -data= (char*)INTALIGN(data); |
189 | 145 | *(int32*)data= (att[i]->attbyval ? |
190 | 146 | DatumGetInt32(value[i]) : |
191 | 147 | *((int32*)value[i])); |
192 | | -data+=sizeof(int32); |
193 | 148 | break; |
194 | 149 | default: |
195 | | -if (att[i]->attlen<sizeof(int32)) |
196 | | -elog(ERROR,"DataFill: attribute %d has len %d", |
197 | | -i,att[i]->attlen); |
198 | | -if (att[i]->attalign=='d') |
199 | | -{ |
200 | | -data= (char*)DOUBLEALIGN(data); |
201 | | -memmove(data,DatumGetPointer(value[i]), |
202 | | -att[i]->attlen); |
203 | | -data+=att[i]->attlen; |
204 | | -} |
205 | | -else |
206 | | -{ |
207 | | -data= (char*)LONGALIGN(data); |
208 | | -memmove(data,DatumGetPointer(value[i]), |
209 | | -att[i]->attlen); |
210 | | -data+=att[i]->attlen; |
211 | | -} |
| 150 | +memmove(data,DatumGetPointer(value[i]), |
| 151 | +att[i]->attlen); |
212 | 152 | break; |
213 | 153 | } |
| 154 | +data= (char*)att_addlength((long)data,att[i]->attlen,value[i]); |
214 | 155 | } |
215 | 156 | } |
216 | 157 |
|
@@ -557,53 +498,11 @@ nocachegetattr(HeapTuple tup, |
557 | 498 | * Fix me when going to a machine with more than a four-byte |
558 | 499 | * word! |
559 | 500 | */ |
560 | | - |
561 | | -switch (att[j]->attlen) |
562 | | -{ |
563 | | -case-1: |
564 | | -off= (att[j]->attalign=='d') ? |
565 | | -DOUBLEALIGN(off) :INTALIGN(off); |
566 | | -break; |
567 | | -casesizeof(char): |
568 | | -break; |
569 | | -casesizeof(short): |
570 | | -off=SHORTALIGN(off); |
571 | | -break; |
572 | | -casesizeof(int32): |
573 | | -off=INTALIGN(off); |
574 | | -break; |
575 | | -default: |
576 | | -if (att[j]->attlen>sizeof(int32)) |
577 | | -off= (att[j]->attalign=='d') ? |
578 | | -DOUBLEALIGN(off) :LONGALIGN(off); |
579 | | -else |
580 | | -elog(ERROR,"nocache_index_getattr: attribute %d has len %d", |
581 | | -j,att[j]->attlen); |
582 | | -break; |
583 | | -} |
| 501 | +off=att_align(off,att[j]->attlen,att[j]->attalign); |
584 | 502 |
|
585 | 503 | att[j]->attcacheoff=off; |
586 | 504 |
|
587 | | -switch (att[j]->attlen) |
588 | | -{ |
589 | | -casesizeof(char): |
590 | | -off++; |
591 | | -break; |
592 | | -casesizeof(short): |
593 | | -off+=sizeof(short); |
594 | | -break; |
595 | | -casesizeof(int32): |
596 | | -off+=sizeof(int32); |
597 | | -break; |
598 | | -case-1: |
599 | | -Assert(!VARLENA_FIXED_SIZE(att[j])|| |
600 | | -att[j]->atttypmod==VARSIZE(tp+off)); |
601 | | -off+=VARSIZE(tp+off); |
602 | | -break; |
603 | | -default: |
604 | | -off+=att[j]->attlen; |
605 | | -break; |
606 | | -} |
| 505 | +off=att_addlength(off,att[j]->attlen,tp+off); |
607 | 506 | } |
608 | 507 |
|
609 | 508 | return (Datum)fetchatt(&(att[attnum]),tp+att[attnum]->attcacheoff); |
@@ -640,84 +539,20 @@ nocachegetattr(HeapTuple tup, |
640 | 539 | off=att[i]->attcacheoff; |
641 | 540 | else |
642 | 541 | { |
643 | | -switch (att[i]->attlen) |
644 | | -{ |
645 | | -case-1: |
646 | | -off= (att[i]->attalign=='d') ? |
647 | | -DOUBLEALIGN(off) :INTALIGN(off); |
648 | | -break; |
649 | | -casesizeof(char): |
650 | | -break; |
651 | | -casesizeof(short): |
652 | | -off=SHORTALIGN(off); |
653 | | -break; |
654 | | -casesizeof(int32): |
655 | | -off=INTALIGN(off); |
656 | | -break; |
657 | | -default: |
658 | | -if (att[i]->attlen<sizeof(int32)) |
659 | | -elog(ERROR, |
660 | | -"nocachegetattr2: attribute %d has len %d", |
661 | | -i,att[i]->attlen); |
662 | | -if (att[i]->attalign=='d') |
663 | | -off=DOUBLEALIGN(off); |
664 | | -else |
665 | | -off=LONGALIGN(off); |
666 | | -break; |
667 | | -} |
| 542 | +off=att_align(off,att[i]->attlen,att[i]->attalign); |
| 543 | + |
668 | 544 | if (usecache) |
669 | 545 | att[i]->attcacheoff=off; |
670 | 546 | } |
671 | 547 |
|
672 | | -switch (att[i]->attlen) |
673 | | -{ |
674 | | -casesizeof(char): |
675 | | -off++; |
676 | | -break; |
677 | | -casesizeof(short): |
678 | | -off+=sizeof(short); |
679 | | -break; |
680 | | -casesizeof(int32): |
681 | | -off+=sizeof(int32); |
682 | | -break; |
683 | | -case-1: |
684 | | -Assert(!VARLENA_FIXED_SIZE(att[i])|| |
685 | | -att[i]->atttypmod==VARSIZE(tp+off)); |
686 | | -off+=VARSIZE(tp+off); |
687 | | -if (!VARLENA_FIXED_SIZE(att[i])) |
688 | | -usecache= false; |
689 | | -break; |
690 | | -default: |
691 | | -off+=att[i]->attlen; |
692 | | -break; |
693 | | -} |
694 | | -} |
| 548 | +off=att_addlength(off,att[i]->attlen,tp+off); |
695 | 549 |
|
696 | | -switch (att[attnum]->attlen) |
697 | | -{ |
698 | | -case-1: |
699 | | -off= (att[attnum]->attalign=='d') ? |
700 | | -DOUBLEALIGN(off) :INTALIGN(off); |
701 | | -break; |
702 | | -casesizeof(char): |
703 | | -break; |
704 | | -casesizeof(short): |
705 | | -off=SHORTALIGN(off); |
706 | | -break; |
707 | | -casesizeof(int32): |
708 | | -off=INTALIGN(off); |
709 | | -break; |
710 | | -default: |
711 | | -if (att[attnum]->attlen<sizeof(int32)) |
712 | | -elog(ERROR,"nocachegetattr3: attribute %d has len %d", |
713 | | -attnum,att[attnum]->attlen); |
714 | | -if (att[attnum]->attalign=='d') |
715 | | -off=DOUBLEALIGN(off); |
716 | | -else |
717 | | -off=LONGALIGN(off); |
718 | | -break; |
| 550 | +if (att[i]->attlen==-1&& !VARLENA_FIXED_SIZE(att[i])) |
| 551 | +usecache= false; |
719 | 552 | } |
720 | 553 |
|
| 554 | +off=att_align(off,att[attnum]->attlen,att[attnum]->attalign); |
| 555 | + |
721 | 556 | return (Datum)fetchatt(&(att[attnum]),tp+off); |
722 | 557 | } |
723 | 558 | } |
|