From 3c5f6aa21c54e2f93c96162a23f2e32772cf50bf Mon Sep 17 00:00:00 2001 From: Varun Gupta Date: Sun, 14 Oct 2018 10:30:23 -0700 Subject: MDEV-17020: Assertion `length > 0' failed in ptr_compare upon ORDER BY with bad conversion This assert is hit when we do filesort using the priority queue and try to insert elements in the queue. The compare function used for the priority queue should handle the case for zerolength sortkey. --- mysys/ptr_cmp.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'mysys/ptr_cmp.c') diff --git a/mysys/ptr_cmp.c b/mysys/ptr_cmp.c index 6e373e98972..c9306dff14f 100644 --- a/mysys/ptr_cmp.c +++ b/mysys/ptr_cmp.c @@ -52,6 +52,11 @@ static int ptr_compare_0(size_t *compare_length, uchar **a, uchar **b); static int ptr_compare_1(size_t *compare_length, uchar **a, uchar **b); static int ptr_compare_2(size_t *compare_length, uchar **a, uchar **b); static int ptr_compare_3(size_t *compare_length, uchar **a, uchar **b); +static int degenerate_compare_func(size_t *compare_length, uchar **a, uchar **b) +{ + DBUG_ASSERT(*compare_length == 0); + return 0; +} #endif /* __sun */ /* Get a pointer to a optimal byte-compare function for a given size */ @@ -64,6 +69,8 @@ qsort2_cmp get_ptr_compare (size_t size __attribute__((unused))) #else qsort2_cmp get_ptr_compare (size_t size) { + if (size == 0) + return (qsort2_cmp) degenerate_compare_func; if (size < 4) return (qsort2_cmp) ptr_compare; switch (size & 3) { -- cgit v1.2.1