Below is the list of changes that have just been committed into a local
5.1 repository of istruewing. When istruewing does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet@stripped, 2007-01-19 13:08:09+01:00, istruewing@stripped +3 -0
Merge chilla.local:/home/mydev/mysql-5.0-bug24607
into chilla.local:/home/mydev/mysql-5.1-bug24607
MERGE: 1.1810.2362.37
mysql-test/r/myisam.result@stripped, 2007-01-19 13:08:06+01:00, istruewing@stripped +0 -0
SCCS merged
MERGE: 1.71.1.22
mysql-test/t/myisam.test@stripped, 2007-01-19 13:08:06+01:00, istruewing@stripped +0 -0
SCCS merged
MERGE: 1.55.7.2
storage/myisam/mi_create.c@stripped, 2007-01-19 13:07:07+01:00, istruewing@stripped +0 -0
Auto merged
MERGE: 1.45.17.2
storage/myisam/mi_create.c@stripped, 2007-01-19 13:07:07+01:00, istruewing@stripped +0 -0
Merge rename: myisam/mi_create.c -> storage/myisam/mi_create.c
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: istruewing
# Host: chilla.local
# Root: /home/mydev/mysql-5.1-bug24607/RESYNC
--- 1.45.17.1/myisam/mi_create.c 2007-01-19 13:08:16 +01:00
+++ 1.66/storage/myisam/mi_create.c 2007-01-19 13:08:16 +01:00
@@ -27,9 +27,9 @@
#endif
#include <m_ctype.h>
- /*
- ** Old options is used when recreating database, from isamchk
- */
+/*
+ Old options is used when recreating database, from myisamchk
+*/
int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
uint columns, MI_COLUMNDEF *recinfo,
@@ -44,6 +44,7 @@ int mi_create(const char *name,uint keys
key_length,info_length,key_segs,options,min_key_length_skip,
base_pos,long_varchar_count,varchar_length,
max_key_block_length,unique_key_parts,fulltext_keys,offset;
+ uint aligned_key_start, block_length;
ulong reclength, real_reclength,min_pack_length;
char filename[FN_REFLEN],linkname[FN_REFLEN], *linkname_ptr;
ulong pack_reclength;
@@ -184,6 +185,8 @@ int mi_create(const char *name,uint keys
}
if (flags & HA_CREATE_DELAY_KEY_WRITE)
options|= HA_OPTION_DELAY_KEY_WRITE;
+ if (flags & HA_CREATE_RELIES_ON_SQL_LAYER)
+ options|= HA_OPTION_RELIES_ON_SQL_LAYER;
packed=(packed+7)/8;
if (pack_reclength != INT_MAX32)
@@ -427,8 +430,16 @@ int mi_create(const char *name,uint keys
key_segs)
share.state.rec_per_key_part[key_segs-1]=1L;
length+=key_length;
+ /* Get block length for key, if defined by user */
+ block_length= (keydef->block_length ?
+ my_round_up_to_next_power(keydef->block_length) :
+ myisam_block_size);
+ block_length= max(block_length, MI_MIN_KEY_BLOCK_LENGTH);
+ block_length= min(block_length, MI_MAX_KEY_BLOCK_LENGTH);
+
keydef->block_length= (uint16) MI_BLOCK_SIZE(length-real_length_diff,
- pointer,MI_MAX_KEYPTR_SIZE);
+ pointer,MI_MAX_KEYPTR_SIZE,
+ block_length);
if (keydef->block_length > MI_MAX_KEY_BLOCK_LENGTH ||
length >= MI_MAX_KEY_BUFF)
{
@@ -494,7 +505,7 @@ int mi_create(const char *name,uint keys
mi_int2store(share.state.header.base_pos,base_pos);
share.state.header.language= (ci->language ?
ci->language : default_charset_info->number);
- share.state.header.max_block_size=max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH;
+ share.state.header.max_block_size_index= max_key_block_length/MI_MIN_KEY_BLOCK_LENGTH;
share.state.dellink = HA_OFFSET_ERROR;
share.state.process= (ulong) getpid();
@@ -521,8 +532,12 @@ int mi_create(const char *name,uint keys
mi_int2store(share.state.header.unique_key_parts,unique_key_parts);
mi_set_all_keys_active(share.state.key_map, keys);
- share.base.keystart = share.state.state.key_file_length=
- MY_ALIGN(info_length, myisam_block_size);
+ aligned_key_start= my_round_up_to_next_power(max_key_block_length ?
+ max_key_block_length :
+ myisam_block_size);
+
+ share.base.keystart= share.state.state.key_file_length=
+ MY_ALIGN(info_length, aligned_key_start);
share.base.max_key_block_length=max_key_block_length;
share.base.max_key_length=ALIGN_SIZE(max_key_length+4);
share.base.records=ci->max_rows;
@@ -556,6 +571,8 @@ int mi_create(const char *name,uint keys
if (ci->index_file_name)
{
+ char *iext= strrchr(ci->index_file_name, '.');
+ int have_iext= iext && !strcmp(iext, MI_NAME_IEXT);
if (options & HA_OPTION_TMP_TABLE)
{
char *path;
@@ -563,13 +580,17 @@ int mi_create(const char *name,uint keys
if ((path= strrchr(ci->index_file_name, FN_LIBCHAR)))
*path= '\0';
fn_format(filename, name, ci->index_file_name, MI_NAME_IEXT,
- MY_REPLACE_DIR | MY_UNPACK_FILENAME);
+ MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_APPEND_EXT);
}
else
- fn_format(filename, ci->index_file_name, "",
- MI_NAME_IEXT, MY_UNPACK_FILENAME);
- fn_format(linkname, name, "", MI_NAME_IEXT, MY_UNPACK_FILENAME);
- linkname_ptr= linkname;
+ {
+ fn_format(filename, ci->index_file_name, "", MI_NAME_IEXT,
+ MY_UNPACK_FILENAME | (have_iext ? MY_REPLACE_EXT :
+ MY_APPEND_EXT));
+ }
+ fn_format(linkname, name, "", MI_NAME_IEXT,
+ MY_UNPACK_FILENAME|MY_APPEND_EXT);
+ linkname_ptr=linkname;
/*
Don't create the table if the link or file exists to ensure that one
doesn't accidently destroy another table.
@@ -578,8 +599,10 @@ int mi_create(const char *name,uint keys
}
else
{
- fn_format(filename,name,"",MI_NAME_IEXT,(4+ (flags & HA_DONT_TOUCH_DATA) ?
- 32 : 0));
+ fn_format(filename, name, "", MI_NAME_IEXT,
+ (MY_UNPACK_FILENAME |
+ (flags & HA_DONT_TOUCH_DATA) ? MY_RETURN_REAL_PATH : 0) |
+ MY_APPEND_EXT);
linkname_ptr=0;
/* Replace the current file */
create_flag=MY_DELETE_OLD;
@@ -610,7 +633,8 @@ int mi_create(const char *name,uint keys
#ifdef USE_RAID
if (share.base.raid_type)
{
- (void) fn_format(filename,name,"",MI_NAME_DEXT,2+4);
+ (void) fn_format(filename, name, "", MI_NAME_DEXT,
+ MY_UNPACK_FILENAME | MY_APPEND_EXT);
if ((dfile=my_raid_create(filename, 0, create_mode,
share.base.raid_type,
share.base.raid_chunks,
@@ -623,6 +647,9 @@ int mi_create(const char *name,uint keys
{
if (ci->data_file_name)
{
+ char *dext= strrchr(ci->data_file_name, '.');
+ int have_dext= dext && !strcmp(dext, MI_NAME_DEXT);
+
if (options & HA_OPTION_TMP_TABLE)
{
char *path;
@@ -630,18 +657,24 @@ int mi_create(const char *name,uint keys
if ((path= strrchr(ci->data_file_name, FN_LIBCHAR)))
*path= '\0';
fn_format(filename, name, ci->data_file_name, MI_NAME_DEXT,
- MY_REPLACE_DIR | MY_UNPACK_FILENAME);
+ MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_APPEND_EXT);
}
else
- fn_format(filename, ci->data_file_name, "",
- MI_NAME_DEXT, MY_UNPACK_FILENAME);
- fn_format(linkname, name, "", MI_NAME_DEXT, MY_UNPACK_FILENAME);
- linkname_ptr= linkname;
- create_flag= 0;
+ {
+ fn_format(filename, ci->data_file_name, "", MI_NAME_DEXT,
+ MY_UNPACK_FILENAME |
+ (have_dext ? MY_REPLACE_EXT : MY_APPEND_EXT));
+ }
+
+ fn_format(linkname, name, "",MI_NAME_DEXT,
+ MY_UNPACK_FILENAME | MY_APPEND_EXT);
+ linkname_ptr=linkname;
+ create_flag=0;
}
else
{
- fn_format(filename,name,"",MI_NAME_DEXT,4);
+ fn_format(filename,name,"", MI_NAME_DEXT,
+ MY_UNPACK_FILENAME | MY_APPEND_EXT);
linkname_ptr=0;
create_flag=MY_DELETE_OLD;
}
@@ -795,13 +828,15 @@ err:
case 2:
if (! (flags & HA_DONT_TOUCH_DATA))
- my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,2+4),
+ my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_DEXT,
+ MY_UNPACK_FILENAME | MY_APPEND_EXT),
MYF(0));
/* fall through */
case 1:
VOID(my_close(file,MYF(0)));
if (! (flags & HA_DONT_TOUCH_DATA))
- my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,2+4),
+ my_delete_with_symlink(fn_format(filename,name,"",MI_NAME_IEXT,
+ MY_UNPACK_FILENAME | MY_APPEND_EXT),
MYF(0));
}
my_free((char*) rec_per_key_part, MYF(0));
--- 1.100/mysql-test/r/myisam.result 2007-01-19 13:08:16 +01:00
+++ 1.101/mysql-test/r/myisam.result 2007-01-19 13:08:16 +01:00
@@ -1619,6 +1619,11 @@ a
2
3
DROP TABLE t1;
+CREATE TABLE t1 (c1 TEXT) AVG_ROW_LENGTH=70100 MAX_ROWS=5100100100;
+SHOW TABLE STATUS LIKE 't1';
+Name Engine Version Row_format Rows Avg_row_length Data_length Max_data_length Index_length Data_free Auto_increment Create_time Update_time Check_time Collation Checksum Create_options Comment
+t1 MyISAM 10 Dynamic X X X 72057594037927935 X X X X X X latin1_swedish_ci X max_rows=4294967295 avg_row_length=70100
+DROP TABLE t1;
End of 4.1 tests
create table t1 (c1 int) engine=myisam pack_keys=0;
create table t2 (c1 int) engine=myisam pack_keys=1;
--- 1.74/mysql-test/t/myisam.test 2007-01-19 13:08:16 +01:00
+++ 1.75/mysql-test/t/myisam.test 2007-01-19 13:08:16 +01:00
@@ -995,6 +995,14 @@ INSERT INTO t1 VALUES(1),(2);
UPDATE t1,t1 AS t2 SET t1.a=t1.a+2 WHERE t1.a=t2.a-1;
SELECT * FROM t1 ORDER BY a;
DROP TABLE t1;
+
+#
+# Bug#24607 - MyISAM pointer size determined incorrectly
+#
+CREATE TABLE t1 (c1 TEXT) AVG_ROW_LENGTH=70100 MAX_ROWS=5100100100;
+--replace_column 5 X 6 X 7 X 9 X 10 X 11 X 12 X 13 X 14 X 16 X
+SHOW TABLE STATUS LIKE 't1';
+DROP TABLE t1;
--echo End of 4.1 tests
#
| Thread |
|---|
| • bk commit into 5.1 tree (istruewing:1.2378) | ingo | 19 Jan |