1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-03 20:02:46 +03:00

Reset the binary heap in MergeAppend rescans.

Failing to do so can cause queries to return wrong data, error out or crash.
This requires adding a new binaryheap_reset() method to binaryheap.c,
but that probably should have been there anyway.

Per bug #8410 from Terje Elde.  Diagnosis and patch by Andres Freund.
This commit is contained in:
Tom Lane
2013-08-30 19:15:21 -04:00
parent 9381cb5229
commit 8e2b71d2d0
3 changed files with 19 additions and 3 deletions

View File

@ -36,16 +36,30 @@ binaryheap_allocate(int capacity, binaryheap_comparator compare, void *arg)
binaryheap *heap;
sz = offsetof(binaryheap, bh_nodes) +sizeof(Datum) * capacity;
heap = palloc(sz);
heap->bh_size = 0;
heap = (binaryheap *) palloc(sz);
heap->bh_space = capacity;
heap->bh_has_heap_property = true;
heap->bh_compare = compare;
heap->bh_arg = arg;
heap->bh_size = 0;
heap->bh_has_heap_property = true;
return heap;
}
/*
* binaryheap_reset
*
* Resets the heap to an empty state, losing its data content but not the
* parameters passed at allocation.
*/
void
binaryheap_reset(binaryheap *heap)
{
heap->bh_size = 0;
heap->bh_has_heap_property = true;
}
/*
* binaryheap_free
*