summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <serg@serg.mysql.com>2002-11-25 22:18:44 +0100
committerunknown <serg@serg.mysql.com>2002-11-25 22:18:44 +0100
commit4ea2f42e33e1846335c1321fcd4d438d075c8e06 (patch)
tree02a55f44bad9f485e0d76216a95e10c2aafa692c
parent1049175831a4aa145f64e912388cc6079d7f5789 (diff)
downloadmariadb-git-4ea2f42e33e1846335c1321fcd4d438d075c8e06.tar.gz
myisammrg::index_next_same
myisammrg/Makefile.am: myrg_rnext_same.c added
-rw-r--r--include/myisammrg.h1
-rw-r--r--myisam/mi_rkey.c17
-rw-r--r--myisam/mi_rrnd.c5
-rw-r--r--myisam/myisamdef.h6
-rw-r--r--myisammrg/Makefile.am3
-rw-r--r--myisammrg/myrg_rkey.c4
-rw-r--r--myisammrg/myrg_rnext_same.c40
-rw-r--r--sql/ha_myisammrg.cc10
-rw-r--r--sql/ha_myisammrg.h11
9 files changed, 79 insertions, 18 deletions
diff --git a/include/myisammrg.h b/include/myisammrg.h
index c3b3b39424b..16d3528717b 100644
--- a/include/myisammrg.h
+++ b/include/myisammrg.h
@@ -84,6 +84,7 @@ extern int myrg_rfirst(MYRG_INFO *file,byte *buf,int inx);
extern int myrg_rlast(MYRG_INFO *file,byte *buf,int inx);
extern int myrg_rnext(MYRG_INFO *file,byte *buf,int inx);
extern int myrg_rprev(MYRG_INFO *file,byte *buf,int inx);
+extern int myrg_rnext_same(MYRG_INFO *file,byte *buf);
extern int myrg_rkey(MYRG_INFO *file,byte *buf,int inx,const byte *key,
uint key_len, enum ha_rkey_function search_flag);
extern int myrg_rrnd(MYRG_INFO *file,byte *buf,ulonglong pos);
diff --git a/myisam/mi_rkey.c b/myisam/mi_rkey.c
index cefb7a74dd1..4a3c76809e8 100644
--- a/myisam/mi_rkey.c
+++ b/myisam/mi_rkey.c
@@ -38,7 +38,15 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len,
info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
info->last_key_func=search_flag;
- if (!info->use_packed_key)
+ if (info->once_flags & USE_PACKED_KEYS)
+ {
+ /* key is already packed! */
+ key_buff=info->lastkey+info->s->base.max_key_length;
+ info->last_rkey_length=pack_key_length=key_len;
+ bmove(key_buff,key,key_len);
+ info->once_flags&= ~USE_PACKED_KEYS;
+ }
+ else
{
if (key_len == 0)
key_len=USE_WHOLE_KEY;
@@ -48,13 +56,6 @@ int mi_rkey(MI_INFO *info, byte *buf, int inx, const byte *key, uint key_len,
DBUG_EXECUTE("key",_mi_print_key(DBUG_FILE,share->keyinfo[inx].seg,
key_buff,pack_key_length););
}
- else
- {
- /* key is already packed! */
- key_buff=info->lastkey+info->s->base.max_key_length;
- info->last_rkey_length=pack_key_length=key_len;
- bmove(key_buff,key,key_len);
- }
if (fast_mi_readinfo(info))
goto err;
diff --git a/myisam/mi_rrnd.c b/myisam/mi_rrnd.c
index f8009441cff..29f686b0456 100644
--- a/myisam/mi_rrnd.c
+++ b/myisam/mi_rrnd.c
@@ -46,7 +46,10 @@ int mi_rrnd(MI_INFO *info, byte *buf, register my_off_t filepos)
filepos= info->nextpos;
}
- info->lastinx= -1; /* Can't forward or backward */
+ if (info->once_flags & RRND_PRESERVE_LASTINX)
+ info->once_flags&= ~RRND_PRESERVE_LASTINX;
+ else
+ info->lastinx= -1; /* Can't forward or backward */
/* Init all but update-flag */
info->update&= (HA_STATE_CHANGED | HA_STATE_ROW_CHANGED);
diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h
index 6499021861e..c63f4a28562 100644
--- a/myisam/myisamdef.h
+++ b/myisam/myisamdef.h
@@ -267,7 +267,7 @@ struct st_myisam_info {
my_bool quick_mode;
my_bool page_changed; /* If info->buff can't be used for rnext */
my_bool buff_used; /* If info->buff has to be reread for rnext */
- my_bool use_packed_key; /* For MYISAMMRG */
+ my_bool once_flags; /* For MYISAMMRG */
#ifdef THREAD
THR_LOCK_DATA lock;
#endif
@@ -288,6 +288,10 @@ struct st_myisam_info {
#define WRITEINFO_UPDATE_KEYFILE 1
#define WRITEINFO_NO_UNLOCK 2
+ /* once_flags */
+#define USE_PACKED_KEYS 1
+#define RRND_PRESERVE_LASTINX 2
+
/* bits in state.changed */
#define STATE_CHANGED 1
diff --git a/myisammrg/Makefile.am b/myisammrg/Makefile.am
index 6a6824affba..b749b84ba0b 100644
--- a/myisammrg/Makefile.am
+++ b/myisammrg/Makefile.am
@@ -21,7 +21,8 @@ libmyisammrg_a_SOURCES = myrg_open.c myrg_extra.c myrg_info.c myrg_locking.c \
myrg_rrnd.c myrg_update.c myrg_delete.c myrg_rsame.c \
myrg_panic.c myrg_close.c myrg_create.c myrg_static.c \
myrg_rkey.c myrg_rfirst.c myrg_rlast.c myrg_rnext.c \
- myrg_rprev.c myrg_queue.c myrg_write.c myrg_range.c
+ myrg_rprev.c myrg_queue.c myrg_write.c myrg_range.c \
+ myrg_rnext_same.c
# Don't update the files from bitkeeper
%::SCCS/s.%
diff --git a/myisammrg/myrg_rkey.c b/myisammrg/myrg_rkey.c
index ba042352a51..c0cef5a4eca 100644
--- a/myisammrg/myrg_rkey.c
+++ b/myisammrg/myrg_rkey.c
@@ -62,9 +62,8 @@ int myrg_rkey(MYRG_INFO *info,byte *record,int inx, const byte *key,
}
else
{
- mi->use_packed_key=1;
+ mi->once_flags|= USE_PACKED_KEYS;
err=mi_rkey(mi,0,inx,key_buff,pack_key_length,search_flag);
- mi->use_packed_key=0;
}
info->last_used_table=table+1;
@@ -83,5 +82,6 @@ int myrg_rkey(MYRG_INFO *info,byte *record,int inx, const byte *key,
return HA_ERR_KEY_NOT_FOUND;
mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
+ mi->once_flags|= RRND_PRESERVE_LASTINX;
return mi_rrnd(mi,record,mi->lastpos);
}
diff --git a/myisammrg/myrg_rnext_same.c b/myisammrg/myrg_rnext_same.c
new file mode 100644
index 00000000000..b569459b77d
--- /dev/null
+++ b/myisammrg/myrg_rnext_same.c
@@ -0,0 +1,40 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+
+#include "myrg_def.h"
+
+int myrg_rnext_same(MYRG_INFO *info, byte *buf)
+{
+ uint err;
+ MI_INFO *mi;
+
+ if (!info->current_table)
+ return (HA_ERR_KEY_NOT_FOUND);
+
+ err=mi_rnext_same(info->current_table->table,buf);
+ if (err == HA_ERR_END_OF_FILE)
+ {
+ queue_remove(&(info->by_key),0);
+ if (!info->by_key.elements)
+ return HA_ERR_END_OF_FILE;
+
+ mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table;
+ mi->once_flags|= RRND_PRESERVE_LASTINX;
+ return mi_rrnd(mi,buf,mi->lastpos);
+ }
+ return err;
+}
+
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index 07683dca73e..4398aaecf4d 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -160,6 +160,16 @@ int ha_myisammrg::index_last(byte * buf)
return error;
}
+int ha_myisammrg::index_next_same(byte * buf,
+ const byte *key __attribute__((unused)),
+ uint length __attribute__((unused)))
+{
+ statistic_increment(ha_read_next_count,&LOCK_status);
+ int error=myrg_rnext_same(file,buf);
+ table->status=error ? STATUS_NOT_FOUND: 0;
+ return error;
+}
+
int ha_myisammrg::rnd_init(bool scan)
{
return myrg_extra(file,HA_EXTRA_RESET,0);
diff --git a/sql/ha_myisammrg.h b/sql/ha_myisammrg.h
index 8e33b99e418..008f5339caf 100644
--- a/sql/ha_myisammrg.h
+++ b/sql/ha_myisammrg.h
@@ -65,15 +65,16 @@ class ha_myisammrg: public handler
int index_prev(byte * buf);
int index_first(byte * buf);
int index_last(byte * buf);
+ int index_next_same(byte *buf, const byte *key, uint keylen);
int rnd_init(bool scan=1);
int rnd_next(byte *buf);
int rnd_pos(byte * buf, byte *pos);
void position(const byte *record);
- ha_rows ha_myisammrg::records_in_range(int inx,
- const byte *start_key,uint start_key_len,
- enum ha_rkey_function start_search_flag,
- const byte *end_key,uint end_key_len,
- enum ha_rkey_function end_search_flag);
+ ha_rows records_in_range(int inx,
+ const byte *start_key,uint start_key_len,
+ enum ha_rkey_function start_search_flag,
+ const byte *end_key,uint end_key_len,
+ enum ha_rkey_function end_search_flag);
my_off_t row_position() { return myrg_position(file); }
void info(uint);
int extra(enum ha_extra_function operation);