|
8 | 8 | * |
9 | 9 | * |
10 | 10 | * IDENTIFICATION |
11 | | - * $PostgreSQL: pgsql/src/backend/utils/adt/rowtypes.c,v 1.8 2004/12/31 22:01:22 pgsql Exp $ |
| 11 | + * $PostgreSQL: pgsql/src/backend/utils/adt/rowtypes.c,v 1.9 2005/04/18 17:11:05 tgl Exp $ |
12 | 12 | * |
13 | 13 | *------------------------------------------------------------------------- |
14 | 14 | */ |
@@ -54,6 +54,7 @@ record_in(PG_FUNCTION_ARGS) |
54 | 54 | { |
55 | 55 | char *string = PG_GETARG_CSTRING(0); |
56 | 56 | Oid tupType = PG_GETARG_OID(1); |
| 57 | + HeapTupleHeader result; |
57 | 58 | int32 tupTypmod; |
58 | 59 | TupleDesc tupdesc; |
59 | 60 | HeapTuple tuple; |
@@ -244,11 +245,20 @@ record_in(PG_FUNCTION_ARGS) |
244 | 245 |
|
245 | 246 | tuple = heap_formtuple(tupdesc, values, nulls); |
246 | 247 |
|
| 248 | + /* |
| 249 | + * We cannot return tuple->t_data because heap_formtuple allocates it |
| 250 | + * as part of a larger chunk, and our caller may expect to be able to |
| 251 | + * pfree our result. So must copy the info into a new palloc chunk. |
| 252 | + */ |
| 253 | + result = (HeapTupleHeader) palloc(tuple->t_len); |
| 254 | + memcpy(result, tuple->t_data, tuple->t_len); |
| 255 | + |
| 256 | + heap_freetuple(tuple); |
247 | 257 | pfree(buf.data); |
248 | 258 | pfree(values); |
249 | 259 | pfree(nulls); |
250 | 260 |
|
251 | | - PG_RETURN_HEAPTUPLEHEADER(tuple->t_data); |
| 261 | + PG_RETURN_HEAPTUPLEHEADER(result); |
252 | 262 | } |
253 | 263 |
|
254 | 264 | /* |
@@ -419,6 +429,7 @@ record_recv(PG_FUNCTION_ARGS) |
419 | 429 | { |
420 | 430 | StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); |
421 | 431 | Oid tupType = PG_GETARG_OID(1); |
| 432 | + HeapTupleHeader result; |
422 | 433 | int32 tupTypmod; |
423 | 434 | TupleDesc tupdesc; |
424 | 435 | HeapTuple tuple; |
@@ -580,10 +591,19 @@ record_recv(PG_FUNCTION_ARGS) |
580 | 591 |
|
581 | 592 | tuple = heap_formtuple(tupdesc, values, nulls); |
582 | 593 |
|
| 594 | + /* |
| 595 | + * We cannot return tuple->t_data because heap_formtuple allocates it |
| 596 | + * as part of a larger chunk, and our caller may expect to be able to |
| 597 | + * pfree our result. So must copy the info into a new palloc chunk. |
| 598 | + */ |
| 599 | + result = (HeapTupleHeader) palloc(tuple->t_len); |
| 600 | + memcpy(result, tuple->t_data, tuple->t_len); |
| 601 | + |
| 602 | + heap_freetuple(tuple); |
583 | 603 | pfree(values); |
584 | 604 | pfree(nulls); |
585 | 605 |
|
586 | | - PG_RETURN_HEAPTUPLEHEADER(tuple->t_data); |
| 606 | + PG_RETURN_HEAPTUPLEHEADER(result); |
587 | 607 | } |
588 | 608 |
|
589 | 609 | /* |
|
0 commit comments