99 *
1010 *
1111 * IDENTIFICATION
12- * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.78 2002/07/20 05:16:56 momjian Exp $
12+ * $Header: /cvsroot/pgsql/src/backend/access/common/heaptuple.c,v 1.79 2002/08/24 15:00:45 tgl Exp $
1313 *
1414 * NOTES
1515 * The old interface functions have been converted to macros
@@ -48,7 +48,7 @@ ComputeDataSize(TupleDesc tupleDesc,
4848 if (nulls [i ] != ' ' )
4949 continue ;
5050
51- data_length = att_align (data_length , att [i ]-> attlen , att [ i ] -> attalign );
51+ data_length = att_align (data_length , att [i ]-> attalign );
5252 data_length = att_addlength (data_length , att [i ]-> attlen , value [i ]);
5353 }
5454
@@ -69,7 +69,7 @@ DataFill(char *data,
6969{
7070 bits8 * bitP = 0 ;
7171 int bitmask = 0 ;
72- uint32 data_length ;
72+ Size data_length ;
7373 int i ;
7474 int numberOfAttributes = tupleDesc -> natts ;
7575 Form_pg_attribute * att = tupleDesc -> attrs ;
@@ -105,12 +105,13 @@ DataFill(char *data,
105105 }
106106
107107 /* XXX we are aligning the pointer itself, not the offset */
108- data = (char * ) att_align ((long ) data , att [i ]-> attlen , att [ i ] -> attalign );
108+ data = (char * ) att_align ((long ) data , att [i ]-> attalign );
109109
110110 if (att [i ]-> attbyval )
111111 {
112112 /* pass-by-value */
113113 store_att_byval (data , value [i ], att [i ]-> attlen );
114+ data_length = att [i ]-> attlen ;
114115 }
115116 else if (att [i ]-> attlen == -1 )
116117 {
@@ -123,15 +124,22 @@ DataFill(char *data,
123124 data_length = VARATT_SIZE (DatumGetPointer (value [i ]));
124125 memcpy (data , DatumGetPointer (value [i ]), data_length );
125126 }
127+ else if (att [i ]-> attlen == -2 )
128+ {
129+ /* cstring */
130+ * infomask |= HEAP_HASVARLENA ;
131+ data_length = strlen (DatumGetCString (value [i ])) + 1 ;
132+ memcpy (data , DatumGetPointer (value [i ]), data_length );
133+ }
126134 else
127135 {
128136 /* fixed-length pass-by-reference */
129- Assert (att [i ]-> attlen >= 0 );
130- memcpy ( data , DatumGetPointer ( value [i ]),
131- ( size_t ) ( att [i ]-> attlen ) );
137+ Assert (att [i ]-> attlen > 0 );
138+ data_length = att [i ]-> attlen ;
139+ memcpy ( data , DatumGetPointer ( value [i ]), data_length );
132140 }
133141
134- data = ( char * ) att_addlength (( long ) data , att [ i ] -> attlen , value [ i ]) ;
142+ data += data_length ;
135143 }
136144}
137145
@@ -235,17 +243,16 @@ nocachegetattr(HeapTuple tuple,
235243 if (att [attnum ]-> attcacheoff != -1 )
236244 {
237245 return fetchatt (att [attnum ],
238- (char * ) tup + tup -> t_hoff + att [attnum ]-> attcacheoff );
246+ (char * ) tup + tup -> t_hoff +
247+ att [attnum ]-> attcacheoff );
239248 }
240249#endif
241250 }
242251 else
243252 {
244253 /*
245254 * there's a null somewhere in the tuple
246- */
247-
248- /*
255+ *
249256 * check to see if desired att is null
250257 */
251258
@@ -346,11 +353,7 @@ nocachegetattr(HeapTuple tuple,
346353 (HeapTupleNoNulls (tuple ) || !att_isnull (j , bp )) &&
347354 (HeapTupleAllFixed (tuple ) || att [j ]-> attlen > 0 )); j ++ )
348355 {
349- /*
350- * Fix me when going to a machine with more than a four-byte
351- * word!
352- */
353- off = att_align (off , att [j ]-> attlen , att [j ]-> attalign );
356+ off = att_align (off , att [j ]-> attalign );
354357
355358 att [j ]-> attcacheoff = off ;
356359
@@ -391,19 +394,19 @@ nocachegetattr(HeapTuple tuple,
391394 off = att [i ]-> attcacheoff ;
392395 else
393396 {
394- off = att_align (off , att [i ]-> attlen , att [ i ] -> attalign );
397+ off = att_align (off , att [i ]-> attalign );
395398
396399 if (usecache )
397400 att [i ]-> attcacheoff = off ;
398401 }
399402
400403 off = att_addlength (off , att [i ]-> attlen , tp + off );
401404
402- if (usecache && att [i ]-> attlen == -1 )
405+ if (usecache && att [i ]-> attlen <= 0 )
403406 usecache = false;
404407 }
405408
406- off = att_align (off , att [attnum ]-> attlen , att [ attnum ] -> attalign );
409+ off = att_align (off , att [attnum ]-> attalign );
407410
408411 return fetchatt (att [attnum ], tp + off );
409412 }
0 commit comments