diff options
author | unknown <monty@donna.mysql.com> | 2000-09-14 02:39:07 +0300 |
---|---|---|
committer | unknown <monty@donna.mysql.com> | 2000-09-14 02:39:07 +0300 |
commit | d5964ba20ca4c00a443c185186def44bb90831b3 (patch) | |
tree | 47d3199e561726437875c3247556ac5797525366 /myisammrg/myrg_rnext.c | |
parent | 9e37676d7cd9ca30a05025b9fcc3424c4e4a1932 (diff) | |
download | mariadb-git-d5964ba20ca4c00a443c185186def44bb90831b3.tar.gz |
Fixes for MERGE TABLES and HEAP tables
Docs/manual.texi:
Updated MERGE table stuff + more
extra/perror.c:
Added missing error messages
include/myisammrg.h:
Fixes for MERGE TABLE
include/queues.h:
Fixes for MERGE TABLE
isam/isamlog.c:
Fixed hard bug
myisam/mi_log.c:
cleanup
myisam/mi_open.c:
Fixed file name format in myisam log
myisam/myisamlog.c:
Bug fixes
myisammrg/mymrgdef.h:
Fixes for MERGE TABLE
myisammrg/myrg_create.c:
Fixes for MERGE TABLE
myisammrg/myrg_open.c:
Fixes for MERGE TABLE
myisammrg/myrg_queue.c:
Fixes for MERGE TABLE
myisammrg/myrg_rfirst.c:
Fixes for MERGE TABLE
myisammrg/myrg_rkey.c:
Fixes for MERGE TABLE
myisammrg/myrg_rlast.c:
Fixes for MERGE TABLE
myisammrg/myrg_rnext.c:
Fixes for MERGE TABLE
myisammrg/myrg_rprev.c:
Fixes for MERGE TABLE
myisammrg/myrg_rrnd.c:
Fixes for MERGE TABLE
mysql.proj:
update
mysys/queues.c:
Fixed bug when using reverse queues
sql-bench/test-insert.sh:
Separated some things to get better timings
sql/ha_heap.cc:
Fixed heap table bug
sql/ha_heap.h:
Fixed heap table bug
sql/ha_myisam.h:
Fixed wrong max_keys
sql/ha_myisammrg.cc:
Fixed MERGE TABLES
sql/ha_myisammrg.h:
Fixed MERGE TABLES
sql/handler.h:
Fix for MERGE TABLES and HEAP tables
sql/lex.h:
Fixed MERGE TABLES
sql/mysql_priv.h:
Cleanup of code
sql/sql_acl.cc:
Fixed that privilege tables are flushed at start
sql/sql_lex.h:
Fixed MERGE TABLES
sql/sql_parse.cc:
Fixed MERGE TABLES
sql/sql_select.cc:
Fixes for HEAP tables
sql/sql_table.cc:
Cleanup
sql/sql_yacc.yy:
Fixed MERGE TABLES
Diffstat (limited to 'myisammrg/myrg_rnext.c')
-rw-r--r-- | myisammrg/myrg_rnext.c | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/myisammrg/myrg_rnext.c b/myisammrg/myrg_rnext.c index e714ce3b139..71a4d081e8a 100644 --- a/myisammrg/myrg_rnext.c +++ b/myisammrg/myrg_rnext.c @@ -22,22 +22,21 @@ int myrg_rnext(MYRG_INFO *info, byte *buf, int inx) { - MYRG_TABLE *table; - MI_INFO *mi; - byte *key_buff; - uint pack_key_length; int err; + MI_INFO *mi; /* at first, do rnext for the table found before */ - err=mi_rnext(info->current_table->table,NULL,inx); - if (err == HA_ERR_END_OF_FILE) + if ((err=mi_rnext(info->current_table->table,NULL,inx))) { - queue_remove(&(info->by_key),0); - if (!info->by_key.elements) - return HA_ERR_END_OF_FILE; + if (err == HA_ERR_END_OF_FILE) + { + queue_remove(&(info->by_key),0); + if (!info->by_key.elements) + return HA_ERR_END_OF_FILE; + } + else + return err; } - else if (err) - return err; else { /* Found here, adding to queue */ @@ -46,30 +45,42 @@ int myrg_rnext(MYRG_INFO *info, byte *buf, int inx) } /* next, let's finish myrg_rkey's initial scan */ - table=info->last_used_table+1; + if ((err=_myrg_finish_scan(info, inx, HA_READ_KEY_OR_NEXT))) + return err; + + /* now, mymerge's read_next is as simple as one queue_top */ + mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table; + return mi_rrnd(mi,buf,mi->lastpos); +} + + +/* let's finish myrg_rkey's initial scan */ + +int _myrg_finish_scan(MYRG_INFO *info, int inx, enum ha_rkey_function type) +{ + int err; + MYRG_TABLE *table=info->last_used_table; if (table < info->end_table) { - mi=info->last_used_table->table; - key_buff=(byte*) mi->lastkey+mi->s->base.max_key_length; - pack_key_length=mi->last_rkey_length; + MI_INFO *mi= table[-1].table; + byte *key_buff=(byte*) mi->lastkey+mi->s->base.max_key_length; + uint pack_key_length= mi->last_rkey_length; + for (; table < info->end_table ; table++) { mi=table->table; - err=_mi_rkey(mi,NULL,inx,key_buff,pack_key_length,HA_READ_KEY_OR_NEXT,FALSE); - info->last_used_table=table; - - if (err == HA_ERR_KEY_NOT_FOUND) - continue; - if (err) - return err; - + if ((err=_mi_rkey(mi,NULL,inx,key_buff,pack_key_length, + type,FALSE))) + { + if (err == HA_ERR_KEY_NOT_FOUND) /* If end of file */ + continue; + return err; + } /* Found here, adding to queue */ - queue_insert(&(info->by_key),(byte *)table); + queue_insert(&(info->by_key),(byte *) table); } + /* All tables are now used */ + info->last_used_table=table; } - - /* now, mymerge's read_next is as simple as one queue_top */ - mi=(info->current_table=(MYRG_TABLE *)queue_top(&(info->by_key)))->table; - return mi_rrnd(mi,buf,mi->lastpos); + return 0; } - |