Skip to content
Snippets Groups Projects
Commit 35334ca1 authored by Vladimir Davydov's avatar Vladimir Davydov
Browse files

Fix a low-probability crash in our qsort implementation

This is a backport of commit
https://github.com/postgres/postgres/commit/9d6077abf9d6efd992a59f05ef5aba981ea32096

It's standard for quicksort implementations, after having partitioned the
input into two subgroups, to recurse to process the smaller partition and
then handle the larger partition by iterating.  This method guarantees
that no more than log2(N) levels of recursion can be needed.  However,
Bentley and McIlroy argued that checking to see which partition is smaller
isn't worth the cycles, and so their code doesn't do that but just always
recurses on the left partition.  In most cases that's fine; but with
worst-case input we might need O(N) levels of recursion, and that means
that qsort could be driven to stack overflow.  Such an overflow seems to
be the only explanation for today's report from Yiqing Jin of a SIGSEGV
in med3_tuple while creating an index of a couple billion entries with a
very large maintenance_work_mem setting.  Therefore, let's spend the few
additional cycles and lines of code needed to choose the smaller partition
for recursion.

NO_DOC=bug fix
NO_TEST=backport

(cherry picked from commit adc5c05e)
parent 233e7fc1
No related branches found
No related tags found
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment