Commit 62604bd3 authored by unknown's avatar unknown

Merge bk-internal.mysql.com:/data0/bk/mysql-5.1

into  bk-internal.mysql.com:/data0/bk/mysql-5.1-arch

parents dd4ef9c7 ffbb896b
...@@ -1754,3 +1754,29 @@ t1 CREATE TABLE `t1` ( ...@@ -1754,3 +1754,29 @@ t1 CREATE TABLE `t1` (
`f2` enum('') DEFAULT NULL `f2` enum('') DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1; drop table t1;
End of 4.1 tests
create table t1(russian enum('E','F','EF','FE') NOT NULL DEFAULT'E');
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`russian` enum('E','F','EF','FE') NOT NULL DEFAULT 'E'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1(denormal enum('E','F','E,F','F,E') NOT NULL DEFAULT'E');
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`denormal` enum('E','F','E,F','F,E') NOT NULL DEFAULT 'E'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1(russian_deviant enum('E','F','EF','F,E') NOT NULL DEFAULT'E');
show create table t1;
Table Create Table
t1 CREATE TABLE `t1` (
`russian_deviant` enum('E','F','EF','F,E') NOT NULL DEFAULT 'E'
) ENGINE=MyISAM DEFAULT CHARSET=latin1
drop table t1;
create table t1(exhausting_charset enum('ABCDEFGHIJKLMNOPQRSTUVWXYZ','
 !"','#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~','xx\','yy\','zz'));
ERROR 42000: Field separator argument is not what is expected; check the manual
End of 5.1 tests
......
...@@ -136,4 +136,26 @@ alter table t1 add f2 enum(0xFFFF); ...@@ -136,4 +136,26 @@ alter table t1 add f2 enum(0xFFFF);
show create table t1; show create table t1;
drop table t1; drop table t1;
# End of 4.1 tests --echo End of 4.1 tests
#
# Bug#24660 "enum" field type definition problem
#
create table t1(russian enum('E','F','EF','FE') NOT NULL DEFAULT'E');
show create table t1;
drop table t1;
create table t1(denormal enum('E','F','E,F','F,E') NOT NULL DEFAULT'E');
show create table t1;
drop table t1;
create table t1(russian_deviant enum('E','F','EF','F,E') NOT NULL DEFAULT'E');
show create table t1;
drop table t1;
# ER_WRONG_FIELD_TERMINATORS
--error 1083
create table t1(exhausting_charset enum('ABCDEFGHIJKLMNOPQRSTUVWXYZ','
 !"','#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~','xx\','yy\','zz'));
--echo End of 5.1 tests
......
...@@ -803,17 +803,6 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head, ...@@ -803,17 +803,6 @@ static int open_binary_frm(THD *thd, TABLE_SHARE *share, uchar *head,
{ {
char *val= (char*) interval->type_names[count]; char *val= (char*) interval->type_names[count];
interval->type_lengths[count]= strlen(val); interval->type_lengths[count]= strlen(val);
/*
Replace all ',' symbols with NAMES_SEP_CHAR.
See the comment in unireg.cc, pack_fields() function
for details.
*/
for (uint cnt= 0 ; cnt < interval->type_lengths[count] ; cnt++)
{
char c= val[cnt];
if (c == ',')
val[cnt]= NAMES_SEP_CHAR;
}
} }
interval->type_lengths[count]= 0; interval->type_lengths[count]= 0;
} }
......
...@@ -788,29 +788,48 @@ static bool pack_fields(File file, List<create_field> &create_fields, ...@@ -788,29 +788,48 @@ static bool pack_fields(File file, List<create_field> &create_fields,
{ {
if (field->interval_id > int_count) if (field->interval_id > int_count)
{ {
int_count=field->interval_id; unsigned char sep= 0;
tmp.append(NAMES_SEP_CHAR); unsigned char occ[256];
for (const char **pos=field->interval->type_names ; *pos ; pos++) uint i;
{ unsigned char *val= NULL;
char *val= (char*) *pos;
uint str_len= strlen(val); bzero(occ, sizeof(occ));
/*
Note, hack: in old frm NAMES_SEP_CHAR is used to separate for (i=0; (val= (unsigned char*) field->interval->type_names[i]); i++)
names in the interval (ENUM/SET). To allow names to contain for (uint j = 0; j < field->interval->type_lengths[i]; j++)
NAMES_SEP_CHAR, we replace it with a comma before writing frm. occ[(unsigned int) (val[j])]= 1;
Backward conversion is done during frm file opening,
See table.cc, openfrm() function if (!occ[(unsigned char)NAMES_SEP_CHAR])
*/ sep= (unsigned char) NAMES_SEP_CHAR;
for (uint cnt= 0 ; cnt < str_len ; cnt++) else if (!occ[(unsigned int)','])
sep= ',';
else
{
for (uint i=1; i<256; i++)
{
if(!occ[i])
{
sep= i;
break;
}
}
if(!sep) /* disaster, enum uses all characters, none left as separator */
{ {
char c= val[cnt]; my_message(ER_WRONG_FIELD_TERMINATORS,ER(ER_WRONG_FIELD_TERMINATORS),
if (c == NAMES_SEP_CHAR) MYF(0));
val[cnt]= ','; DBUG_RETURN(1);
} }
tmp.append(*pos); }
tmp.append(NAMES_SEP_CHAR);
} int_count= field->interval_id;
tmp.append('\0'); // End of intervall tmp.append(sep);
for (const char **pos=field->interval->type_names ; *pos ; pos++)
{
tmp.append(*pos);
tmp.append(sep);
}
tmp.append('\0'); // End of intervall
} }
} }
if (my_write(file,(byte*) tmp.ptr(),tmp.length(),MYF_RW)) if (my_write(file,(byte*) tmp.ptr(),tmp.length(),MYF_RW))
......
...@@ -704,7 +704,7 @@ buf_pool_init( ...@@ -704,7 +704,7 @@ buf_pool_init(
} }
} }
buf_pool->page_hash = hash0_create(2 * max_size); buf_pool->page_hash = hash_create(2 * max_size);
buf_pool->n_pend_reads = 0; buf_pool->n_pend_reads = 0;
......
...@@ -782,10 +782,10 @@ dict_init(void) ...@@ -782,10 +782,10 @@ dict_init(void)
mutex_create(&dict_sys->mutex, SYNC_DICT); mutex_create(&dict_sys->mutex, SYNC_DICT);
dict_sys->table_hash = hash0_create(buf_pool_get_max_size() dict_sys->table_hash = hash_create(buf_pool_get_max_size()
/ (DICT_POOL_PER_TABLE_HASH / (DICT_POOL_PER_TABLE_HASH
* UNIV_WORD_SIZE)); * UNIV_WORD_SIZE));
dict_sys->table_id_hash = hash0_create(buf_pool_get_max_size() dict_sys->table_id_hash = hash_create(buf_pool_get_max_size()
/ (DICT_POOL_PER_TABLE_HASH / (DICT_POOL_PER_TABLE_HASH
* UNIV_WORD_SIZE)); * UNIV_WORD_SIZE));
dict_sys->size = 0; dict_sys->size = 0;
......
...@@ -1323,8 +1323,8 @@ fil_system_create( ...@@ -1323,8 +1323,8 @@ fil_system_create(
mutex_create(&system->mutex, SYNC_ANY_LATCH); mutex_create(&system->mutex, SYNC_ANY_LATCH);
system->spaces = hash0_create(hash_size); system->spaces = hash_create(hash_size);
system->name_hash = hash0_create(hash_size); system->name_hash = hash_create(hash_size);
UT_LIST_INIT(system->LRU); UT_LIST_INIT(system->LRU);
......
...@@ -34,7 +34,7 @@ ha_create_func( ...@@ -34,7 +34,7 @@ ha_create_func(
hash_table_t* table; hash_table_t* table;
ulint i; ulint i;
table = hash0_create(n); table = hash_create(n);
if (in_btr_search) { if (in_btr_search) {
table->adaptive = TRUE; table->adaptive = TRUE;
......
...@@ -74,7 +74,7 @@ Creates a hash table with >= n array cells. The actual number of cells is ...@@ -74,7 +74,7 @@ Creates a hash table with >= n array cells. The actual number of cells is
chosen to be a prime number slightly bigger than n. */ chosen to be a prime number slightly bigger than n. */
hash_table_t* hash_table_t*
hash0_create( hash_create(
/*========*/ /*========*/
/* out, own: created table */ /* out, own: created table */
ulint n) /* in: number of array cells */ ulint n) /* in: number of array cells */
......
...@@ -18,12 +18,15 @@ typedef struct hash_cell_struct hash_cell_t; ...@@ -18,12 +18,15 @@ typedef struct hash_cell_struct hash_cell_t;
typedef void* hash_node_t; typedef void* hash_node_t;
/* Fix Bug #13859: symbol collision between imap/mysql */
#define hash_create hash0_create
/***************************************************************** /*****************************************************************
Creates a hash table with >= n array cells. The actual number Creates a hash table with >= n array cells. The actual number
of cells is chosen to be a prime number slightly bigger than n. */ of cells is chosen to be a prime number slightly bigger than n. */
hash_table_t* hash_table_t*
hash0_create( hash_create(
/*========*/ /*========*/
/* out, own: created table */ /* out, own: created table */
ulint n); /* in: number of array cells */ ulint n); /* in: number of array cells */
......
...@@ -586,7 +586,7 @@ lock_sys_create( ...@@ -586,7 +586,7 @@ lock_sys_create(
{ {
lock_sys = mem_alloc(sizeof(lock_sys_t)); lock_sys = mem_alloc(sizeof(lock_sys_t));
lock_sys->rec_hash = hash0_create(n_cells); lock_sys->rec_hash = hash_create(n_cells);
/* hash_create_mutexes(lock_sys->rec_hash, 2, SYNC_REC_LOCK); */ /* hash_create_mutexes(lock_sys->rec_hash, 2, SYNC_REC_LOCK); */
......
...@@ -147,7 +147,7 @@ recv_sys_init( ...@@ -147,7 +147,7 @@ recv_sys_init(
recv_sys->len = 0; recv_sys->len = 0;
recv_sys->recovered_offset = 0; recv_sys->recovered_offset = 0;
recv_sys->addr_hash = hash0_create(available_memory / 64); recv_sys->addr_hash = hash_create(available_memory / 64);
recv_sys->n_addrs = 0; recv_sys->n_addrs = 0;
recv_sys->apply_log_recs = FALSE; recv_sys->apply_log_recs = FALSE;
...@@ -188,7 +188,7 @@ recv_sys_empty_hash(void) ...@@ -188,7 +188,7 @@ recv_sys_empty_hash(void)
hash_table_free(recv_sys->addr_hash); hash_table_free(recv_sys->addr_hash);
mem_heap_empty(recv_sys->heap); mem_heap_empty(recv_sys->heap);
recv_sys->addr_hash = hash0_create(buf_pool_get_curr_size() / 256); recv_sys->addr_hash = hash_create(buf_pool_get_curr_size() / 256);
} }
#ifndef UNIV_LOG_DEBUG #ifndef UNIV_LOG_DEBUG
......
...@@ -224,7 +224,7 @@ thr_local_init(void) ...@@ -224,7 +224,7 @@ thr_local_init(void)
ut_a(thr_local_hash == NULL); ut_a(thr_local_hash == NULL);
thr_local_hash = hash0_create(OS_THREAD_MAX_N + 100); thr_local_hash = hash_create(OS_THREAD_MAX_N + 100);
mutex_create(&thr_local_mutex, SYNC_THR_LOCAL); mutex_create(&thr_local_mutex, SYNC_THR_LOCAL);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment