• unknown's avatar
    Bug #31890 Partitions: ORDER BY DESC in InnoDB not working. · c33c92d0
    unknown authored
    It's not InnoDB specific bug.
    Error is in QUEUE code, about the way we handle queue->max_at_top.
    It's either '0' or '-2' and we do '^' operation to get the proper
    direction. Though queue->compare() function can return '-2' as
    a result of comparison sometimes. So we'll get
    queue->compare() ^ queue->max_at_top == 0 (when max_at_top is -2)
    and _downheap() function code will go wrong way here:
    ...
        if (next_index < elements &&
            (queue->compare(queue->first_cmp_arg,
                            queue->root[next_index]+offset_to_key,
                            queue->root[next_index+1]+offset_to_key) ^
             queue->max_at_top) > 0)
          next_index++;
    ...
    
    Fixed by changing max_at_top to be either 1 or -1, doing
    '* max_at_top' to get proper direction.
    
    
    include/queues.h:
      Bug #31890 Partitions: ORDER BY DESC in InnoDB not working
      
      max_at_top policy changed
    mysql-test/r/partition.result:
      Bug #31890 Partitions: ORDER BY DESC in InnoDB not working
      
      test result
    mysql-test/t/partition.test:
      Bug #31890 Partitions: ORDER BY DESC in InnoDB not working
      
      test case
    mysys/queues.c:
      Bug #31890 Partitions: ORDER BY DESC in InnoDB not working.
      
      queue->max_at_top policy changed - now it can either be '1' or '-1'.
      We multiply comparison result on max_at_top to get the proper
      direction.
    c33c92d0
queues.c 16.1 KB