postgresql/src/backend/lib
Heikki Linnakangas 931bf3eb9b Fix a bug in pairing heap removal code.
After removal, the next_sibling pointer of a node was sometimes incorrectly
left to point to another node in the heap, which meant that a node was
sometimes linked twice into the heap. Surprisingly that didn't cause any
crashes in my testing, but it was clearly wrong and could easily segfault
in other scenarios.

Also always keep the prev_or_parent pointer as NULL on the root node. That
was not a correctness issue AFAICS, but let's be tidy.

Add a debugging function, to dump the contents of a pairing heap as a
string. It's #ifdef'd out, as it's not used for anything in any normal
code, but it was highly useful in debugging this. Let's keep it handy for
further reference.
2015-02-17 22:55:53 +02:00
..
Makefile Use abbreviated keys for faster sorting of text datums. 2015-01-19 15:28:27 -05:00
README Fix typos, update README. 2015-01-23 15:06:53 -05:00
binaryheap.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
hyperloglog.c Add an explicit cast to Size to hyperloglog.c 2015-01-23 11:44:51 -05:00
ilist.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
pairingheap.c Fix a bug in pairing heap removal code. 2015-02-17 22:55:53 +02:00
rbtree.c Update copyright for 2015 2015-01-06 11:43:47 -05:00
stringinfo.c Update copyright for 2015 2015-01-06 11:43:47 -05:00

README

This directory contains a general purpose data structures, for use anywhere
in the backend:

binaryheap.c - a binary heap

hyperloglog.c - a streaming cardinality estimator

pairingheap.c - a pairing heap

rbtree.c - a red-black tree

ilist.c - single and double-linked lists.

stringinfo.c - an extensible string type


Aside from the inherent characteristics of the data structures, there are a
few practical differences between the binary heap and the pairing heap. The
binary heap is fully allocated at creation, and cannot be expanded beyond the
allocated size. The pairing heap on the other hand has no inherent maximum
size, but the caller needs to allocate each element being stored in the heap,
while the binary heap works with plain Datums or pointers.

The linked-lists in ilist.c can be embedded directly into other structs, as
opposed to the List interface in nodes/pg_list.h.