diff options
author | unknown <serg@serg.mysql.com> | 2002-11-25 22:18:44 +0100 |
---|---|---|
committer | unknown <serg@serg.mysql.com> | 2002-11-25 22:18:44 +0100 |
commit | 4ea2f42e33e1846335c1321fcd4d438d075c8e06 (patch) | |
tree | 02a55f44bad9f485e0d76216a95e10c2aafa692c /myisam | |
parent | 1049175831a4aa145f64e912388cc6079d7f5789 (diff) | |
download | mariadb-git-4ea2f42e33e1846335c1321fcd4d438d075c8e06.tar.gz |
myisammrg::index_next_same
myisammrg/Makefile.am:
myrg_rnext_same.c added
Diffstat (limited to 'myisam')
-rw-r--r-- | myisam/mi_rkey.c | 17 | ||||
-rw-r--r-- | myisam/mi_rrnd.c | 5 | ||||
-rw-r--r-- | myisam/myisamdef.h | 6 |
3 files changed, 18 insertions, 10 deletions
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 |