Thread: BUG #14984: function "heap_tuple_from_minimal_tuple" lostHeapTupleHeader->t_len value
BUG #14984: function "heap_tuple_from_minimal_tuple" lostHeapTupleHeader->t_len value
From
PG Bug reporting form
Date:
The following bug has been logged on the website: Bug reference: 14984 Logged by: bucoo hsiao Email address: bucoo@sohu.com PostgreSQL version: 10.1 Operating system: all Description: HeapTuple heap_tuple_from_minimal_tuple(MinimalTuple mtup) { HeapTuple result; uint32 len = mtup->t_len + MINIMAL_TUPLE_OFFSET; result = (HeapTuple) palloc(HEAPTUPLESIZE + len); result->t_len = len; ItemPointerSetInvalid(&(result->t_self)); result->t_tableOid = InvalidOid; result->t_data = (HeapTupleHeader) ((char *) result + HEAPTUPLESIZE); memcpy((char *) result->t_data + MINIMAL_TUPLE_OFFSET, mtup, mtup->t_len); memset(result->t_data, 0, offsetof(HeapTupleHeaderData, t_infomask2)); /* when memset return, result->t_data->t_len value lost should append code: HeapTupleHeaderSetDatumLength(result->t_data, len); */ return result; }
Re: BUG #14984: function "heap_tuple_from_minimal_tuple" lostHeapTupleHeader->t_len value
From
Andres Freund
Date:
Hi, On 2017-12-20 09:49:58 +0000, PG Bug reporting form wrote: > The following bug has been logged on the website: > > Bug reference: 14984 > Logged by: bucoo hsiao > Email address: bucoo@sohu.com > PostgreSQL version: 10.1 > Operating system: all > Description: This isn't really a complete bug report. How did you arrive at this being a problem? What triggers it? > HeapTuple > heap_tuple_from_minimal_tuple(MinimalTuple mtup) > { > HeapTuple result; > uint32 len = mtup->t_len + MINIMAL_TUPLE_OFFSET; > > result = (HeapTuple) palloc(HEAPTUPLESIZE + len); > result->t_len = len; > ItemPointerSetInvalid(&(result->t_self)); > result->t_tableOid = InvalidOid; > result->t_data = (HeapTupleHeader) ((char *) result + HEAPTUPLESIZE); > memcpy((char *) result->t_data + MINIMAL_TUPLE_OFFSET, mtup, > mtup->t_len); > memset(result->t_data, 0, offsetof(HeapTupleHeaderData, t_infomask2)); > /* when memset return, result->t_data->t_len value lost > should append code: > HeapTupleHeaderSetDatumLength(result->t_data, len); > */ There is no result->t_data->t_len. It's result->t_len. And calling HeapTupleHeaderSetDatumLength() wouldn't be right, because the returned value is an actual tuple, not a datum. Use heap_copy_tuple_as_datum() if you want that. Greetings, Andres Freund
Re: BUG #14984: function "heap_tuple_from_minimal_tuple" lost HeapTupleHeader->t_len value
From
Tom Lane
Date:
=?utf-8?q?PG_Bug_reporting_form?= <noreply@postgresql.org> writes: > memset(result->t_data, 0, offsetof(HeapTupleHeaderData, t_infomask2)); > /* when memset return, result->t_data->t_len value lost > should append code: > HeapTupleHeaderSetDatumLength(result->t_data, len); > */ As with #14985, you haven't shown any reason why this is a good change to make. regards, tom lane