summaryrefslogtreecommitdiff
path: root/myisam
diff options
context:
space:
mode:
authorunknown <monty@mashka.mysql.fi>2003-01-09 03:55:26 +0200
committerunknown <monty@mashka.mysql.fi>2003-01-09 03:55:26 +0200
commit9d812016c1287fe06a0c0715f0b2852c919cff82 (patch)
treeaf09adc5a3ec6814545553d72fda1d33e443d162 /myisam
parentcd2f741d5d2cc52928668c6ce1f77052d1ca8a3b (diff)
parentcf2ef3c68f696707671a96c8a2ad6c8449390f4a (diff)
downloadmariadb-git-9d812016c1287fe06a0c0715f0b2852c919cff82.tar.gz
merge with 4.0.9
To get bug fixes for TCP/IP connections, FORCE INDEX and OPTIMIZE TABLE with NULL keys client/mysqladmin.c: Auto merged client/mysqltest.c: Auto merged extra/Makefile.am: Auto merged include/my_base.h: Auto merged innobase/log/log0log.c: Auto merged myisam/ft_nlq_search.c: Auto merged myisam/mi_open.c: Auto merged myisam/myisamdef.h: Auto merged mysql-test/mysql-test-run.sh: Auto merged mysql-test/r/myisam.result: Auto merged sql/lex.h: Auto merged sql/log_event.h: Auto merged sql/mysqld.cc: Auto merged sql/opt_range.cc: Auto merged sql/protocol.cc: Auto merged sql/slave.cc: Auto merged sql/sql_base.cc: Auto merged sql/sql_select.cc: Auto merged sql-bench/crash-me.sh: Auto merged sql-bench/test-insert.sh: Auto merged sql/sql_show.cc: Auto merged sql/table.h: Auto merged configure.in: merge with 4.0.9 innobase/btr/btr0pcur.c: merge with 4.0.9 myisam/mi_check.c: merge with 4.0.9 myisam/mi_search.c: merge with 4.0.9 mysql-test/t/myisam.test: merge with 4.0.9 sql/log_event.cc: merge with 4.0.9 sql/mysql_priv.h: merge with 4.0.9 sql/sql_lex.h: merge with 4.0.9 sql/sql_parse.cc: merge with 4.0.9 sql/sql_yacc.yy: merge with 4.0.9
Diffstat (limited to 'myisam')
-rw-r--r--myisam/ft_nlq_search.c1
-rw-r--r--myisam/mi_check.c3
-rw-r--r--myisam/mi_extra.c5
-rw-r--r--myisam/mi_open.c14
-rw-r--r--myisam/mi_search.c8
-rw-r--r--myisam/myisamdef.h4
6 files changed, 26 insertions, 9 deletions
diff --git a/myisam/ft_nlq_search.c b/myisam/ft_nlq_search.c
index f9c276de32f..858a8dcbe06 100644
--- a/myisam/ft_nlq_search.c
+++ b/myisam/ft_nlq_search.c
@@ -97,6 +97,7 @@ static int walk_and_match(FT_WORD *word, uint32 count, ALL_IN_ONE *aio)
r=_mi_search(aio->info, aio->keyinfo, aio->keybuff, keylen,
SEARCH_FIND | SEARCH_PREFIX, aio->key_root);
+ aio->info->update|= HA_STATE_AKTIV; /* for _mi_test_if_changed() */
while (!r)
{
diff --git a/myisam/mi_check.c b/myisam/mi_check.c
index 1ca342f3998..28c28e628ea 100644
--- a/myisam/mi_check.c
+++ b/myisam/mi_check.c
@@ -601,7 +601,8 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
if (*keys != 1L) /* not first_key */
{
uint diff;
- ha_key_cmp(keyinfo->seg,info->lastkey,key,USE_WHOLE_KEY,SEARCH_FIND,
+ ha_key_cmp(keyinfo->seg,info->lastkey,key,USE_WHOLE_KEY,
+ SEARCH_FIND | SEARCH_NULL_ARE_NOT_EQUAL,
&diff);
param->unique_count[diff-1]++;
}
diff --git a/myisam/mi_extra.c b/myisam/mi_extra.c
index 8429b22dad4..75057dd4e6a 100644
--- a/myisam/mi_extra.c
+++ b/myisam/mi_extra.c
@@ -55,12 +55,17 @@ int mi_extra(MI_INFO *info, enum ha_extra_function function, void *extra_arg)
/*
Free buffers and reset the following flags:
EXTRA_CACHE, EXTRA_WRITE_CACHE, EXTRA_KEYREAD, EXTRA_QUICK
+
+ If the row buffer cache is large (for dynamic tables), reduce it
+ to save memory.
*/
if (info->opt_flag & (READ_CACHE_USED | WRITE_CACHE_USED))
{
info->opt_flag&= ~(READ_CACHE_USED | WRITE_CACHE_USED);
error=end_io_cache(&info->rec_cache);
}
+ if (share->base.blobs)
+ mi_alloc_rec_buff(info, -1, &info->rec_buff);
#if defined(HAVE_MMAP) && defined(HAVE_MADVICE)
if (info->opt_flag & MEMMAP_USED)
madvise(share->file_map,share->state.state.data_file_length,MADV_RANDOM);
diff --git a/myisam/mi_open.c b/myisam/mi_open.c
index 8f0da612c3a..ef1906e0c00 100644
--- a/myisam/mi_open.c
+++ b/myisam/mi_open.c
@@ -573,28 +573,36 @@ err:
DBUG_RETURN (NULL);
} /* mi_open */
+
byte *mi_alloc_rec_buff(MI_INFO *info, ulong length, byte **buf)
{
uint extra;
+ uint32 old_length;
+ LINT_INIT(old_length);
- if (! *buf || length > mi_get_rec_buff_len(info, *buf))
+ if (! *buf || length > (old_length=mi_get_rec_buff_len(info, *buf)))
{
byte *newptr = *buf;
/* to simplify initial init of info->rec_buf in mi_open and mi_extra */
if (length == (ulong) -1)
+ {
length= max(info->s->base.pack_reclength+info->s->base.pack_bits,
info->s->base.max_key_length);
+ /* Avoid unnecessary realloc */
+ if (newptr && length == old_length)
+ return newptr;
+ }
extra= ((info->s->options & HA_OPTION_PACK_RECORD) ?
ALIGN_SIZE(MI_MAX_DYN_BLOCK_HEADER)+MI_SPLIT_LENGTH+
MI_REC_BUFF_OFFSET : 0);
if (extra && newptr)
- newptr-=MI_REC_BUFF_OFFSET;
+ newptr-= MI_REC_BUFF_OFFSET;
if (!(newptr=(byte*) my_realloc((gptr)newptr, length+extra+8,
MYF(MY_ALLOW_ZERO_PTR))))
return newptr;
- *((uint *)newptr)=length;
+ *((uint32 *) newptr)= (uint32) length;
*buf= newptr+(extra ? MI_REC_BUFF_OFFSET : 0);
}
return *buf;
diff --git a/myisam/mi_search.c b/myisam/mi_search.c
index 8aeccbbf559..04803d7a901 100644
--- a/myisam/mi_search.c
+++ b/myisam/mi_search.c
@@ -260,9 +260,11 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
uchar *key, uint key_len, uint nextflag, uchar **ret_pos,
uchar *buff, my_bool *last_key)
{
- /* my_flag is raw comparison result to be changed according to
- SEARCH_NO_FIND,SEARCH_LAST and HA_REVERSE_SORT flags.
- flag is the value returned by ha_key_cmp and as treated as final */
+ /*
+ my_flag is raw comparison result to be changed according to
+ SEARCH_NO_FIND,SEARCH_LAST and HA_REVERSE_SORT flags.
+ flag is the value returned by ha_key_cmp and as treated as final
+ */
int flag=0, my_flag=-1;
uint nod_flag, length, len, matched, cmplen, kseg_len;
uint prefix_len,suffix_len;
diff --git a/myisam/myisamdef.h b/myisam/myisamdef.h
index e5cac1f090e..005c36271bf 100644
--- a/myisam/myisamdef.h
+++ b/myisam/myisamdef.h
@@ -385,7 +385,7 @@ typedef struct st_mi_sort_param
#define MI_DYN_ALIGN_SIZE 4 /* Align blocks on this */
#define MI_MAX_DYN_HEADER_BYTE 13 /* max header byte for dynamic rows */
#define MI_MAX_BLOCK_LENGTH ((((ulong) 1 << 24)-1) & (~ (ulong) (MI_DYN_ALIGN_SIZE-1)))
-#define MI_REC_BUFF_OFFSET ALIGN_SIZE(MI_DYN_DELETE_BLOCK_HEADER+sizeof(uint))
+#define MI_REC_BUFF_OFFSET ALIGN_SIZE(MI_DYN_DELETE_BLOCK_HEADER+sizeof(uint32))
#define MEMMAP_EXTRA_MARGIN 7 /* Write this as a suffix for file */
@@ -554,7 +554,7 @@ extern byte *mi_alloc_rec_buff(MI_INFO *,ulong, byte**);
((((info)->s->options & HA_OPTION_PACK_RECORD) && (buf)) ? \
(buf) - MI_REC_BUFF_OFFSET : (buf))
#define mi_get_rec_buff_len(info,buf) \
- (*((uint *)(mi_get_rec_buff_ptr(info,buf))))
+ (*((uint32 *)(mi_get_rec_buff_ptr(info,buf))))
extern ulong _mi_rec_unpack(MI_INFO *info,byte *to,byte *from,
ulong reclength);