summaryrefslogtreecommitdiff
path: root/mysys/queues.c
diff options
context:
space:
mode:
authormonty@donna.mysql.com <>2000-09-14 02:39:07 +0300
committermonty@donna.mysql.com <>2000-09-14 02:39:07 +0300
commitb581f17be222af50b399242353fd6df31b6b05d5 (patch)
tree47d3199e561726437875c3247556ac5797525366 /mysys/queues.c
parent7e543b4d4b67b7108d72bf1f1a8b22f99937c886 (diff)
downloadmariadb-git-b581f17be222af50b399242353fd6df31b6b05d5.tar.gz
Fixes for MERGE TABLES and HEAP tables
Diffstat (limited to 'mysys/queues.c')
-rw-r--r--mysys/queues.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/mysys/queues.c b/mysys/queues.c
index 40aa3c8db53..1c7a1a4a618 100644
--- a/mysys/queues.c
+++ b/mysys/queues.c
@@ -25,7 +25,7 @@
#include <queues.h>
- /* The actuall code for handling queues */
+/* Init queue */
int init_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
pbool max_at_top, int (*compare) (void *, byte *, byte *),
@@ -44,6 +44,12 @@ int init_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
DBUG_RETURN(0);
}
+/*
+ Reinitialize queue for new usage; Note that you can't currently resize
+ the number of elements! If you need this, fix it :)
+*/
+
+
int reinit_queue(QUEUE *queue, uint max_elements, uint offset_to_key,
pbool max_at_top, int (*compare) (void *, byte *, byte *),
void *first_cmp_arg)
@@ -78,6 +84,7 @@ void delete_queue(QUEUE *queue)
void queue_insert(register QUEUE *queue, byte *element)
{
reg2 uint idx,next;
+ int cmp;
#ifndef DBUG_OFF
if (queue->elements < queue->max_elements)
@@ -86,10 +93,12 @@ void queue_insert(register QUEUE *queue, byte *element)
queue->root[0]=element;
idx= ++queue->elements;
- while ((queue->compare(queue->first_cmp_arg,
- element+queue->offset_to_key,
- queue->root[(next=idx >> 1)]+queue->offset_to_key)
- ^ queue->max_at_top) < 0)
+ /* max_at_top swaps the comparison if we want to order by desc */
+ while ((cmp=queue->compare(queue->first_cmp_arg,
+ element+queue->offset_to_key,
+ queue->root[(next=idx >> 1)] +
+ queue->offset_to_key)) &&
+ (cmp ^ queue->max_at_top) < 0)
{
queue->root[idx]=queue->root[next];
idx=next;