Re: minimal update
От | Andrew Dunstan |
---|---|
Тема | Re: minimal update |
Дата | |
Msg-id | 4775DDBD.4050005@dunslane.net обсуждение исходный текст |
Ответ на | Re: minimal update (Andrew Dunstan <andrew@dunslane.net>) |
Список | pgsql-hackers |
Andrew Dunstan wrote: > > > Tom Lane wrote: >> Andrew Dunstan <andrew@dunslane.net> writes: >> >>> How does this look? >>> >> >> >>> if (newtuple->t_len == oldtuple->t_len && >>> newtuple->t_data->t_hoff == oldtuple->t_data->t_hoff && >>> HeapTupleHeaderGetNatts(newtuple) == >>> HeapTupleHeaderGetNatts(oldtuple) && >>> (newtuple->t_data->t_infomask & (HEAP_HASOID|HEAP_HASNULL)) >>> == (oldtuple->t_data->t_infomask & (HEAP_HASOID|HEAP_HASNULL)) && >>> memcmp(newtuple->t_data + offsetof(HeapTupleHeaderData, >>> t_bits), >>> oldtuple->t_data + offsetof(HeapTupleHeaderData, t_bits) >>> newtuple->t_len - offsetof(HeapTupleHeaderData, >>> t_bits)) == 0) >>> >> >> >>> rettuple = NULL; >>> >> >> Looks sane. It might be even saner if you compare all of the >> non-visibility-related infomask bits, viz >> >> (newtuple->t_data->t_infomask & ~HEAP_XACT_MASK) == >> (oldtuple->t_data->t_infomask & ~HEAP_XACT_MASK) >> >> rather than just HASOID and HASNULL. >> >> >> > > Sadly, the memcmp is failing on my test ("update foo set bar = bar") > on 8.2. Looks like I'm in for weekend with my fave debugger :-( > > Turns out we needed those pointers used in the arguments to memcmp cast to char * so the pointer arithmetic would work right. I'll be suggesting we add a utility function like this for 8.4. cheers andrew
В списке pgsql-hackers по дате отправления: