summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristofer Pettersson <kristofer.pettersson@sun.com>2009-09-29 17:18:55 +0200
committerKristofer Pettersson <kristofer.pettersson@sun.com>2009-09-29 17:18:55 +0200
commit004ee4f4277de177beb95b3fa5e433ef552527f9 (patch)
tree393991663642f994955a99d4486756ed8fe9663f
parentfce76d294596efe49578fa2aeb679420016c17c9 (diff)
parentcc26f35cd5aea7ffdc1738787380e9445b45e1b8 (diff)
downloadmariadb-git-004ee4f4277de177beb95b3fa5e433ef552527f9.tar.gz
autocommit
-rw-r--r--client/mysqltest.c2
-rw-r--r--configure.in4
-rw-r--r--heap/hp_write.c7
-rw-r--r--include/keycache.h6
-rw-r--r--include/my_global.h6
-rw-r--r--libmysqld/libmysqld.c1
-rw-r--r--myisam/mi_preload.c13
-rw-r--r--myisam/mi_search.c6
-rw-r--r--myisam/mi_write.c6
-rw-r--r--mysql-test/r/func_str.result9
-rw-r--r--mysql-test/r/subselect4.result61
-rw-r--r--mysql-test/suite/jp/r/jp_alter_sjis.result78
-rw-r--r--mysql-test/suite/jp/r/jp_alter_ucs2.result78
-rw-r--r--mysql-test/suite/jp/r/jp_alter_ujis.result78
-rw-r--r--mysql-test/suite/jp/r/jp_alter_utf8.result78
-rw-r--r--mysql-test/suite/jp/r/jp_charset_sjis.result12
-rw-r--r--mysql-test/suite/jp/r/jp_charset_ujis.result12
-rw-r--r--mysql-test/suite/jp/r/jp_charset_utf8.result12
-rw-r--r--mysql-test/suite/jp/r/jp_convert_sjis.result24
-rw-r--r--mysql-test/suite/jp/r/jp_convert_ujis.result12
-rw-r--r--mysql-test/suite/jp/r/jp_convert_utf8.result12
-rw-r--r--mysql-test/suite/jp/r/jp_create_db_sjis.result1
-rw-r--r--mysql-test/suite/jp/r/jp_create_db_ucs2.result1
-rw-r--r--mysql-test/suite/jp/r/jp_create_db_ujis.result1
-rw-r--r--mysql-test/suite/jp/r/jp_create_db_utf8.result1
-rw-r--r--mysql-test/suite/jp/r/jp_create_tbl_sjis.result78
-rw-r--r--mysql-test/suite/jp/r/jp_create_tbl_ucs2.result78
-rw-r--r--mysql-test/suite/jp/r/jp_create_tbl_ujis.result78
-rw-r--r--mysql-test/suite/jp/r/jp_create_tbl_utf8.result78
-rw-r--r--mysql-test/suite/jp/r/jp_enum_sjis.result60
-rw-r--r--mysql-test/suite/jp/r/jp_enum_ucs2.result6
-rw-r--r--mysql-test/suite/jp/r/jp_enum_ujis.result60
-rw-r--r--mysql-test/suite/jp/r/jp_enum_utf8.result60
-rw-r--r--mysql-test/suite/jp/r/jp_join_sjis.result288
-rw-r--r--mysql-test/suite/jp/r/jp_join_ucs2.result288
-rw-r--r--mysql-test/suite/jp/r/jp_join_ujis.result288
-rw-r--r--mysql-test/suite/jp/r/jp_join_utf8.result288
-rw-r--r--mysql-test/suite/jp/r/jp_like_sjis.result12
-rw-r--r--mysql-test/suite/jp/r/jp_like_ujis.result12
-rw-r--r--mysql-test/suite/jp/r/jp_like_utf8.result12
-rw-r--r--mysql-test/suite/jp/r/jp_select_sjis.result16
-rw-r--r--mysql-test/suite/jp/r/jp_select_ujis.result12
-rw-r--r--mysql-test/suite/jp/r/jp_select_utf8.result12
-rw-r--r--mysql-test/suite/jp/r/jp_where_sjis.result12
-rw-r--r--mysql-test/suite/jp/r/jp_where_ujis.result12
-rw-r--r--mysql-test/suite/jp/r/jp_where_utf8.result12
-rw-r--r--mysql-test/suite/jp/t/jp_alter_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_alter_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_alter_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_alter_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_charlength_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_charlength_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_charlength_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_charlength_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_charset_sjis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_charset_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_charset_ujis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_charset_utf8.test28
-rw-r--r--mysql-test/suite/jp/t/jp_convert_sjis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_convert_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_convert_ujis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_convert_utf8.test28
-rw-r--r--mysql-test/suite/jp/t/jp_create_tbl_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_create_tbl_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_create_tbl_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_create_tbl_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_enum_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_enum_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_enum_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_enum_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_insert_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_insert_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_insert_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_insert_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_instr_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_instr_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_instr_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_instr_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_join_sjis.test1
-rw-r--r--mysql-test/suite/jp/t/jp_join_ucs2.test1
-rw-r--r--mysql-test/suite/jp/t/jp_join_ujis.test1
-rw-r--r--mysql-test/suite/jp/t/jp_join_utf8.test1
-rw-r--r--mysql-test/suite/jp/t/jp_left_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_left_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_left_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_left_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_length_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_length_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_length_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_length_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_like_sjis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_like_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_like_ujis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_like_utf8.test28
-rw-r--r--mysql-test/suite/jp/t/jp_locate_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_locate_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_locate_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_locate_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_lpad_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_lpad_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_lpad_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_lpad_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_ltrim_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_ltrim_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_ltrim_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_ltrim_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_ps_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_ps_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_replace_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_replace_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_replace_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_replace_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_reverse_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_reverse_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_reverse_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_reverse_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_right_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_right_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_right_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_right_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_rpad_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_rpad_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_rpad_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_rpad_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_rtrim_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_rtrim_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_rtrim_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_rtrim_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_select_sjis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_select_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_select_ujis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_select_utf8.test28
-rw-r--r--mysql-test/suite/jp/t/jp_subquery_sjis.test1
-rw-r--r--mysql-test/suite/jp/t/jp_subquery_ucs2.test1
-rw-r--r--mysql-test/suite/jp/t/jp_subquery_ujis.test1
-rw-r--r--mysql-test/suite/jp/t/jp_subquery_utf8.test1
-rw-r--r--mysql-test/suite/jp/t/jp_substring_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_substring_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_substring_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_substring_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_trim_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_trim_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_trim_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_trim_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_union_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_update_sjis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_update_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_update_ujis.test2
-rw-r--r--mysql-test/suite/jp/t/jp_update_utf8.test2
-rw-r--r--mysql-test/suite/jp/t/jp_where_sjis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_where_ucs2.test2
-rw-r--r--mysql-test/suite/jp/t/jp_where_ujis.test28
-rw-r--r--mysql-test/suite/jp/t/jp_where_utf8.test28
-rw-r--r--mysql-test/t/func_str.test13
-rw-r--r--mysql-test/t/subselect4.test64
-rw-r--r--mysys/hash.c7
-rw-r--r--mysys/mf_keycache.c2673
-rw-r--r--mysys/my_static.c3
-rw-r--r--mysys/my_thr_init.c7
-rw-r--r--sql-common/my_time.c3
-rw-r--r--sql/ha_myisam.cc2
-rw-r--r--sql/item_func.cc6
-rw-r--r--sql/item_strfunc.cc7
-rw-r--r--sql/item_timefunc.cc11
-rw-r--r--sql/mysqld.cc2
-rw-r--r--sql/sql_handler.cc7
-rw-r--r--sql/sql_lex.cc3
-rw-r--r--sql/sql_select.cc19
-rw-r--r--sql/sql_table.cc7
-rw-r--r--sql/udf_example.c4
-rw-r--r--support-files/binary-configure.sh24
171 files changed, 3928 insertions, 1813 deletions
diff --git a/client/mysqltest.c b/client/mysqltest.c
index 79df511641d..4f8e6cdac99 100644
--- a/client/mysqltest.c
+++ b/client/mysqltest.c
@@ -1406,7 +1406,7 @@ void show_diff(DYNAMIC_STRING* ds,
else
diff_name = 0;
#else
- diff_name = "diff"; // Otherwise always assume it's called diff
+ diff_name = "diff"; /* Otherwise always assume it's called diff */
#endif
if (diff_name)
diff --git a/configure.in b/configure.in
index a70bb3ca27f..523ac01c6f3 100644
--- a/configure.in
+++ b/configure.in
@@ -7,7 +7,7 @@ AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line!
# remember to also change ndb version below and update version.c in ndb
-AM_INIT_AUTOMAKE(mysql, 5.0.86)
+AM_INIT_AUTOMAKE(mysql, 5.0.87)
AM_CONFIG_HEADER([include/config.h:config.h.in])
PROTOCOL_VERSION=10
@@ -23,7 +23,7 @@ NDB_SHARED_LIB_VERSION=$NDB_SHARED_LIB_MAJOR_VERSION:0:0
# ndb version
NDB_VERSION_MAJOR=5
NDB_VERSION_MINOR=0
-NDB_VERSION_BUILD=86
+NDB_VERSION_BUILD=87
NDB_VERSION_STATUS=""
# Set all version vars based on $VERSION. How do we do this more elegant ?
diff --git a/heap/hp_write.c b/heap/hp_write.c
index 6aa34acf2c3..85551c1cc41 100644
--- a/heap/hp_write.c
+++ b/heap/hp_write.c
@@ -196,13 +196,10 @@ int hp_write_key(HP_INFO *info, HP_KEYDEF *keyinfo,
HP_SHARE *share = info->s;
int flag;
ulong halfbuff,hashnr,first_index;
- byte *ptr_to_rec,*ptr_to_rec2;
- HASH_INFO *empty,*gpos,*gpos2,*pos;
+ byte *UNINIT_VAR(ptr_to_rec),*UNINIT_VAR(ptr_to_rec2);
+ HASH_INFO *empty,*UNINIT_VAR(gpos),*UNINIT_VAR(gpos2),*pos;
DBUG_ENTER("hp_write_key");
- LINT_INIT(gpos); LINT_INIT(gpos2);
- LINT_INIT(ptr_to_rec); LINT_INIT(ptr_to_rec2);
-
flag=0;
if (!(empty= hp_find_free_hash(share,&keyinfo->block,share->records)))
DBUG_RETURN(-1); /* No more memory */
diff --git a/include/keycache.h b/include/keycache.h
index 424b4086cb4..b2e959955d0 100644
--- a/include/keycache.h
+++ b/include/keycache.h
@@ -44,6 +44,7 @@ typedef struct st_keycache_wqueue
typedef struct st_key_cache
{
my_bool key_cache_inited;
+ my_bool in_resize; /* true during resize operation */
my_bool resize_in_flush; /* true during flush of resize operation */
my_bool can_be_used; /* usage of cache for read/write is allowed */
size_t key_cache_mem_size; /* specified size of the cache memory */
@@ -71,6 +72,11 @@ typedef struct st_key_cache
BLOCK_LINK *used_ins; /* ptr to the insertion block in LRU chain */
pthread_mutex_t cache_lock; /* to lock access to the cache structure */
KEYCACHE_WQUEUE resize_queue; /* threads waiting during resize operation */
+ /*
+ Waiting for a zero resize count. Using a queue for symmetry though
+ only one thread can wait here.
+ */
+ KEYCACHE_WQUEUE waiting_for_resize_cnt;
KEYCACHE_WQUEUE waiting_for_hash_link; /* waiting for a free hash link */
KEYCACHE_WQUEUE waiting_for_block; /* requests waiting for a free block */
BLOCK_LINK *changed_blocks[CHANGED_BLOCKS_HASH]; /* hash for dirty file bl.*/
diff --git a/include/my_global.h b/include/my_global.h
index 0b5458215c6..6910ae092e1 100644
--- a/include/my_global.h
+++ b/include/my_global.h
@@ -458,12 +458,6 @@ int __void__;
#define LINT_INIT(var)
#endif
-#if defined(_lint) || defined(FORCE_INIT_OF_VARS) || defined(HAVE_purify)
-#define PURIFY_OR_LINT_INIT(var) var=0
-#else
-#define PURIFY_OR_LINT_INIT(var)
-#endif
-
/*
Suppress uninitialized variable warning without generating code.
diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c
index eb47a045669..969ea442622 100644
--- a/libmysqld/libmysqld.c
+++ b/libmysqld/libmysqld.c
@@ -164,6 +164,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
port=0;
unix_socket=0;
+ client_flag|=mysql->options.client_flag;
/* Send client information for access check */
client_flag|=CLIENT_CAPABILITIES;
if (client_flag & CLIENT_MULTI_STATEMENTS)
diff --git a/myisam/mi_preload.c b/myisam/mi_preload.c
index 78729f18424..06c66c06bf4 100644
--- a/myisam/mi_preload.c
+++ b/myisam/mi_preload.c
@@ -55,12 +55,17 @@ int mi_preload(MI_INFO *info, ulonglong key_map, my_bool ignore_leaves)
block_length= keyinfo[0].block_length;
- /* Check whether all indexes use the same block size */
- for (i= 1 ; i < keys ; i++)
+ if (ignore_leaves)
{
- if (keyinfo[i].block_length != block_length)
- DBUG_RETURN(my_errno= HA_ERR_NON_UNIQUE_BLOCK_SIZE);
+ /* Check whether all indexes use the same block size */
+ for (i= 1 ; i < keys ; i++)
+ {
+ if (keyinfo[i].block_length != block_length)
+ DBUG_RETURN(my_errno= HA_ERR_NON_UNIQUE_BLOCK_SIZE);
+ }
}
+ else
+ block_length= share->key_cache->key_cache_block_size;
length= info->preload_buff_size/block_length * block_length;
set_if_bigger(length, block_length);
diff --git a/myisam/mi_search.c b/myisam/mi_search.c
index 3b1cd6158f2..21efaa03744 100644
--- a/myisam/mi_search.c
+++ b/myisam/mi_search.c
@@ -295,7 +295,8 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
uchar *end, *kseg, *vseg;
uchar *sort_order=keyinfo->seg->charset->sort_order;
uchar tt_buff[MI_MAX_KEY_BUFF+2], *t_buff=tt_buff+2;
- uchar *saved_from, *saved_to, *saved_vseg;
+ uchar *UNINIT_VAR(saved_from), *UNINIT_VAR(saved_to);
+ uchar *UNINIT_VAR(saved_vseg);
uint saved_length=0, saved_prefix_len=0;
uint length_pack;
DBUG_ENTER("_mi_prefix_search");
@@ -303,9 +304,6 @@ int _mi_prefix_search(MI_INFO *info, register MI_KEYDEF *keyinfo, uchar *page,
LINT_INIT(length);
LINT_INIT(prefix_len);
LINT_INIT(seg_len_pack);
- LINT_INIT(saved_from);
- LINT_INIT(saved_to);
- LINT_INIT(saved_vseg);
t_buff[0]=0; /* Avoid bugs */
end= page+mi_getint(page);
diff --git a/myisam/mi_write.c b/myisam/mi_write.c
index b4843a748dd..61cea588562 100644
--- a/myisam/mi_write.c
+++ b/myisam/mi_write.c
@@ -700,8 +700,8 @@ static uchar *_mi_find_last_pos(MI_KEYDEF *keyinfo, uchar *page,
uchar *key, uint *return_key_length,
uchar **after_key)
{
- uint keys,length,last_length,key_ref_length;
- uchar *end,*lastpos,*prevpos;
+ uint keys,length,UNINIT_VAR(last_length),key_ref_length;
+ uchar *end,*lastpos,*UNINIT_VAR(prevpos);
uchar key_buff[MI_MAX_KEY_BUFF];
DBUG_ENTER("_mi_find_last_pos");
@@ -720,8 +720,6 @@ static uchar *_mi_find_last_pos(MI_KEYDEF *keyinfo, uchar *page,
DBUG_RETURN(end);
}
- LINT_INIT(prevpos);
- LINT_INIT(last_length);
end=page+length-key_ref_length;
*key='\0';
length=0;
diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result
index 75f8983e838..bf2a9ca8901 100644
--- a/mysql-test/r/func_str.result
+++ b/mysql-test/r/func_str.result
@@ -2196,4 +2196,13 @@ SELECT LOAD_FILE(a) FROM t1;
LOAD_FILE(a)
NULL
DROP TABLE t1;
+CREATE TABLE t1 (f2 VARCHAR(20));
+CREATE TABLE t2 (f2 VARCHAR(20));
+INSERT INTO t1 VALUES ('MIN'),('MAX');
+INSERT INTO t2 VALUES ('LOAD');
+SELECT CONCAT_WS('_', (SELECT t2.f2 FROM t2), t1.f2) AS concat_name FROM t1;
+concat_name
+LOAD_MIN
+LOAD_MAX
+DROP TABLE t1, t2;
End of 5.0 tests
diff --git a/mysql-test/r/subselect4.result b/mysql-test/r/subselect4.result
new file mode 100644
index 00000000000..e863cbfb7a8
--- /dev/null
+++ b/mysql-test/r/subselect4.result
@@ -0,0 +1,61 @@
+#
+# Bug #46791: Assertion failed:(table->key_read==0),function unknown
+# function,file sql_base.cc
+#
+CREATE TABLE t1 (a INT, b INT, KEY(a));
+INSERT INTO t1 VALUES (1,1),(2,2);
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES (1,1),(2,2);
+CREATE TABLE t3 LIKE t1;
+# should have 1 impossible where and 2 dependent subqueries
+EXPLAIN
+SELECT 1 FROM t1
+WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3))
+ORDER BY count(*);
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY t1 index NULL a 5 NULL 2 Using index; Using temporary
+2 DEPENDENT SUBQUERY t2 ALL NULL NULL NULL NULL 2 Using where
+3 DEPENDENT SUBQUERY NULL NULL NULL NULL NULL NULL NULL no matching row in const table
+# should not crash the next statement
+SELECT 1 FROM t1
+WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3))
+ORDER BY count(*);
+1
+1
+# should not crash: the crash is caused by the previous statement
+SELECT 1;
+1
+1
+DROP TABLE t1,t2,t3;
+#
+# Bug #47106: Crash / segfault on adding EXPLAIN to a non-crashing
+# query
+#
+CREATE TABLE t1 (
+a INT,
+b INT,
+PRIMARY KEY (a),
+KEY b (b)
+);
+INSERT INTO t1 VALUES (1, 1), (2, 1);
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 SELECT * FROM t1;
+CREATE TABLE t3 LIKE t1;
+INSERT INTO t3 SELECT * FROM t1;
+# Should not crash.
+# Should have 1 impossible where and 2 dependent subqs.
+EXPLAIN
+SELECT
+(SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
+FROM t3 WHERE 1 = 0 GROUP BY 1;
+id select_type table type possible_keys key key_len ref rows Extra
+1 PRIMARY NULL NULL NULL NULL NULL NULL NULL Impossible WHERE
+2 DEPENDENT SUBQUERY t1 index NULL PRIMARY 4 NULL 2 Using index
+2 DEPENDENT SUBQUERY t2 index b b 5 NULL 2 Using where; Using index
+# should return 0 rows
+SELECT
+(SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
+FROM t3 WHERE 1 = 0 GROUP BY 1;
+(SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
+DROP TABLE t1,t2,t3;
+End of 5.0 tests.
diff --git a/mysql-test/suite/jp/r/jp_alter_sjis.result b/mysql-test/suite/jp/r/jp_alter_sjis.result
index f970508229a..32ae7d5729d 100644
--- a/mysql-test/suite/jp/r/jp_alter_sjis.result
+++ b/mysql-test/suite/jp/r/jp_alter_sjis.result
@@ -31,8 +31,8 @@ NULL ³³³³³ NULL NULL
DESC `±±±`;
Field Type Null Key Default Extra
¶¶ char(1) YES MUL NULL
-··· char(6) PRI
-¸¸¸ char(1) YES MUL NULL
+··· char(6) NO PRI
+¸¸¸ char(1) YES UNI NULL
¹¹¹ char(1) YES NULL
SHOW CREATE TABLE `±±±`;
Table Create Table
@@ -58,7 +58,7 @@ SELECT * FROM `±±±`;
³³³³³
DESC `±±±`;
Field Type Null Key Default Extra
-··· char(6)
+··· char(6) NO
SHOW CREATE TABLE `±±±`;
Table Create Table
±±± CREATE TABLE `±±±` (
@@ -80,8 +80,8 @@ NULL ‚¤‚¤‚¤‚¤‚¤ NULL NULL
DESC `‚ ‚ ‚ `;
Field Type Null Key Default Extra
‚©‚© char(1) YES MUL NULL
-‚«‚«‚« char(6) PRI
-‚­‚­‚­ char(1) YES MUL NULL
+‚«‚«‚« char(6) NO PRI
+‚­‚­‚­ char(1) YES UNI NULL
‚¯‚¯‚¯ char(1) YES NULL
SHOW CREATE TABLE `‚ ‚ ‚ `;
Table Create Table
@@ -107,7 +107,7 @@ SELECT * FROM `‚ ‚ ‚ `;
‚¤‚¤‚¤‚¤‚¤
DESC `‚ ‚ ‚ `;
Field Type Null Key Default Extra
-‚«‚«‚« char(6)
+‚«‚«‚« char(6) NO
SHOW CREATE TABLE `‚ ‚ ‚ `;
Table Create Table
‚ ‚ ‚  CREATE TABLE `‚ ‚ ‚ ` (
@@ -129,8 +129,8 @@ NULL •\•\•\•\•\ NULL NULL
DESC `ƒ\ƒ\ƒ\`;
Field Type Null Key Default Extra
\\ char(1) YES MUL NULL
-•\•\•\ char(6) PRI
-”\”\”\ char(1) YES MUL NULL
+•\•\•\ char(6) NO PRI
+”\”\”\ char(1) YES UNI NULL
—\—\—\ char(1) YES NULL
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
Table Create Table
@@ -156,7 +156,7 @@ SELECT * FROM `ƒ\ƒ\ƒ\`;
•\•\•\•\•\
DESC `ƒ\ƒ\ƒ\`;
Field Type Null Key Default Extra
-•\•\•\ char(6)
+•\•\•\ char(6) NO
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
Table Create Table
ƒ\ƒ\ƒ\ CREATE TABLE `ƒ\ƒ\ƒ\` (
@@ -193,8 +193,8 @@ NULL ³³³³³ NULL NULL
DESC `±±±`;
Field Type Null Key Default Extra
¶¶ char(1) YES MUL NULL
-··· char(6) PRI
-¸¸¸ char(1) YES MUL NULL
+··· char(6) NO PRI
+¸¸¸ char(1) YES UNI NULL
¹¹¹ char(1) YES NULL
SHOW CREATE TABLE `±±±`;
Table Create Table
@@ -220,7 +220,7 @@ SELECT * FROM `±±±`;
³³³³³
DESC `±±±`;
Field Type Null Key Default Extra
-··· char(6)
+··· char(6) NO
SHOW CREATE TABLE `±±±`;
Table Create Table
±±± CREATE TABLE `±±±` (
@@ -242,8 +242,8 @@ NULL ‚¤‚¤‚¤‚¤‚¤ NULL NULL
DESC `‚ ‚ ‚ `;
Field Type Null Key Default Extra
‚©‚© char(1) YES MUL NULL
-‚«‚«‚« char(6) PRI
-‚­‚­‚­ char(1) YES MUL NULL
+‚«‚«‚« char(6) NO PRI
+‚­‚­‚­ char(1) YES UNI NULL
‚¯‚¯‚¯ char(1) YES NULL
SHOW CREATE TABLE `‚ ‚ ‚ `;
Table Create Table
@@ -269,7 +269,7 @@ SELECT * FROM `‚ ‚ ‚ `;
‚¤‚¤‚¤‚¤‚¤
DESC `‚ ‚ ‚ `;
Field Type Null Key Default Extra
-‚«‚«‚« char(6)
+‚«‚«‚« char(6) NO
SHOW CREATE TABLE `‚ ‚ ‚ `;
Table Create Table
‚ ‚ ‚  CREATE TABLE `‚ ‚ ‚ ` (
@@ -291,8 +291,8 @@ NULL ”\”\”\”\”\ NULL NULL
DESC `ƒ\ƒ\ƒ\`;
Field Type Null Key Default Extra
\\ char(1) YES MUL NULL
-•\•\•\ char(6) PRI
-”\”\”\ char(1) YES MUL NULL
+•\•\•\ char(6) NO PRI
+”\”\”\ char(1) YES UNI NULL
—\—\—\ char(1) YES NULL
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
Table Create Table
@@ -318,7 +318,7 @@ SELECT * FROM `ƒ\ƒ\ƒ\`;
”\”\”\”\”\
DESC `ƒ\ƒ\ƒ\`;
Field Type Null Key Default Extra
-•\•\•\ char(6)
+•\•\•\ char(6) NO
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
Table Create Table
ƒ\ƒ\ƒ\ CREATE TABLE `ƒ\ƒ\ƒ\` (
@@ -355,8 +355,8 @@ NULL ³³³³³ NULL NULL
DESC `±±±`;
Field Type Null Key Default Extra
¶¶ char(1) YES MUL NULL
-··· char(6) PRI
-¸¸¸ char(1) YES MUL NULL
+··· char(6) NO PRI
+¸¸¸ char(1) YES UNI NULL
¹¹¹ char(1) YES NULL
SHOW CREATE TABLE `±±±`;
Table Create Table
@@ -368,7 +368,7 @@ Table Create Table
PRIMARY KEY (`···`),
UNIQUE KEY `¸¸¸` (`¸¸¸`),
KEY `¶¶¶` (`¶¶`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
ALTER TABLE `±±±` DROP INDEX `¶¶¶`;
ALTER TABLE `±±±` DROP PRIMARY KEY;
ALTER TABLE `±±±` DROP INDEX `¸¸¸`;
@@ -382,12 +382,12 @@ SELECT * FROM `±±±`;
³³³³³
DESC `±±±`;
Field Type Null Key Default Extra
-··· char(6)
+··· char(6) NO
SHOW CREATE TABLE `±±±`;
Table Create Table
±±± CREATE TABLE `±±±` (
`···` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
ALTER TABLE `‚ ‚ ‚ ` ADD `‚©‚©‚©` char(1) FIRST;
ALTER TABLE `‚ ‚ ‚ ` ADD `‚­‚­‚­` char(1) AFTER `‚«‚«‚«`;
ALTER TABLE `‚ ‚ ‚ ` ADD `‚¯‚¯‚¯` char(1);
@@ -404,8 +404,8 @@ NULL ‚¤‚¤‚¤‚¤‚¤ NULL NULL
DESC `‚ ‚ ‚ `;
Field Type Null Key Default Extra
‚©‚© char(1) YES MUL NULL
-‚«‚«‚« char(6) PRI
-‚­‚­‚­ char(1) YES MUL NULL
+‚«‚«‚« char(6) NO PRI
+‚­‚­‚­ char(1) YES UNI NULL
‚¯‚¯‚¯ char(1) YES NULL
SHOW CREATE TABLE `‚ ‚ ‚ `;
Table Create Table
@@ -417,7 +417,7 @@ Table Create Table
PRIMARY KEY (`‚«‚«‚«`),
UNIQUE KEY `‚­‚­‚­` (`‚­‚­‚­`),
KEY `‚©‚©‚©` (`‚©‚©`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
ALTER TABLE `‚ ‚ ‚ ` DROP INDEX `‚©‚©‚©`;
ALTER TABLE `‚ ‚ ‚ ` DROP PRIMARY KEY;
ALTER TABLE `‚ ‚ ‚ ` DROP INDEX `‚­‚­‚­`;
@@ -431,12 +431,12 @@ SELECT * FROM `‚ ‚ ‚ `;
‚¤‚¤‚¤‚¤‚¤
DESC `‚ ‚ ‚ `;
Field Type Null Key Default Extra
-‚«‚«‚« char(6)
+‚«‚«‚« char(6) NO
SHOW CREATE TABLE `‚ ‚ ‚ `;
Table Create Table
‚ ‚ ‚  CREATE TABLE `‚ ‚ ‚ ` (
`‚«‚«‚«` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
ALTER TABLE `ƒ\ƒ\ƒ\` ADD `\\\` char(1) FIRST;
ALTER TABLE `ƒ\ƒ\ƒ\` ADD `”\”\”\` char(1) AFTER `•\•\•\`;
ALTER TABLE `ƒ\ƒ\ƒ\` ADD `—\—\—\` char(1);
@@ -453,8 +453,8 @@ NULL ”\”\”\”\”\ NULL NULL
DESC `ƒ\ƒ\ƒ\`;
Field Type Null Key Default Extra
\\ char(1) YES MUL NULL
-•\•\•\ char(6) PRI
-”\”\”\ char(1) YES MUL NULL
+•\•\•\ char(6) NO PRI
+”\”\”\ char(1) YES UNI NULL
—\—\—\ char(1) YES NULL
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
Table Create Table
@@ -466,7 +466,7 @@ Table Create Table
PRIMARY KEY (`•\•\•\`),
UNIQUE KEY `”\”\”\` (`”\”\”\`),
KEY `\\\` (`\\`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
ALTER TABLE `ƒ\ƒ\ƒ\` DROP INDEX `\\\`;
ALTER TABLE `ƒ\ƒ\ƒ\` DROP PRIMARY KEY;
ALTER TABLE `ƒ\ƒ\ƒ\` DROP INDEX `”\”\”\`;
@@ -480,12 +480,12 @@ SELECT * FROM `ƒ\ƒ\ƒ\`;
”\”\”\”\”\
DESC `ƒ\ƒ\ƒ\`;
Field Type Null Key Default Extra
-•\•\•\ char(6)
+•\•\•\ char(6) NO
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
Table Create Table
ƒ\ƒ\ƒ\ CREATE TABLE `ƒ\ƒ\ƒ\` (
`•\•\•\` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
DROP TABLE `±±±`;
DROP TABLE `²²²`;
DROP TABLE `‚ ‚ ‚ `;
@@ -516,7 +516,7 @@ NULL ³³³³³ NULL NULL
DESC `±±±`;
Field Type Null Key Default Extra
¶¶ char(1) YES MUL NULL
-··· char(6) PRI
+··· char(6) NO PRI
¸¸¸ char(1) YES NULL
¹¹¹ char(1) YES NULL
SHOW CREATE TABLE `±±±`;
@@ -541,7 +541,7 @@ SELECT * FROM `±±±`;
³³³³³
DESC `±±±`;
Field Type Null Key Default Extra
-··· char(6)
+··· char(6) NO
SHOW CREATE TABLE `±±±`;
Table Create Table
±±± CREATE TABLE `±±±` (
@@ -562,7 +562,7 @@ NULL ‚¤‚¤‚¤‚¤‚¤ NULL NULL
DESC `‚ ‚ ‚ `;
Field Type Null Key Default Extra
‚©‚© char(1) YES MUL NULL
-‚«‚«‚« char(6) PRI
+‚«‚«‚« char(6) NO PRI
‚­‚­‚­ char(1) YES NULL
‚¯‚¯‚¯ char(1) YES NULL
SHOW CREATE TABLE `‚ ‚ ‚ `;
@@ -587,7 +587,7 @@ SELECT * FROM `‚ ‚ ‚ `;
‚¤‚¤‚¤‚¤‚¤
DESC `‚ ‚ ‚ `;
Field Type Null Key Default Extra
-‚«‚«‚« char(6)
+‚«‚«‚« char(6) NO
SHOW CREATE TABLE `‚ ‚ ‚ `;
Table Create Table
‚ ‚ ‚  CREATE TABLE `‚ ‚ ‚ ` (
@@ -608,7 +608,7 @@ NULL •\•\•\•\•\ NULL NULL
DESC `ƒ\ƒ\ƒ\`;
Field Type Null Key Default Extra
\\ char(1) YES MUL NULL
-•\•\•\ char(6) PRI
+•\•\•\ char(6) NO PRI
”\”\”\ char(1) YES NULL
—\—\—\ char(1) YES NULL
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
@@ -633,7 +633,7 @@ SELECT * FROM `ƒ\ƒ\ƒ\`;
•\•\•\•\•\
DESC `ƒ\ƒ\ƒ\`;
Field Type Null Key Default Extra
-•\•\•\ char(6)
+•\•\•\ char(6) NO
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
Table Create Table
ƒ\ƒ\ƒ\ CREATE TABLE `ƒ\ƒ\ƒ\` (
diff --git a/mysql-test/suite/jp/r/jp_alter_ucs2.result b/mysql-test/suite/jp/r/jp_alter_ucs2.result
index 2756e5a758d..746dfdd62cc 100644
--- a/mysql-test/suite/jp/r/jp_alter_ucs2.result
+++ b/mysql-test/suite/jp/r/jp_alter_ucs2.result
@@ -32,8 +32,8 @@ NULL Ž³Ž³Ž³Ž³Ž³ NULL NULL
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
Ž¶Ž¶ char(1) YES MUL NULL
-Ž·Ž·Ž· char(6) PRI
-Ž¸Ž¸Ž¸ char(1) YES MUL NULL
+Ž·Ž·Ž· char(6) NO PRI
+Ž¸Ž¸Ž¸ char(1) YES UNI NULL
Ž¹Ž¹Ž¹ char(1) YES NULL
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
@@ -59,7 +59,7 @@ SELECT * FROM `Ž±Ž±Ž±`;
Ž³Ž³Ž³Ž³Ž³
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
-Ž·Ž·Ž· char(6)
+Ž·Ž·Ž· char(6) NO
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
@@ -81,8 +81,8 @@ NULL ¤¦¤¦¤¦¤¦¤¦ NULL NULL
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
¤«¤« char(1) YES MUL NULL
-¤­¤­¤­ char(6) PRI
-¤¯¤¯¤¯ char(1) YES MUL NULL
+¤­¤­¤­ char(6) NO PRI
+¤¯¤¯¤¯ char(1) YES UNI NULL
¤±¤±¤± char(1) YES NULL
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
@@ -108,7 +108,7 @@ SELECT * FROM `¤¢¤¢¤¢`;
¤¦¤¦¤¦¤¦¤¦
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
-¤­¤­¤­ char(6)
+¤­¤­¤­ char(6) NO
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
@@ -130,8 +130,8 @@ NULL °£°£°£°£°£ NULL NULL
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
°¢°¢ char(1) YES MUL NULL
-°¡°¡°¡ char(6) PRI
-°£°£°£ char(1) YES MUL NULL
+°¡°¡°¡ char(6) NO PRI
+°£°£°£ char(1) YES UNI NULL
°´°´°´ char(1) YES NULL
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
@@ -157,7 +157,7 @@ SELECT * FROM `íÝíÝíÝ`;
°£°£°£°£°£
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
-°¡°¡°¡ char(6)
+°¡°¡°¡ char(6) NO
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
@@ -194,8 +194,8 @@ NULL Ž³Ž³Ž³Ž³Ž³ NULL NULL
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
Ž¶Ž¶ char(1) YES MUL NULL
-Ž·Ž·Ž· char(6) PRI
-Ž¸Ž¸Ž¸ char(1) YES MUL NULL
+Ž·Ž·Ž· char(6) NO PRI
+Ž¸Ž¸Ž¸ char(1) YES UNI NULL
Ž¹Ž¹Ž¹ char(1) YES NULL
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
@@ -221,7 +221,7 @@ SELECT * FROM `Ž±Ž±Ž±`;
Ž³Ž³Ž³Ž³Ž³
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
-Ž·Ž·Ž· char(6)
+Ž·Ž·Ž· char(6) NO
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
@@ -243,8 +243,8 @@ NULL ¤¦¤¦¤¦¤¦¤¦ NULL NULL
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
¤«¤« char(1) YES MUL NULL
-¤­¤­¤­ char(6) PRI
-¤¯¤¯¤¯ char(1) YES MUL NULL
+¤­¤­¤­ char(6) NO PRI
+¤¯¤¯¤¯ char(1) YES UNI NULL
¤±¤±¤± char(1) YES NULL
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
@@ -270,7 +270,7 @@ SELECT * FROM `¤¢¤¢¤¢`;
¤¦¤¦¤¦¤¦¤¦
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
-¤­¤­¤­ char(6)
+¤­¤­¤­ char(6) NO
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
@@ -292,8 +292,8 @@ NULL °£°£°£°£°£ NULL NULL
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
°¢°¢ char(1) YES MUL NULL
-°¡°¡°¡ char(6) PRI
-°£°£°£ char(1) YES MUL NULL
+°¡°¡°¡ char(6) NO PRI
+°£°£°£ char(1) YES UNI NULL
°´°´°´ char(1) YES NULL
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
@@ -319,7 +319,7 @@ SELECT * FROM `íÝíÝíÝ`;
°£°£°£°£°£
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
-°¡°¡°¡ char(6)
+°¡°¡°¡ char(6) NO
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
@@ -356,8 +356,8 @@ NULL Ž³Ž³Ž³Ž³Ž³ NULL NULL
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
Ž¶Ž¶ char(1) YES MUL NULL
-Ž·Ž·Ž· char(6) PRI
-Ž¸Ž¸Ž¸ char(1) YES MUL NULL
+Ž·Ž·Ž· char(6) NO PRI
+Ž¸Ž¸Ž¸ char(1) YES UNI NULL
Ž¹Ž¹Ž¹ char(1) YES NULL
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
@@ -369,7 +369,7 @@ Table Create Table
PRIMARY KEY (`Ž·Ž·Ž·`),
UNIQUE KEY `Ž¸Ž¸Ž¸` (`Ž¸Ž¸Ž¸`),
KEY `Ž¶Ž¶Ž¶` (`Ž¶Ž¶`)
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
ALTER TABLE `Ž±Ž±Ž±` DROP INDEX `Ž¶Ž¶Ž¶`;
ALTER TABLE `Ž±Ž±Ž±` DROP PRIMARY KEY;
ALTER TABLE `Ž±Ž±Ž±` DROP INDEX `Ž¸Ž¸Ž¸`;
@@ -383,12 +383,12 @@ SELECT * FROM `Ž±Ž±Ž±`;
Ž³Ž³Ž³Ž³Ž³
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
-Ž·Ž·Ž· char(6)
+Ž·Ž·Ž· char(6) NO
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
`Ž·Ž·Ž·` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
ALTER TABLE `¤¢¤¢¤¢` ADD `¤«¤«¤«` char(1) FIRST;
ALTER TABLE `¤¢¤¢¤¢` ADD `¤¯¤¯¤¯` char(1) AFTER `¤­¤­¤­`;
ALTER TABLE `¤¢¤¢¤¢` ADD `¤±¤±¤±` char(1);
@@ -405,8 +405,8 @@ NULL ¤¦¤¦¤¦¤¦¤¦ NULL NULL
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
¤«¤« char(1) YES MUL NULL
-¤­¤­¤­ char(6) PRI
-¤¯¤¯¤¯ char(1) YES MUL NULL
+¤­¤­¤­ char(6) NO PRI
+¤¯¤¯¤¯ char(1) YES UNI NULL
¤±¤±¤± char(1) YES NULL
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
@@ -418,7 +418,7 @@ Table Create Table
PRIMARY KEY (`¤­¤­¤­`),
UNIQUE KEY `¤¯¤¯¤¯` (`¤¯¤¯¤¯`),
KEY `¤«¤«¤«` (`¤«¤«`)
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
ALTER TABLE `¤¢¤¢¤¢` DROP INDEX `¤«¤«¤«`;
ALTER TABLE `¤¢¤¢¤¢` DROP PRIMARY KEY;
ALTER TABLE `¤¢¤¢¤¢` DROP INDEX `¤¯¤¯¤¯`;
@@ -432,12 +432,12 @@ SELECT * FROM `¤¢¤¢¤¢`;
¤¦¤¦¤¦¤¦¤¦
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
-¤­¤­¤­ char(6)
+¤­¤­¤­ char(6) NO
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
`¤­¤­¤­` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
ALTER TABLE `íÝíÝíÝ` ADD `°¢°¢°¢` char(1) FIRST;
ALTER TABLE `íÝíÝíÝ` ADD `°£°£°£` char(1) AFTER `°¡°¡°¡`;
ALTER TABLE `íÝíÝíÝ` ADD `°´°´°´` char(1);
@@ -454,8 +454,8 @@ NULL °£°£°£°£°£ NULL NULL
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
°¢°¢ char(1) YES MUL NULL
-°¡°¡°¡ char(6) PRI
-°£°£°£ char(1) YES MUL NULL
+°¡°¡°¡ char(6) NO PRI
+°£°£°£ char(1) YES UNI NULL
°´°´°´ char(1) YES NULL
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
@@ -467,7 +467,7 @@ Table Create Table
PRIMARY KEY (`°¡°¡°¡`),
UNIQUE KEY `°£°£°£` (`°£°£°£`),
KEY `°¢°¢°¢` (`°¢°¢`)
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
ALTER TABLE `íÝíÝíÝ` DROP INDEX `°¢°¢°¢`;
ALTER TABLE `íÝíÝíÝ` DROP PRIMARY KEY;
ALTER TABLE `íÝíÝíÝ` DROP INDEX `°£°£°£`;
@@ -481,12 +481,12 @@ SELECT * FROM `íÝíÝíÝ`;
°£°£°£°£°£
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
-°¡°¡°¡ char(6)
+°¡°¡°¡ char(6) NO
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
`°¡°¡°¡` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
DROP TABLE `Ž±Ž±Ž±`;
DROP TABLE `Ž²Ž²Ž²`;
DROP TABLE `¤¢¤¢¤¢`;
@@ -517,7 +517,7 @@ NULL Ž³Ž³Ž³Ž³Ž³ NULL NULL
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
Ž¶Ž¶ char(1) YES MUL NULL
-Ž·Ž·Ž· char(6) PRI
+Ž·Ž·Ž· char(6) NO PRI
Ž¸Ž¸Ž¸ char(1) YES NULL
Ž¹Ž¹Ž¹ char(1) YES NULL
SHOW CREATE TABLE `Ž±Ž±Ž±`;
@@ -542,7 +542,7 @@ SELECT * FROM `Ž±Ž±Ž±`;
Ž³Ž³Ž³Ž³Ž³
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
-Ž·Ž·Ž· char(6)
+Ž·Ž·Ž· char(6) NO
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
@@ -563,7 +563,7 @@ NULL ¤¦¤¦¤¦¤¦¤¦ NULL NULL
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
¤«¤« char(1) YES MUL NULL
-¤­¤­¤­ char(6) PRI
+¤­¤­¤­ char(6) NO PRI
¤¯¤¯¤¯ char(1) YES NULL
¤±¤±¤± char(1) YES NULL
SHOW CREATE TABLE `¤¢¤¢¤¢`;
@@ -588,7 +588,7 @@ SELECT * FROM `¤¢¤¢¤¢`;
¤¦¤¦¤¦¤¦¤¦
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
-¤­¤­¤­ char(6)
+¤­¤­¤­ char(6) NO
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
@@ -609,7 +609,7 @@ NULL °£°£°£°£°£ NULL NULL
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
°¢°¢ char(1) YES MUL NULL
-°¡°¡°¡ char(6) PRI
+°¡°¡°¡ char(6) NO PRI
°£°£°£ char(1) YES NULL
°´°´°´ char(1) YES NULL
SHOW CREATE TABLE `íÝíÝíÝ`;
@@ -634,7 +634,7 @@ SELECT * FROM `íÝíÝíÝ`;
°£°£°£°£°£
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
-°¡°¡°¡ char(6)
+°¡°¡°¡ char(6) NO
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
diff --git a/mysql-test/suite/jp/r/jp_alter_ujis.result b/mysql-test/suite/jp/r/jp_alter_ujis.result
index afa3c79cbce..daea68caa3f 100644
--- a/mysql-test/suite/jp/r/jp_alter_ujis.result
+++ b/mysql-test/suite/jp/r/jp_alter_ujis.result
@@ -31,8 +31,8 @@ NULL Ž³Ž³Ž³Ž³Ž³ NULL NULL
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
Ž¶Ž¶ char(1) YES MUL NULL
-Ž·Ž·Ž· char(6) PRI
-Ž¸Ž¸Ž¸ char(1) YES MUL NULL
+Ž·Ž·Ž· char(6) NO PRI
+Ž¸Ž¸Ž¸ char(1) YES UNI NULL
Ž¹Ž¹Ž¹ char(1) YES NULL
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
@@ -58,7 +58,7 @@ SELECT * FROM `Ž±Ž±Ž±`;
Ž³Ž³Ž³Ž³Ž³
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
-Ž·Ž·Ž· char(6)
+Ž·Ž·Ž· char(6) NO
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
@@ -80,8 +80,8 @@ NULL ¤¦¤¦¤¦¤¦¤¦ NULL NULL
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
¤«¤« char(1) YES MUL NULL
-¤­¤­¤­ char(6) PRI
-¤¯¤¯¤¯ char(1) YES MUL NULL
+¤­¤­¤­ char(6) NO PRI
+¤¯¤¯¤¯ char(1) YES UNI NULL
¤±¤±¤± char(1) YES NULL
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
@@ -107,7 +107,7 @@ SELECT * FROM `¤¢¤¢¤¢`;
¤¦¤¦¤¦¤¦¤¦
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
-¤­¤­¤­ char(6)
+¤­¤­¤­ char(6) NO
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
@@ -129,8 +129,8 @@ NULL °£°£°£°£°£ NULL NULL
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
°¢°¢ char(1) YES MUL NULL
-°¡°¡°¡ char(6) PRI
-°£°£°£ char(1) YES MUL NULL
+°¡°¡°¡ char(6) NO PRI
+°£°£°£ char(1) YES UNI NULL
°´°´°´ char(1) YES NULL
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
@@ -156,7 +156,7 @@ SELECT * FROM `íÝíÝíÝ`;
°£°£°£°£°£
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
-°¡°¡°¡ char(6)
+°¡°¡°¡ char(6) NO
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
@@ -193,8 +193,8 @@ NULL Ž³Ž³Ž³Ž³Ž³ NULL NULL
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
Ž¶Ž¶ char(1) YES MUL NULL
-Ž·Ž·Ž· char(6) PRI
-Ž¸Ž¸Ž¸ char(1) YES MUL NULL
+Ž·Ž·Ž· char(6) NO PRI
+Ž¸Ž¸Ž¸ char(1) YES UNI NULL
Ž¹Ž¹Ž¹ char(1) YES NULL
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
@@ -220,7 +220,7 @@ SELECT * FROM `Ž±Ž±Ž±`;
Ž³Ž³Ž³Ž³Ž³
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
-Ž·Ž·Ž· char(6)
+Ž·Ž·Ž· char(6) NO
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
@@ -242,8 +242,8 @@ NULL ¤¦¤¦¤¦¤¦¤¦ NULL NULL
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
¤«¤« char(1) YES MUL NULL
-¤­¤­¤­ char(6) PRI
-¤¯¤¯¤¯ char(1) YES MUL NULL
+¤­¤­¤­ char(6) NO PRI
+¤¯¤¯¤¯ char(1) YES UNI NULL
¤±¤±¤± char(1) YES NULL
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
@@ -269,7 +269,7 @@ SELECT * FROM `¤¢¤¢¤¢`;
¤¦¤¦¤¦¤¦¤¦
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
-¤­¤­¤­ char(6)
+¤­¤­¤­ char(6) NO
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
@@ -291,8 +291,8 @@ NULL °£°£°£°£°£ NULL NULL
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
°¢°¢ char(1) YES MUL NULL
-°¡°¡°¡ char(6) PRI
-°£°£°£ char(1) YES MUL NULL
+°¡°¡°¡ char(6) NO PRI
+°£°£°£ char(1) YES UNI NULL
°´°´°´ char(1) YES NULL
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
@@ -318,7 +318,7 @@ SELECT * FROM `íÝíÝíÝ`;
°£°£°£°£°£
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
-°¡°¡°¡ char(6)
+°¡°¡°¡ char(6) NO
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
@@ -355,8 +355,8 @@ NULL Ž³Ž³Ž³Ž³Ž³ NULL NULL
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
Ž¶Ž¶ char(1) YES MUL NULL
-Ž·Ž·Ž· char(6) PRI
-Ž¸Ž¸Ž¸ char(1) YES MUL NULL
+Ž·Ž·Ž· char(6) NO PRI
+Ž¸Ž¸Ž¸ char(1) YES UNI NULL
Ž¹Ž¹Ž¹ char(1) YES NULL
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
@@ -368,7 +368,7 @@ Table Create Table
PRIMARY KEY (`Ž·Ž·Ž·`),
UNIQUE KEY `Ž¸Ž¸Ž¸` (`Ž¸Ž¸Ž¸`),
KEY `Ž¶Ž¶Ž¶` (`Ž¶Ž¶`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
ALTER TABLE `Ž±Ž±Ž±` DROP INDEX `Ž¶Ž¶Ž¶`;
ALTER TABLE `Ž±Ž±Ž±` DROP PRIMARY KEY;
ALTER TABLE `Ž±Ž±Ž±` DROP INDEX `Ž¸Ž¸Ž¸`;
@@ -382,12 +382,12 @@ SELECT * FROM `Ž±Ž±Ž±`;
Ž³Ž³Ž³Ž³Ž³
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
-Ž·Ž·Ž· char(6)
+Ž·Ž·Ž· char(6) NO
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
`Ž·Ž·Ž·` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
ALTER TABLE `¤¢¤¢¤¢` ADD `¤«¤«¤«` char(1) FIRST;
ALTER TABLE `¤¢¤¢¤¢` ADD `¤¯¤¯¤¯` char(1) AFTER `¤­¤­¤­`;
ALTER TABLE `¤¢¤¢¤¢` ADD `¤±¤±¤±` char(1);
@@ -404,8 +404,8 @@ NULL ¤¦¤¦¤¦¤¦¤¦ NULL NULL
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
¤«¤« char(1) YES MUL NULL
-¤­¤­¤­ char(6) PRI
-¤¯¤¯¤¯ char(1) YES MUL NULL
+¤­¤­¤­ char(6) NO PRI
+¤¯¤¯¤¯ char(1) YES UNI NULL
¤±¤±¤± char(1) YES NULL
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
@@ -417,7 +417,7 @@ Table Create Table
PRIMARY KEY (`¤­¤­¤­`),
UNIQUE KEY `¤¯¤¯¤¯` (`¤¯¤¯¤¯`),
KEY `¤«¤«¤«` (`¤«¤«`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
ALTER TABLE `¤¢¤¢¤¢` DROP INDEX `¤«¤«¤«`;
ALTER TABLE `¤¢¤¢¤¢` DROP PRIMARY KEY;
ALTER TABLE `¤¢¤¢¤¢` DROP INDEX `¤¯¤¯¤¯`;
@@ -431,12 +431,12 @@ SELECT * FROM `¤¢¤¢¤¢`;
¤¦¤¦¤¦¤¦¤¦
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
-¤­¤­¤­ char(6)
+¤­¤­¤­ char(6) NO
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
`¤­¤­¤­` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
ALTER TABLE `íÝíÝíÝ` ADD `°¢°¢°¢` char(1) FIRST;
ALTER TABLE `íÝíÝíÝ` ADD `°£°£°£` char(1) AFTER `°¡°¡°¡`;
ALTER TABLE `íÝíÝíÝ` ADD `°´°´°´` char(1);
@@ -453,8 +453,8 @@ NULL °£°£°£°£°£ NULL NULL
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
°¢°¢ char(1) YES MUL NULL
-°¡°¡°¡ char(6) PRI
-°£°£°£ char(1) YES MUL NULL
+°¡°¡°¡ char(6) NO PRI
+°£°£°£ char(1) YES UNI NULL
°´°´°´ char(1) YES NULL
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
@@ -466,7 +466,7 @@ Table Create Table
PRIMARY KEY (`°¡°¡°¡`),
UNIQUE KEY `°£°£°£` (`°£°£°£`),
KEY `°¢°¢°¢` (`°¢°¢`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
ALTER TABLE `íÝíÝíÝ` DROP INDEX `°¢°¢°¢`;
ALTER TABLE `íÝíÝíÝ` DROP PRIMARY KEY;
ALTER TABLE `íÝíÝíÝ` DROP INDEX `°£°£°£`;
@@ -480,12 +480,12 @@ SELECT * FROM `íÝíÝíÝ`;
°£°£°£°£°£
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
-°¡°¡°¡ char(6)
+°¡°¡°¡ char(6) NO
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
`°¡°¡°¡` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
DROP TABLE `Ž±Ž±Ž±`;
DROP TABLE `Ž²Ž²Ž²`;
DROP TABLE `¤¢¤¢¤¢`;
@@ -516,7 +516,7 @@ NULL Ž³Ž³Ž³Ž³Ž³ NULL NULL
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
Ž¶Ž¶ char(1) YES MUL NULL
-Ž·Ž·Ž· char(6) PRI
+Ž·Ž·Ž· char(6) NO PRI
Ž¸Ž¸Ž¸ char(1) YES NULL
Ž¹Ž¹Ž¹ char(1) YES NULL
SHOW CREATE TABLE `Ž±Ž±Ž±`;
@@ -541,7 +541,7 @@ SELECT * FROM `Ž±Ž±Ž±`;
Ž³Ž³Ž³Ž³Ž³
DESC `Ž±Ž±Ž±`;
Field Type Null Key Default Extra
-Ž·Ž·Ž· char(6)
+Ž·Ž·Ž· char(6) NO
SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
@@ -562,7 +562,7 @@ NULL ¤¦¤¦¤¦¤¦¤¦ NULL NULL
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
¤«¤« char(1) YES MUL NULL
-¤­¤­¤­ char(6) PRI
+¤­¤­¤­ char(6) NO PRI
¤¯¤¯¤¯ char(1) YES NULL
¤±¤±¤± char(1) YES NULL
SHOW CREATE TABLE `¤¢¤¢¤¢`;
@@ -587,7 +587,7 @@ SELECT * FROM `¤¢¤¢¤¢`;
¤¦¤¦¤¦¤¦¤¦
DESC `¤¢¤¢¤¢`;
Field Type Null Key Default Extra
-¤­¤­¤­ char(6)
+¤­¤­¤­ char(6) NO
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
@@ -608,7 +608,7 @@ NULL °£°£°£°£°£ NULL NULL
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
°¢°¢ char(1) YES MUL NULL
-°¡°¡°¡ char(6) PRI
+°¡°¡°¡ char(6) NO PRI
°£°£°£ char(1) YES NULL
°´°´°´ char(1) YES NULL
SHOW CREATE TABLE `íÝíÝíÝ`;
@@ -633,7 +633,7 @@ SELECT * FROM `íÝíÝíÝ`;
°£°£°£°£°£
DESC `íÝíÝíÝ`;
Field Type Null Key Default Extra
-°¡°¡°¡ char(6)
+°¡°¡°¡ char(6) NO
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
diff --git a/mysql-test/suite/jp/r/jp_alter_utf8.result b/mysql-test/suite/jp/r/jp_alter_utf8.result
index 19475e06a87..f2f374eed87 100644
--- a/mysql-test/suite/jp/r/jp_alter_utf8.result
+++ b/mysql-test/suite/jp/r/jp_alter_utf8.result
@@ -31,8 +31,8 @@ NULL ウウウウウ NULL NULL
DESC `アアア`;
Field Type Null Key Default Extra
カカ char(1) YES MUL NULL
-ï½·ï½·ï½· char(6) PRI
-ククク char(1) YES MUL NULL
+ï½·ï½·ï½· char(6) NO PRI
+ククク char(1) YES UNI NULL
ケケケ char(1) YES NULL
SHOW CREATE TABLE `アアア`;
Table Create Table
@@ -58,7 +58,7 @@ SELECT * FROM `アアア`;
ウウウウウ
DESC `アアア`;
Field Type Null Key Default Extra
-ï½·ï½·ï½· char(6)
+ï½·ï½·ï½· char(6) NO
SHOW CREATE TABLE `アアア`;
Table Create Table
アアア CREATE TABLE `アアア` (
@@ -80,8 +80,8 @@ NULL ã†ã†ã†ã†ã† NULL NULL
DESC `ã‚ã‚ã‚`;
Field Type Null Key Default Extra
ã‹ã‹ char(1) YES MUL NULL
-ããã char(6) PRI
-ããã char(1) YES MUL NULL
+ããã char(6) NO PRI
+ããã char(1) YES UNI NULL
ã‘ã‘ã‘ char(1) YES NULL
SHOW CREATE TABLE `ã‚ã‚ã‚`;
Table Create Table
@@ -107,7 +107,7 @@ SELECT * FROM `ã‚ã‚ã‚`;
ã†ã†ã†ã†ã†
DESC `ã‚ã‚ã‚`;
Field Type Null Key Default Extra
-ããã char(6)
+ããã char(6) NO
SHOW CREATE TABLE `ã‚ã‚ã‚`;
Table Create Table
ã‚ã‚ã‚ CREATE TABLE `ã‚ã‚ã‚` (
@@ -129,8 +129,8 @@ NULL 丅丅丅丅丅 NULL NULL
DESC `é¾–é¾–é¾–`;
Field Type Null Key Default Extra
丄丄 char(1) YES MUL NULL
-丂丂丂 char(6) PRI
-丅丅丅 char(1) YES MUL NULL
+丂丂丂 char(6) NO PRI
+丅丅丅 char(1) YES UNI NULL
乚乚乚 char(1) YES NULL
SHOW CREATE TABLE `é¾–é¾–é¾–`;
Table Create Table
@@ -156,7 +156,7 @@ SELECT * FROM `é¾–é¾–é¾–`;
丅丅丅丅丅
DESC `é¾–é¾–é¾–`;
Field Type Null Key Default Extra
-丂丂丂 char(6)
+丂丂丂 char(6) NO
SHOW CREATE TABLE `é¾–é¾–é¾–`;
Table Create Table
é¾–é¾–é¾– CREATE TABLE `é¾–é¾–é¾–` (
@@ -193,8 +193,8 @@ NULL ウウウウウ NULL NULL
DESC `アアア`;
Field Type Null Key Default Extra
カカ char(1) YES MUL NULL
-ï½·ï½·ï½· char(6) PRI
-ククク char(1) YES MUL NULL
+ï½·ï½·ï½· char(6) NO PRI
+ククク char(1) YES UNI NULL
ケケケ char(1) YES NULL
SHOW CREATE TABLE `アアア`;
Table Create Table
@@ -220,7 +220,7 @@ SELECT * FROM `アアア`;
ウウウウウ
DESC `アアア`;
Field Type Null Key Default Extra
-ï½·ï½·ï½· char(6)
+ï½·ï½·ï½· char(6) NO
SHOW CREATE TABLE `アアア`;
Table Create Table
アアア CREATE TABLE `アアア` (
@@ -242,8 +242,8 @@ NULL ã†ã†ã†ã†ã† NULL NULL
DESC `ã‚ã‚ã‚`;
Field Type Null Key Default Extra
ã‹ã‹ char(1) YES MUL NULL
-ããã char(6) PRI
-ããã char(1) YES MUL NULL
+ããã char(6) NO PRI
+ããã char(1) YES UNI NULL
ã‘ã‘ã‘ char(1) YES NULL
SHOW CREATE TABLE `ã‚ã‚ã‚`;
Table Create Table
@@ -269,7 +269,7 @@ SELECT * FROM `ã‚ã‚ã‚`;
ã†ã†ã†ã†ã†
DESC `ã‚ã‚ã‚`;
Field Type Null Key Default Extra
-ããã char(6)
+ããã char(6) NO
SHOW CREATE TABLE `ã‚ã‚ã‚`;
Table Create Table
ã‚ã‚ã‚ CREATE TABLE `ã‚ã‚ã‚` (
@@ -291,8 +291,8 @@ NULL 丅丅丅丅丅 NULL NULL
DESC `é¾–é¾–é¾–`;
Field Type Null Key Default Extra
丄丄 char(1) YES MUL NULL
-丂丂丂 char(6) PRI
-丅丅丅 char(1) YES MUL NULL
+丂丂丂 char(6) NO PRI
+丅丅丅 char(1) YES UNI NULL
乚乚乚 char(1) YES NULL
SHOW CREATE TABLE `é¾–é¾–é¾–`;
Table Create Table
@@ -318,7 +318,7 @@ SELECT * FROM `é¾–é¾–é¾–`;
丅丅丅丅丅
DESC `é¾–é¾–é¾–`;
Field Type Null Key Default Extra
-丂丂丂 char(6)
+丂丂丂 char(6) NO
SHOW CREATE TABLE `é¾–é¾–é¾–`;
Table Create Table
é¾–é¾–é¾– CREATE TABLE `é¾–é¾–é¾–` (
@@ -355,8 +355,8 @@ NULL ウウウウウ NULL NULL
DESC `アアア`;
Field Type Null Key Default Extra
カカ char(1) YES MUL NULL
-ï½·ï½·ï½· char(6) PRI
-ククク char(1) YES MUL NULL
+ï½·ï½·ï½· char(6) NO PRI
+ククク char(1) YES UNI NULL
ケケケ char(1) YES NULL
SHOW CREATE TABLE `アアア`;
Table Create Table
@@ -368,7 +368,7 @@ Table Create Table
PRIMARY KEY (`ï½·ï½·ï½·`),
UNIQUE KEY `ククク` (`ククク`),
KEY `カカカ` (`カカ`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
ALTER TABLE `アアア` DROP INDEX `カカカ`;
ALTER TABLE `アアア` DROP PRIMARY KEY;
ALTER TABLE `アアア` DROP INDEX `ククク`;
@@ -382,12 +382,12 @@ SELECT * FROM `アアア`;
ウウウウウ
DESC `アアア`;
Field Type Null Key Default Extra
-ï½·ï½·ï½· char(6)
+ï½·ï½·ï½· char(6) NO
SHOW CREATE TABLE `アアア`;
Table Create Table
アアア CREATE TABLE `アアア` (
`ï½·ï½·ï½·` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
ALTER TABLE `ã‚ã‚ã‚` ADD `ã‹ã‹ã‹` char(1) FIRST;
ALTER TABLE `ã‚ã‚ã‚` ADD `ããã` char(1) AFTER `ããã`;
ALTER TABLE `ã‚ã‚ã‚` ADD `ã‘ã‘ã‘` char(1);
@@ -404,8 +404,8 @@ NULL ã†ã†ã†ã†ã† NULL NULL
DESC `ã‚ã‚ã‚`;
Field Type Null Key Default Extra
ã‹ã‹ char(1) YES MUL NULL
-ããã char(6) PRI
-ããã char(1) YES MUL NULL
+ããã char(6) NO PRI
+ããã char(1) YES UNI NULL
ã‘ã‘ã‘ char(1) YES NULL
SHOW CREATE TABLE `ã‚ã‚ã‚`;
Table Create Table
@@ -417,7 +417,7 @@ Table Create Table
PRIMARY KEY (`ããã`),
UNIQUE KEY `ããã` (`ããã`),
KEY `ã‹ã‹ã‹` (`ã‹ã‹`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
ALTER TABLE `ã‚ã‚ã‚` DROP INDEX `ã‹ã‹ã‹`;
ALTER TABLE `ã‚ã‚ã‚` DROP PRIMARY KEY;
ALTER TABLE `ã‚ã‚ã‚` DROP INDEX `ããã`;
@@ -431,12 +431,12 @@ SELECT * FROM `ã‚ã‚ã‚`;
ã†ã†ã†ã†ã†
DESC `ã‚ã‚ã‚`;
Field Type Null Key Default Extra
-ããã char(6)
+ããã char(6) NO
SHOW CREATE TABLE `ã‚ã‚ã‚`;
Table Create Table
ã‚ã‚ã‚ CREATE TABLE `ã‚ã‚ã‚` (
`ããã` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
ALTER TABLE `龖龖龖` ADD `丄丄丄` char(1) FIRST;
ALTER TABLE `龖龖龖` ADD `丅丅丅` char(1) AFTER `丂丂丂`;
ALTER TABLE `龖龖龖` ADD `乚乚乚` char(1);
@@ -453,8 +453,8 @@ NULL 丅丅丅丅丅 NULL NULL
DESC `é¾–é¾–é¾–`;
Field Type Null Key Default Extra
丄丄 char(1) YES MUL NULL
-丂丂丂 char(6) PRI
-丅丅丅 char(1) YES MUL NULL
+丂丂丂 char(6) NO PRI
+丅丅丅 char(1) YES UNI NULL
乚乚乚 char(1) YES NULL
SHOW CREATE TABLE `é¾–é¾–é¾–`;
Table Create Table
@@ -466,7 +466,7 @@ Table Create Table
PRIMARY KEY (`丂丂丂`),
UNIQUE KEY `丅丅丅` (`丅丅丅`),
KEY `丄丄丄` (`丄丄`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
ALTER TABLE `龖龖龖` DROP INDEX `丄丄丄`;
ALTER TABLE `é¾–é¾–é¾–` DROP PRIMARY KEY;
ALTER TABLE `龖龖龖` DROP INDEX `丅丅丅`;
@@ -480,12 +480,12 @@ SELECT * FROM `é¾–é¾–é¾–`;
丅丅丅丅丅
DESC `é¾–é¾–é¾–`;
Field Type Null Key Default Extra
-丂丂丂 char(6)
+丂丂丂 char(6) NO
SHOW CREATE TABLE `é¾–é¾–é¾–`;
Table Create Table
é¾–é¾–é¾– CREATE TABLE `é¾–é¾–é¾–` (
`丂丂丂` char(6) NOT NULL default ''
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
DROP TABLE `アアア`;
DROP TABLE `イイイ`;
DROP TABLE `ã‚ã‚ã‚`;
@@ -516,7 +516,7 @@ NULL ウウウウウ NULL NULL
DESC `アアア`;
Field Type Null Key Default Extra
カカ char(1) YES MUL NULL
-ï½·ï½·ï½· char(6) PRI
+ï½·ï½·ï½· char(6) NO PRI
ククク char(1) YES NULL
ケケケ char(1) YES NULL
SHOW CREATE TABLE `アアア`;
@@ -541,7 +541,7 @@ SELECT * FROM `アアア`;
ウウウウウ
DESC `アアア`;
Field Type Null Key Default Extra
-ï½·ï½·ï½· char(6)
+ï½·ï½·ï½· char(6) NO
SHOW CREATE TABLE `アアア`;
Table Create Table
アアア CREATE TABLE `アアア` (
@@ -562,7 +562,7 @@ NULL ã†ã†ã†ã†ã† NULL NULL
DESC `ã‚ã‚ã‚`;
Field Type Null Key Default Extra
ã‹ã‹ char(1) YES MUL NULL
-ããã char(6) PRI
+ããã char(6) NO PRI
ããã char(1) YES NULL
ã‘ã‘ã‘ char(1) YES NULL
SHOW CREATE TABLE `ã‚ã‚ã‚`;
@@ -587,7 +587,7 @@ SELECT * FROM `ã‚ã‚ã‚`;
ã†ã†ã†ã†ã†
DESC `ã‚ã‚ã‚`;
Field Type Null Key Default Extra
-ããã char(6)
+ããã char(6) NO
SHOW CREATE TABLE `ã‚ã‚ã‚`;
Table Create Table
ã‚ã‚ã‚ CREATE TABLE `ã‚ã‚ã‚` (
@@ -608,7 +608,7 @@ NULL 丅丅丅丅丅 NULL NULL
DESC `é¾–é¾–é¾–`;
Field Type Null Key Default Extra
丄丄 char(1) YES MUL NULL
-丂丂丂 char(6) PRI
+丂丂丂 char(6) NO PRI
丅丅丅 char(1) YES NULL
乚乚乚 char(1) YES NULL
SHOW CREATE TABLE `é¾–é¾–é¾–`;
@@ -633,7 +633,7 @@ SELECT * FROM `é¾–é¾–é¾–`;
丅丅丅丅丅
DESC `é¾–é¾–é¾–`;
Field Type Null Key Default Extra
-丂丂丂 char(6)
+丂丂丂 char(6) NO
SHOW CREATE TABLE `é¾–é¾–é¾–`;
Table Create Table
é¾–é¾–é¾– CREATE TABLE `é¾–é¾–é¾–` (
diff --git a/mysql-test/suite/jp/r/jp_charset_sjis.result b/mysql-test/suite/jp/r/jp_charset_sjis.result
index 80ef24a7334..312033be719 100644
--- a/mysql-test/suite/jp/r/jp_charset_sjis.result
+++ b/mysql-test/suite/jp/r/jp_charset_sjis.result
@@ -24,18 +24,6 @@ CREATE TABLE `‚s‚X` (`‚b‚P` char(20)) DEFAULT CHARSET = sjis engine = heap;
CREATE TABLE `‚s‚P‚O` (`‚b‚P` char(20)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚P` (`‚b‚P` char(20)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20)) DEFAULT CHARSET = sjis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
SELECT DISTINCT CHARSET(`‚b‚P`) FROM `‚s‚P`;
CHARSET(`‚b‚P`)
sjis
diff --git a/mysql-test/suite/jp/r/jp_charset_ujis.result b/mysql-test/suite/jp/r/jp_charset_ujis.result
index 964477896bd..4f6e68ba137 100644
--- a/mysql-test/suite/jp/r/jp_charset_ujis.result
+++ b/mysql-test/suite/jp/r/jp_charset_ujis.result
@@ -24,18 +24,6 @@ CREATE TABLE `£Ô£¹` (`£Ã£±` char(20)) DEFAULT CHARSET = ujis engine = heap;
CREATE TABLE `£Ô£±£°` (`£Ã£±` char(20)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£±` (`£Ã£±` char(20)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£²` (`£Ã£±` char(20)) DEFAULT CHARSET = ujis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
SELECT DISTINCT CHARSET(`£Ã£±`) FROM `£Ô£±`;
CHARSET(`£Ã£±`)
ujis
diff --git a/mysql-test/suite/jp/r/jp_charset_utf8.result b/mysql-test/suite/jp/r/jp_charset_utf8.result
index 2fdd3fb1a6b..04140828d14 100644
--- a/mysql-test/suite/jp/r/jp_charset_utf8.result
+++ b/mysql-test/suite/jp/r/jp_charset_utf8.result
@@ -24,18 +24,6 @@ CREATE TABLE `T9` (`C1` char(20)) DEFAULT CHARSET = utf8 engine = heap;
CREATE TABLE `T1ï¼` (`C1` char(20)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T11` (`C1` char(20)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T12` (`C1` char(20)) DEFAULT CHARSET = utf8 engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
SELECT DISTINCT CHARSET(`C1`) FROM `T1`;
CHARSET(`C1`)
utf8
diff --git a/mysql-test/suite/jp/r/jp_convert_sjis.result b/mysql-test/suite/jp/r/jp_convert_sjis.result
index 8c9df3606c8..bc581ca56b0 100644
--- a/mysql-test/suite/jp/r/jp_convert_sjis.result
+++ b/mysql-test/suite/jp/r/jp_convert_sjis.result
@@ -24,18 +24,6 @@ CREATE TABLE `‚s‚X` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engi
CREATE TABLE `‚s‚P‚O` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚P` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚P`;
‚b‚P CONVERT(`‚b‚P` using utf8)
!"#$%&'()*+,-./ !"#$%&'()*+,-./
@@ -278,12 +266,15 @@ SELECT `‚b‚P`, CONVERT(`‚b‚P` using ujis) FROM `‚s‚Q`;
êê‘ê’ê“ê”ê•ê–ê—ê˜ê™êšê›êœêêžEEEEE êê‘ê’ê“ê”ê•ê–ê—ê˜ê™êšê›êœêêžEEEEE
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚R`;
‚b‚P CONVERT(`‚b‚P` using utf8)
+
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
SELECT `‚b‚P`, CONVERT(`‚b‚P` using ucs2) FROM `‚s‚R`;
‚b‚P CONVERT(`‚b‚P` using ucs2)
+
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
SELECT `‚b‚P`, CONVERT(`‚b‚P` using ujis) FROM `‚s‚R`;
‚b‚P CONVERT(`‚b‚P` using ujis)
+
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚S`;
‚b‚P CONVERT(`‚b‚P` using utf8)
@@ -527,12 +518,15 @@ SELECT `‚b‚P`, CONVERT(`‚b‚P` using ujis) FROM `‚s‚T`;
êê‘ê’ê“ê”ê•ê–ê—ê˜ê™êšê›êœêêžEEEEE êê‘ê’ê“ê”ê•ê–ê—ê˜ê™êšê›êœêêžEEEEE
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚U`;
‚b‚P CONVERT(`‚b‚P` using utf8)
+
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
SELECT `‚b‚P`, CONVERT(`‚b‚P` using ucs2) FROM `‚s‚U`;
‚b‚P CONVERT(`‚b‚P` using ucs2)
+
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
SELECT `‚b‚P`, CONVERT(`‚b‚P` using ujis) FROM `‚s‚U`;
‚b‚P CONVERT(`‚b‚P` using ujis)
+
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚V`;
‚b‚P CONVERT(`‚b‚P` using utf8)
@@ -777,12 +771,15 @@ SELECT `‚b‚P`, CONVERT(`‚b‚P` using ujis) FROM `‚s‚W`;
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚X`;
‚b‚P CONVERT(`‚b‚P` using utf8)
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
+
SELECT `‚b‚P`, CONVERT(`‚b‚P` using ucs2) FROM `‚s‚X`;
‚b‚P CONVERT(`‚b‚P` using ucs2)
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
+
SELECT `‚b‚P`, CONVERT(`‚b‚P` using ujis) FROM `‚s‚X`;
‚b‚P CONVERT(`‚b‚P` using ujis)
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
+
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚P‚O`;
‚b‚P CONVERT(`‚b‚P` using utf8)
!"#$%&'()*+,-./ !"#$%&'()*+,-./
@@ -1026,12 +1023,15 @@ SELECT `‚b‚P`, CONVERT(`‚b‚P` using ujis) FROM `‚s‚P‚P`;
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚P‚Q`;
‚b‚P CONVERT(`‚b‚P` using utf8)
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
+
SELECT `‚b‚P`, CONVERT(`‚b‚P` using ucs2) FROM `‚s‚P‚Q`;
‚b‚P CONVERT(`‚b‚P` using ucs2)
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
+
SELECT `‚b‚P`, CONVERT(`‚b‚P` using ujis) FROM `‚s‚P‚Q`;
‚b‚P CONVERT(`‚b‚P` using ujis)
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\ ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
+
drop table `‚s‚P`;
drop table `‚s‚Q`;
drop table `‚s‚R`;
diff --git a/mysql-test/suite/jp/r/jp_convert_ujis.result b/mysql-test/suite/jp/r/jp_convert_ujis.result
index 55f2ab0aea3..f256d8b08b4 100644
--- a/mysql-test/suite/jp/r/jp_convert_ujis.result
+++ b/mysql-test/suite/jp/r/jp_convert_ujis.result
@@ -24,18 +24,6 @@ CREATE TABLE `£Ô£¹` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engi
CREATE TABLE `£Ô£±£°` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£±` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£²` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
SELECT `£Ã£±`, CONVERT(`£Ã£±` using utf8) FROM `£Ô£±`;
£Ã£± CONVERT(`£Ã£±` using utf8)
!"#$%&'()*+,-./ !"#$%&'()*+,-./
diff --git a/mysql-test/suite/jp/r/jp_convert_utf8.result b/mysql-test/suite/jp/r/jp_convert_utf8.result
index 505d6c1cebf..944f1c1068c 100644
--- a/mysql-test/suite/jp/r/jp_convert_utf8.result
+++ b/mysql-test/suite/jp/r/jp_convert_utf8.result
@@ -24,18 +24,6 @@ CREATE TABLE `T9` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf
CREATE TABLE `T1ï¼` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T11` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T12` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
SELECT `C1`, CONVERT(`C1` using ujis) FROM `T1`;
C1 CONVERT(`C1` using ujis)
!"#$%&'()*+,-./ !"#$%&'()*+,-./
diff --git a/mysql-test/suite/jp/r/jp_create_db_sjis.result b/mysql-test/suite/jp/r/jp_create_db_sjis.result
index 1ce0b7228d5..5d13cf74a39 100644
--- a/mysql-test/suite/jp/r/jp_create_db_sjis.result
+++ b/mysql-test/suite/jp/r/jp_create_db_sjis.result
@@ -8,6 +8,7 @@ CREATE DATABASE `“ú–{Œê`;
CREATE DATABASE `ƒ\\•\`;
SHOW DATABASES;
Database
+information_schema
mysql
test
ƒ\\•\
diff --git a/mysql-test/suite/jp/r/jp_create_db_ucs2.result b/mysql-test/suite/jp/r/jp_create_db_ucs2.result
index 8fd921ea8e6..f03baadf707 100644
--- a/mysql-test/suite/jp/r/jp_create_db_ucs2.result
+++ b/mysql-test/suite/jp/r/jp_create_db_ucs2.result
@@ -9,6 +9,7 @@ CREATE DATABASE `ÆüËܸì`;
CREATE DATABASE `íÜíÝíÞ`;
SHOW DATABASES;
Database
+information_schema
mysql
test
ÆüËܸì
diff --git a/mysql-test/suite/jp/r/jp_create_db_ujis.result b/mysql-test/suite/jp/r/jp_create_db_ujis.result
index 45fdb34717b..627381bbacb 100644
--- a/mysql-test/suite/jp/r/jp_create_db_ujis.result
+++ b/mysql-test/suite/jp/r/jp_create_db_ujis.result
@@ -8,6 +8,7 @@ CREATE DATABASE `ÆüËܸì`;
CREATE DATABASE `íÜíÝíÞ`;
SHOW DATABASES;
Database
+information_schema
mysql
test
ÆüËܸì
diff --git a/mysql-test/suite/jp/r/jp_create_db_utf8.result b/mysql-test/suite/jp/r/jp_create_db_utf8.result
index c0e996040de..1813259bdc9 100644
--- a/mysql-test/suite/jp/r/jp_create_db_utf8.result
+++ b/mysql-test/suite/jp/r/jp_create_db_utf8.result
@@ -8,6 +8,7 @@ CREATE DATABASE `日本語`;
CREATE DATABASE `龔龖龗`;
SHOW DATABASES;
Database
+information_schema
mysql
test
日本語
diff --git a/mysql-test/suite/jp/r/jp_create_tbl_sjis.result b/mysql-test/suite/jp/r/jp_create_tbl_sjis.result
index ecc72f9d91b..763a25bc127 100644
--- a/mysql-test/suite/jp/r/jp_create_tbl_sjis.result
+++ b/mysql-test/suite/jp/r/jp_create_tbl_sjis.result
@@ -22,11 +22,23 @@ CREATE TABLE `‚¢‚¢‚¢`(`‚«‚«‚«` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
CREATE TABLE `ƒ\ƒ\ƒ\`(`‰\‰\‰\` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
CREATE TABLE `\\\`(`Ž\Ž\Ž\` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
CREATE TABLE IF NOT EXISTS `±±±`(`¶¶¶` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
+Warnings:
+Note 1050 Table '±±±' already exists
CREATE TABLE IF NOT EXISTS `²²²`(`···` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
+Warnings:
+Note 1050 Table '²²²' already exists
CREATE TABLE IF NOT EXISTS `‚ ‚ ‚ `(`‚©‚©‚©` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
+Warnings:
+Note 1050 Table '‚ ‚ ‚ ' already exists
CREATE TABLE IF NOT EXISTS `‚¢‚¢‚¢`(`‚«‚«‚«` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
+Warnings:
+Note 1050 Table '‚¢‚¢‚¢' already exists
CREATE TABLE IF NOT EXISTS `ƒ\ƒ\ƒ\`(`‰\‰\‰\` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
+Warnings:
+Note 1050 Table 'ƒ\ƒ\ƒ\' already exists
CREATE TABLE IF NOT EXISTS `\\\`(`Ž\Ž\Ž\` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
+Warnings:
+Note 1050 Table '\\\' already exists
CREATE TABLE IF NOT EXISTS `³³³`(`¸¸¸` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
CREATE TABLE IF NOT EXISTS `‚¤‚¤‚¤`(`‚­‚­‚­` char(1)) DEFAULT CHARSET = sjis engine=INNODB;
CREATE TABLE IF NOT EXISTS `•\•\•\`(`\\\`char(1)) DEFAULT CHARSET = sjis engine=INNODB;
@@ -178,11 +190,23 @@ CREATE TABLE `‚¢‚¢‚¢`(`‚«‚«‚«` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
CREATE TABLE `ƒ\ƒ\ƒ\`(`‰\‰\‰\` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
CREATE TABLE `\\\`(`Ž\Ž\Ž\` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
CREATE TABLE IF NOT EXISTS `±±±`(`¶¶¶` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
+Warnings:
+Note 1050 Table '±±±' already exists
CREATE TABLE IF NOT EXISTS `²²²`(`···` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
+Warnings:
+Note 1050 Table '²²²' already exists
CREATE TABLE IF NOT EXISTS `‚ ‚ ‚ `(`‚©‚©‚©` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
+Warnings:
+Note 1050 Table '‚ ‚ ‚ ' already exists
CREATE TABLE IF NOT EXISTS `‚¢‚¢‚¢`(`‚«‚«‚«` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
+Warnings:
+Note 1050 Table '‚¢‚¢‚¢' already exists
CREATE TABLE IF NOT EXISTS `ƒ\ƒ\ƒ\`(`‰\‰\‰\` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
+Warnings:
+Note 1050 Table 'ƒ\ƒ\ƒ\' already exists
CREATE TABLE IF NOT EXISTS `\\\`(`Ž\Ž\Ž\` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
+Warnings:
+Note 1050 Table '\\\' already exists
CREATE TABLE IF NOT EXISTS `³³³`(`¸¸¸` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
CREATE TABLE IF NOT EXISTS `‚¤‚¤‚¤`(`‚­‚­‚­` char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
CREATE TABLE IF NOT EXISTS `•\•\•\`(`\\\`char(1)) DEFAULT CHARSET = sjis engine=MyISAM;
@@ -334,11 +358,23 @@ CREATE TABLE `‚¢‚¢‚¢`(`‚«‚«‚«` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
CREATE TABLE `ƒ\ƒ\ƒ\`(`‰\‰\‰\` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
CREATE TABLE `\\\`(`Ž\Ž\Ž\` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
CREATE TABLE IF NOT EXISTS `±±±`(`¶¶¶` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
+Warnings:
+Note 1050 Table '±±±' already exists
CREATE TABLE IF NOT EXISTS `²²²`(`···` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
+Warnings:
+Note 1050 Table '²²²' already exists
CREATE TABLE IF NOT EXISTS `‚ ‚ ‚ `(`‚©‚©‚©` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
+Warnings:
+Note 1050 Table '‚ ‚ ‚ ' already exists
CREATE TABLE IF NOT EXISTS `‚¢‚¢‚¢`(`‚«‚«‚«` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
+Warnings:
+Note 1050 Table '‚¢‚¢‚¢' already exists
CREATE TABLE IF NOT EXISTS `ƒ\ƒ\ƒ\`(`‰\‰\‰\` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
+Warnings:
+Note 1050 Table 'ƒ\ƒ\ƒ\' already exists
CREATE TABLE IF NOT EXISTS `\\\`(`Ž\Ž\Ž\` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
+Warnings:
+Note 1050 Table '\\\' already exists
CREATE TABLE IF NOT EXISTS `³³³`(`¸¸¸` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
CREATE TABLE IF NOT EXISTS `‚¤‚¤‚¤`(`‚­‚­‚­` char(1)) DEFAULT CHARSET = sjis engine=HEAP;
CREATE TABLE IF NOT EXISTS `•\•\•\`(`\\\`char(1)) DEFAULT CHARSET = sjis engine=HEAP;
@@ -397,77 +433,77 @@ SHOW CREATE TABLE `±±±`;
Table Create Table
±±± CREATE TABLE `±±±` (
`¶¶¶` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `²²²`;
Table Create Table
²²² CREATE TABLE `²²²` (
`···` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `³³³`;
Table Create Table
³³³ CREATE TABLE `³³³` (
`¸¸¸` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `´´´`;
Table Create Table
´´´ CREATE TEMPORARY TABLE `´´´` (
`¹¹¹` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `µµµ`;
Table Create Table
µµµ CREATE TEMPORARY TABLE `µµµ` (
`ººº` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚ ‚ ‚ `;
Table Create Table
‚ ‚ ‚  CREATE TABLE `‚ ‚ ‚ ` (
`‚©‚©‚©` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚¢‚¢‚¢`;
Table Create Table
‚¢‚¢‚¢ CREATE TABLE `‚¢‚¢‚¢` (
`‚«‚«‚«` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚¤‚¤‚¤`;
Table Create Table
‚¤‚¤‚¤ CREATE TABLE `‚¤‚¤‚¤` (
`‚­‚­‚­` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚¦‚¦‚¦`;
Table Create Table
‚¦‚¦‚¦ CREATE TEMPORARY TABLE `‚¦‚¦‚¦` (
`‚¯‚¯‚¯` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚¨‚¨‚¨`;
Table Create Table
‚¨‚¨‚¨ CREATE TEMPORARY TABLE `‚¨‚¨‚¨` (
`‚±‚±‚±` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `ƒ\ƒ\ƒ\`;
Table Create Table
ƒ\ƒ\ƒ\ CREATE TABLE `ƒ\ƒ\ƒ\` (
`‰\‰\‰\` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `\\\`;
Table Create Table
\\\ CREATE TABLE `\\\` (
`Ž\Ž\Ž\` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `•\•\•\`;
Table Create Table
•\•\•\ CREATE TABLE `•\•\•\` (
`\\\` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `—\—\—\`;
Table Create Table
—\—\—\ CREATE TEMPORARY TABLE `—\—\—\` (
`“\“\“\` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `\\\`;
Table Create Table
\\\ CREATE TEMPORARY TABLE `\\\` (
`”\”\”\` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
DROP TABLE `±±±`;
DROP TABLE `²²²`;
DROP TABLE `³³³`;
@@ -490,11 +526,23 @@ CREATE TABLE `‚¢‚¢‚¢`(`‚«‚«‚«` char(1)) DEFAULT CHARSET = sjis engine=BDB;
CREATE TABLE `ƒ\ƒ\ƒ\`(`‰\‰\‰\` char(1)) DEFAULT CHARSET = sjis engine=BDB;
CREATE TABLE `\\\`(`Ž\Ž\Ž\` char(1)) DEFAULT CHARSET = sjis engine=BDB;
CREATE TABLE IF NOT EXISTS `±±±`(`¶¶¶` char(1)) DEFAULT CHARSET = sjis engine=BDB;
+Warnings:
+Note 1050 Table '±±±' already exists
CREATE TABLE IF NOT EXISTS `²²²`(`···` char(1)) DEFAULT CHARSET = sjis engine=BDB;
+Warnings:
+Note 1050 Table '²²²' already exists
CREATE TABLE IF NOT EXISTS `‚ ‚ ‚ `(`‚©‚©‚©` char(1)) DEFAULT CHARSET = sjis engine=BDB;
+Warnings:
+Note 1050 Table '‚ ‚ ‚ ' already exists
CREATE TABLE IF NOT EXISTS `‚¢‚¢‚¢`(`‚«‚«‚«` char(1)) DEFAULT CHARSET = sjis engine=BDB;
+Warnings:
+Note 1050 Table '‚¢‚¢‚¢' already exists
CREATE TABLE IF NOT EXISTS `ƒ\ƒ\ƒ\`(`‰\‰\‰\` char(1)) DEFAULT CHARSET = sjis engine=BDB;
+Warnings:
+Note 1050 Table 'ƒ\ƒ\ƒ\' already exists
CREATE TABLE IF NOT EXISTS `\\\`(`Ž\Ž\Ž\` char(1)) DEFAULT CHARSET = sjis engine=BDB;
+Warnings:
+Note 1050 Table '\\\' already exists
CREATE TABLE IF NOT EXISTS `³³³`(`¸¸¸` char(1)) DEFAULT CHARSET = sjis engine=BDB;
CREATE TABLE IF NOT EXISTS `‚¤‚¤‚¤`(`‚­‚­‚­` char(1)) DEFAULT CHARSET = sjis engine=BDB;
CREATE TABLE IF NOT EXISTS `•\•\•\`(`\\\`char(1)) DEFAULT CHARSET = sjis engine=BDB;
diff --git a/mysql-test/suite/jp/r/jp_create_tbl_ucs2.result b/mysql-test/suite/jp/r/jp_create_tbl_ucs2.result
index 0bf5a6891b0..d6616f66d9f 100644
--- a/mysql-test/suite/jp/r/jp_create_tbl_ucs2.result
+++ b/mysql-test/suite/jp/r/jp_create_tbl_ucs2.result
@@ -22,11 +22,23 @@ CREATE TABLE `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
CREATE TABLE `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
CREATE TABLE `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
CREATE TABLE IF NOT EXISTS `Ž±Ž±Ž±`(`Ž¶Ž¶Ž¶` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
+Warnings:
+Note 1050 Table 'Ž±Ž±Ž±' already exists
CREATE TABLE IF NOT EXISTS `Ž²Ž²Ž²`(`Ž·Ž·Ž·` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
+Warnings:
+Note 1050 Table 'Ž²Ž²Ž²' already exists
CREATE TABLE IF NOT EXISTS `¤¢¤¢¤¢`(`¤«¤«¤«` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
+Warnings:
+Note 1050 Table '¤¢¤¢¤¢' already exists
CREATE TABLE IF NOT EXISTS `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
+Warnings:
+Note 1050 Table '¤¤¤¤¤¤' already exists
CREATE TABLE IF NOT EXISTS `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
+Warnings:
+Note 1050 Table 'íÝíÝíÝ' already exists
CREATE TABLE IF NOT EXISTS `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
+Warnings:
+Note 1050 Table 'íÞíÞíÞ' already exists
CREATE TABLE IF NOT EXISTS `Ž³Ž³Ž³`(`Ž¸Ž¸Ž¸` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
CREATE TABLE IF NOT EXISTS `¤¦¤¦¤¦`(`¤¯¤¯¤¯` char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
CREATE TABLE IF NOT EXISTS `íßíßíß`(`°£°£°£`char(1)) DEFAULT CHARSET = ucs2 engine=INNODB;
@@ -178,11 +190,23 @@ CREATE TABLE `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
CREATE TABLE `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
CREATE TABLE `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
CREATE TABLE IF NOT EXISTS `Ž±Ž±Ž±`(`Ž¶Ž¶Ž¶` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
+Warnings:
+Note 1050 Table 'Ž±Ž±Ž±' already exists
CREATE TABLE IF NOT EXISTS `Ž²Ž²Ž²`(`Ž·Ž·Ž·` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
+Warnings:
+Note 1050 Table 'Ž²Ž²Ž²' already exists
CREATE TABLE IF NOT EXISTS `¤¢¤¢¤¢`(`¤«¤«¤«` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
+Warnings:
+Note 1050 Table '¤¢¤¢¤¢' already exists
CREATE TABLE IF NOT EXISTS `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
+Warnings:
+Note 1050 Table '¤¤¤¤¤¤' already exists
CREATE TABLE IF NOT EXISTS `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
+Warnings:
+Note 1050 Table 'íÝíÝíÝ' already exists
CREATE TABLE IF NOT EXISTS `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
+Warnings:
+Note 1050 Table 'íÞíÞíÞ' already exists
CREATE TABLE IF NOT EXISTS `Ž³Ž³Ž³`(`Ž¸Ž¸Ž¸` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
CREATE TABLE IF NOT EXISTS `¤¦¤¦¤¦`(`¤¯¤¯¤¯` char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
CREATE TABLE IF NOT EXISTS `íßíßíß`(`°£°£°£`char(1)) DEFAULT CHARSET = ucs2 engine=MyISAM;
@@ -334,11 +358,23 @@ CREATE TABLE `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
CREATE TABLE `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
CREATE TABLE `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
CREATE TABLE IF NOT EXISTS `Ž±Ž±Ž±`(`Ž¶Ž¶Ž¶` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
+Warnings:
+Note 1050 Table 'Ž±Ž±Ž±' already exists
CREATE TABLE IF NOT EXISTS `Ž²Ž²Ž²`(`Ž·Ž·Ž·` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
+Warnings:
+Note 1050 Table 'Ž²Ž²Ž²' already exists
CREATE TABLE IF NOT EXISTS `¤¢¤¢¤¢`(`¤«¤«¤«` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
+Warnings:
+Note 1050 Table '¤¢¤¢¤¢' already exists
CREATE TABLE IF NOT EXISTS `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
+Warnings:
+Note 1050 Table '¤¤¤¤¤¤' already exists
CREATE TABLE IF NOT EXISTS `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
+Warnings:
+Note 1050 Table 'íÝíÝíÝ' already exists
CREATE TABLE IF NOT EXISTS `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
+Warnings:
+Note 1050 Table 'íÞíÞíÞ' already exists
CREATE TABLE IF NOT EXISTS `Ž³Ž³Ž³`(`Ž¸Ž¸Ž¸` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
CREATE TABLE IF NOT EXISTS `¤¦¤¦¤¦`(`¤¯¤¯¤¯` char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
CREATE TABLE IF NOT EXISTS `íßíßíß`(`°£°£°£`char(1)) DEFAULT CHARSET = ucs2 engine=HEAP;
@@ -397,77 +433,77 @@ SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
`Ž¶Ž¶Ž¶` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `Ž²Ž²Ž²`;
Table Create Table
Ž²Ž²Ž² CREATE TABLE `Ž²Ž²Ž²` (
`Ž·Ž·Ž·` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `Ž³Ž³Ž³`;
Table Create Table
Ž³Ž³Ž³ CREATE TABLE `Ž³Ž³Ž³` (
`Ž¸Ž¸Ž¸` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `Ž´Ž´Ž´`;
Table Create Table
Ž´Ž´Ž´ CREATE TEMPORARY TABLE `Ž´Ž´Ž´` (
`Ž¹Ž¹Ž¹` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `ŽµŽµŽµ`;
Table Create Table
ŽµŽµŽµ CREATE TEMPORARY TABLE `ŽµŽµŽµ` (
`ŽºŽºŽº` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
`¤«¤«¤«` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `¤¤¤¤¤¤`;
Table Create Table
¤¤¤¤¤¤ CREATE TABLE `¤¤¤¤¤¤` (
`¤­¤­¤­` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `¤¦¤¦¤¦`;
Table Create Table
¤¦¤¦¤¦ CREATE TABLE `¤¦¤¦¤¦` (
`¤¯¤¯¤¯` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `¤¨¤¨¤¨`;
Table Create Table
¤¨¤¨¤¨ CREATE TEMPORARY TABLE `¤¨¤¨¤¨` (
`¤±¤±¤±` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `¤ª¤ª¤ª`;
Table Create Table
¤ª¤ª¤ª CREATE TEMPORARY TABLE `¤ª¤ª¤ª` (
`¤³¤³¤³` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
`°¡°¡°¡` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `íÞíÞíÞ`;
Table Create Table
íÞíÞíÞ CREATE TABLE `íÞíÞíÞ` (
`°¢°¢°¢` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `íßíßíß`;
Table Create Table
íßíßíß CREATE TABLE `íßíßíß` (
`°£°£°£` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `íàíàíà`;
Table Create Table
íàíàíà CREATE TEMPORARY TABLE `íàíàíà` (
`°¤°¤°¤` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `íáíáíá`;
Table Create Table
íáíáíá CREATE TEMPORARY TABLE `íáíáíá` (
`°¥°¥°¥` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
DROP TABLE `Ž±Ž±Ž±`;
DROP TABLE `Ž²Ž²Ž²`;
DROP TABLE `Ž³Ž³Ž³`;
@@ -490,11 +526,23 @@ CREATE TABLE `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
CREATE TABLE `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
CREATE TABLE `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
CREATE TABLE IF NOT EXISTS `Ž±Ž±Ž±`(`Ž¶Ž¶Ž¶` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
+Warnings:
+Note 1050 Table 'Ž±Ž±Ž±' already exists
CREATE TABLE IF NOT EXISTS `Ž²Ž²Ž²`(`Ž·Ž·Ž·` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
+Warnings:
+Note 1050 Table 'Ž²Ž²Ž²' already exists
CREATE TABLE IF NOT EXISTS `¤¢¤¢¤¢`(`¤«¤«¤«` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
+Warnings:
+Note 1050 Table '¤¢¤¢¤¢' already exists
CREATE TABLE IF NOT EXISTS `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
+Warnings:
+Note 1050 Table '¤¤¤¤¤¤' already exists
CREATE TABLE IF NOT EXISTS `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
+Warnings:
+Note 1050 Table 'íÝíÝíÝ' already exists
CREATE TABLE IF NOT EXISTS `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
+Warnings:
+Note 1050 Table 'íÞíÞíÞ' already exists
CREATE TABLE IF NOT EXISTS `Ž³Ž³Ž³`(`Ž¸Ž¸Ž¸` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
CREATE TABLE IF NOT EXISTS `¤¦¤¦¤¦`(`¤¯¤¯¤¯` char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
CREATE TABLE IF NOT EXISTS `íßíßíß`(`°£°£°£`char(1)) DEFAULT CHARSET = ucs2 engine=BDB;
diff --git a/mysql-test/suite/jp/r/jp_create_tbl_ujis.result b/mysql-test/suite/jp/r/jp_create_tbl_ujis.result
index ae555e5af15..f53e1e58793 100644
--- a/mysql-test/suite/jp/r/jp_create_tbl_ujis.result
+++ b/mysql-test/suite/jp/r/jp_create_tbl_ujis.result
@@ -22,11 +22,23 @@ CREATE TABLE `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
CREATE TABLE `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
CREATE TABLE `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
CREATE TABLE IF NOT EXISTS `Ž±Ž±Ž±`(`Ž¶Ž¶Ž¶` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
+Warnings:
+Note 1050 Table 'Ž±Ž±Ž±' already exists
CREATE TABLE IF NOT EXISTS `Ž²Ž²Ž²`(`Ž·Ž·Ž·` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
+Warnings:
+Note 1050 Table 'Ž²Ž²Ž²' already exists
CREATE TABLE IF NOT EXISTS `¤¢¤¢¤¢`(`¤«¤«¤«` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
+Warnings:
+Note 1050 Table '¤¢¤¢¤¢' already exists
CREATE TABLE IF NOT EXISTS `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
+Warnings:
+Note 1050 Table '¤¤¤¤¤¤' already exists
CREATE TABLE IF NOT EXISTS `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
+Warnings:
+Note 1050 Table 'íÝíÝíÝ' already exists
CREATE TABLE IF NOT EXISTS `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
+Warnings:
+Note 1050 Table 'íÞíÞíÞ' already exists
CREATE TABLE IF NOT EXISTS `Ž³Ž³Ž³`(`Ž¸Ž¸Ž¸` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
CREATE TABLE IF NOT EXISTS `¤¦¤¦¤¦`(`¤¯¤¯¤¯` char(1)) DEFAULT CHARSET = ujis engine=INNODB;
CREATE TABLE IF NOT EXISTS `íßíßíß`(`°£°£°£`char(1)) DEFAULT CHARSET = ujis engine=INNODB;
@@ -178,11 +190,23 @@ CREATE TABLE `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
CREATE TABLE `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
CREATE TABLE `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
CREATE TABLE IF NOT EXISTS `Ž±Ž±Ž±`(`Ž¶Ž¶Ž¶` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
+Warnings:
+Note 1050 Table 'Ž±Ž±Ž±' already exists
CREATE TABLE IF NOT EXISTS `Ž²Ž²Ž²`(`Ž·Ž·Ž·` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
+Warnings:
+Note 1050 Table 'Ž²Ž²Ž²' already exists
CREATE TABLE IF NOT EXISTS `¤¢¤¢¤¢`(`¤«¤«¤«` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
+Warnings:
+Note 1050 Table '¤¢¤¢¤¢' already exists
CREATE TABLE IF NOT EXISTS `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
+Warnings:
+Note 1050 Table '¤¤¤¤¤¤' already exists
CREATE TABLE IF NOT EXISTS `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
+Warnings:
+Note 1050 Table 'íÝíÝíÝ' already exists
CREATE TABLE IF NOT EXISTS `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
+Warnings:
+Note 1050 Table 'íÞíÞíÞ' already exists
CREATE TABLE IF NOT EXISTS `Ž³Ž³Ž³`(`Ž¸Ž¸Ž¸` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
CREATE TABLE IF NOT EXISTS `¤¦¤¦¤¦`(`¤¯¤¯¤¯` char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
CREATE TABLE IF NOT EXISTS `íßíßíß`(`°£°£°£`char(1)) DEFAULT CHARSET = ujis engine=MyISAM;
@@ -334,11 +358,23 @@ CREATE TABLE `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
CREATE TABLE `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
CREATE TABLE `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
CREATE TABLE IF NOT EXISTS `Ž±Ž±Ž±`(`Ž¶Ž¶Ž¶` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
+Warnings:
+Note 1050 Table 'Ž±Ž±Ž±' already exists
CREATE TABLE IF NOT EXISTS `Ž²Ž²Ž²`(`Ž·Ž·Ž·` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
+Warnings:
+Note 1050 Table 'Ž²Ž²Ž²' already exists
CREATE TABLE IF NOT EXISTS `¤¢¤¢¤¢`(`¤«¤«¤«` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
+Warnings:
+Note 1050 Table '¤¢¤¢¤¢' already exists
CREATE TABLE IF NOT EXISTS `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
+Warnings:
+Note 1050 Table '¤¤¤¤¤¤' already exists
CREATE TABLE IF NOT EXISTS `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
+Warnings:
+Note 1050 Table 'íÝíÝíÝ' already exists
CREATE TABLE IF NOT EXISTS `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
+Warnings:
+Note 1050 Table 'íÞíÞíÞ' already exists
CREATE TABLE IF NOT EXISTS `Ž³Ž³Ž³`(`Ž¸Ž¸Ž¸` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
CREATE TABLE IF NOT EXISTS `¤¦¤¦¤¦`(`¤¯¤¯¤¯` char(1)) DEFAULT CHARSET = ujis engine=HEAP;
CREATE TABLE IF NOT EXISTS `íßíßíß`(`°£°£°£`char(1)) DEFAULT CHARSET = ujis engine=HEAP;
@@ -397,77 +433,77 @@ SHOW CREATE TABLE `Ž±Ž±Ž±`;
Table Create Table
Ž±Ž±Ž± CREATE TABLE `Ž±Ž±Ž±` (
`Ž¶Ž¶Ž¶` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `Ž²Ž²Ž²`;
Table Create Table
Ž²Ž²Ž² CREATE TABLE `Ž²Ž²Ž²` (
`Ž·Ž·Ž·` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `Ž³Ž³Ž³`;
Table Create Table
Ž³Ž³Ž³ CREATE TABLE `Ž³Ž³Ž³` (
`Ž¸Ž¸Ž¸` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `Ž´Ž´Ž´`;
Table Create Table
Ž´Ž´Ž´ CREATE TEMPORARY TABLE `Ž´Ž´Ž´` (
`Ž¹Ž¹Ž¹` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `ŽµŽµŽµ`;
Table Create Table
ŽµŽµŽµ CREATE TEMPORARY TABLE `ŽµŽµŽµ` (
`ŽºŽºŽº` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `¤¢¤¢¤¢`;
Table Create Table
¤¢¤¢¤¢ CREATE TABLE `¤¢¤¢¤¢` (
`¤«¤«¤«` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `¤¤¤¤¤¤`;
Table Create Table
¤¤¤¤¤¤ CREATE TABLE `¤¤¤¤¤¤` (
`¤­¤­¤­` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `¤¦¤¦¤¦`;
Table Create Table
¤¦¤¦¤¦ CREATE TABLE `¤¦¤¦¤¦` (
`¤¯¤¯¤¯` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `¤¨¤¨¤¨`;
Table Create Table
¤¨¤¨¤¨ CREATE TEMPORARY TABLE `¤¨¤¨¤¨` (
`¤±¤±¤±` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `¤ª¤ª¤ª`;
Table Create Table
¤ª¤ª¤ª CREATE TEMPORARY TABLE `¤ª¤ª¤ª` (
`¤³¤³¤³` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `íÝíÝíÝ`;
Table Create Table
íÝíÝíÝ CREATE TABLE `íÝíÝíÝ` (
`°¡°¡°¡` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `íÞíÞíÞ`;
Table Create Table
íÞíÞíÞ CREATE TABLE `íÞíÞíÞ` (
`°¢°¢°¢` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `íßíßíß`;
Table Create Table
íßíßíß CREATE TABLE `íßíßíß` (
`°£°£°£` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `íàíàíà`;
Table Create Table
íàíàíà CREATE TEMPORARY TABLE `íàíàíà` (
`°¤°¤°¤` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `íáíáíá`;
Table Create Table
íáíáíá CREATE TEMPORARY TABLE `íáíáíá` (
`°¥°¥°¥` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
DROP TABLE `Ž±Ž±Ž±`;
DROP TABLE `Ž²Ž²Ž²`;
DROP TABLE `Ž³Ž³Ž³`;
@@ -490,11 +526,23 @@ CREATE TABLE `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ujis engine=BDB;
CREATE TABLE `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ujis engine=BDB;
CREATE TABLE `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ujis engine=BDB;
CREATE TABLE IF NOT EXISTS `Ž±Ž±Ž±`(`Ž¶Ž¶Ž¶` char(1)) DEFAULT CHARSET = ujis engine=BDB;
+Warnings:
+Note 1050 Table 'Ž±Ž±Ž±' already exists
CREATE TABLE IF NOT EXISTS `Ž²Ž²Ž²`(`Ž·Ž·Ž·` char(1)) DEFAULT CHARSET = ujis engine=BDB;
+Warnings:
+Note 1050 Table 'Ž²Ž²Ž²' already exists
CREATE TABLE IF NOT EXISTS `¤¢¤¢¤¢`(`¤«¤«¤«` char(1)) DEFAULT CHARSET = ujis engine=BDB;
+Warnings:
+Note 1050 Table '¤¢¤¢¤¢' already exists
CREATE TABLE IF NOT EXISTS `¤¤¤¤¤¤`(`¤­¤­¤­` char(1)) DEFAULT CHARSET = ujis engine=BDB;
+Warnings:
+Note 1050 Table '¤¤¤¤¤¤' already exists
CREATE TABLE IF NOT EXISTS `íÝíÝíÝ`(`°¡°¡°¡` char(1)) DEFAULT CHARSET = ujis engine=BDB;
+Warnings:
+Note 1050 Table 'íÝíÝíÝ' already exists
CREATE TABLE IF NOT EXISTS `íÞíÞíÞ`(`°¢°¢°¢` char(1)) DEFAULT CHARSET = ujis engine=BDB;
+Warnings:
+Note 1050 Table 'íÞíÞíÞ' already exists
CREATE TABLE IF NOT EXISTS `Ž³Ž³Ž³`(`Ž¸Ž¸Ž¸` char(1)) DEFAULT CHARSET = ujis engine=BDB;
CREATE TABLE IF NOT EXISTS `¤¦¤¦¤¦`(`¤¯¤¯¤¯` char(1)) DEFAULT CHARSET = ujis engine=BDB;
CREATE TABLE IF NOT EXISTS `íßíßíß`(`°£°£°£`char(1)) DEFAULT CHARSET = ujis engine=BDB;
diff --git a/mysql-test/suite/jp/r/jp_create_tbl_utf8.result b/mysql-test/suite/jp/r/jp_create_tbl_utf8.result
index d4873406c46..6df30acbd7f 100644
--- a/mysql-test/suite/jp/r/jp_create_tbl_utf8.result
+++ b/mysql-test/suite/jp/r/jp_create_tbl_utf8.result
@@ -22,11 +22,23 @@ CREATE TABLE `ã„ã„ã„`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=INNO
CREATE TABLE `龖龖龖`(`丂丂丂` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
CREATE TABLE `龗龗龗`(`丄丄丄` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
CREATE TABLE IF NOT EXISTS `アアア`(`カカカ` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
+Warnings:
+Note 1050 Table 'アアア' already exists
CREATE TABLE IF NOT EXISTS `イイイ`(`キキキ` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
+Warnings:
+Note 1050 Table 'イイイ' already exists
CREATE TABLE IF NOT EXISTS `ã‚ã‚ã‚`(`ã‹ã‹ã‹` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
+Warnings:
+Note 1050 Table 'ã‚ã‚ã‚' already exists
CREATE TABLE IF NOT EXISTS `ã„ã„ã„`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
+Warnings:
+Note 1050 Table 'ã„ã„ã„' already exists
CREATE TABLE IF NOT EXISTS `龖龖龖`(`丂丂丂` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
+Warnings:
+Note 1050 Table 'é¾–é¾–é¾–' already exists
CREATE TABLE IF NOT EXISTS `龗龗龗`(`丄丄丄` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
+Warnings:
+Note 1050 Table 'é¾—é¾—é¾—' already exists
CREATE TABLE IF NOT EXISTS `ウウウ`(`ククク` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
CREATE TABLE IF NOT EXISTS `ã†ã†ã†`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
CREATE TABLE IF NOT EXISTS `龞龞龞`(`丅丅丅`char(1)) DEFAULT CHARSET = utf8 engine=INNODB;
@@ -178,11 +190,23 @@ CREATE TABLE `ã„ã„ã„`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=MyIS
CREATE TABLE `龖龖龖`(`丂丂丂` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
CREATE TABLE `龗龗龗`(`丄丄丄` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
CREATE TABLE IF NOT EXISTS `アアア`(`カカカ` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
+Warnings:
+Note 1050 Table 'アアア' already exists
CREATE TABLE IF NOT EXISTS `イイイ`(`キキキ` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
+Warnings:
+Note 1050 Table 'イイイ' already exists
CREATE TABLE IF NOT EXISTS `ã‚ã‚ã‚`(`ã‹ã‹ã‹` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
+Warnings:
+Note 1050 Table 'ã‚ã‚ã‚' already exists
CREATE TABLE IF NOT EXISTS `ã„ã„ã„`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
+Warnings:
+Note 1050 Table 'ã„ã„ã„' already exists
CREATE TABLE IF NOT EXISTS `龖龖龖`(`丂丂丂` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
+Warnings:
+Note 1050 Table 'é¾–é¾–é¾–' already exists
CREATE TABLE IF NOT EXISTS `龗龗龗`(`丄丄丄` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
+Warnings:
+Note 1050 Table 'é¾—é¾—é¾—' already exists
CREATE TABLE IF NOT EXISTS `ウウウ`(`ククク` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
CREATE TABLE IF NOT EXISTS `ã†ã†ã†`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
CREATE TABLE IF NOT EXISTS `龞龞龞`(`丅丅丅`char(1)) DEFAULT CHARSET = utf8 engine=MyISAM;
@@ -334,11 +358,23 @@ CREATE TABLE `ã„ã„ã„`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=HEAP
CREATE TABLE `龖龖龖`(`丂丂丂` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
CREATE TABLE `龗龗龗`(`丄丄丄` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
CREATE TABLE IF NOT EXISTS `アアア`(`カカカ` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
+Warnings:
+Note 1050 Table 'アアア' already exists
CREATE TABLE IF NOT EXISTS `イイイ`(`キキキ` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
+Warnings:
+Note 1050 Table 'イイイ' already exists
CREATE TABLE IF NOT EXISTS `ã‚ã‚ã‚`(`ã‹ã‹ã‹` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
+Warnings:
+Note 1050 Table 'ã‚ã‚ã‚' already exists
CREATE TABLE IF NOT EXISTS `ã„ã„ã„`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
+Warnings:
+Note 1050 Table 'ã„ã„ã„' already exists
CREATE TABLE IF NOT EXISTS `龖龖龖`(`丂丂丂` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
+Warnings:
+Note 1050 Table 'é¾–é¾–é¾–' already exists
CREATE TABLE IF NOT EXISTS `龗龗龗`(`丄丄丄` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
+Warnings:
+Note 1050 Table 'é¾—é¾—é¾—' already exists
CREATE TABLE IF NOT EXISTS `ウウウ`(`ククク` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
CREATE TABLE IF NOT EXISTS `ã†ã†ã†`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
CREATE TABLE IF NOT EXISTS `龞龞龞`(`丅丅丅`char(1)) DEFAULT CHARSET = utf8 engine=HEAP;
@@ -397,77 +433,77 @@ SHOW CREATE TABLE `アアア`;
Table Create Table
アアア CREATE TABLE `アアア` (
`カカカ` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `イイイ`;
Table Create Table
イイイ CREATE TABLE `イイイ` (
`ï½·ï½·ï½·` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ウウウ`;
Table Create Table
ウウウ CREATE TABLE `ウウウ` (
`ククク` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ï½´ï½´ï½´`;
Table Create Table
ï½´ï½´ï½´ CREATE TEMPORARY TABLE `ï½´ï½´ï½´` (
`ケケケ` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `オオオ`;
Table Create Table
オオオ CREATE TEMPORARY TABLE `オオオ` (
`コココ` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ã‚ã‚ã‚`;
Table Create Table
ã‚ã‚ã‚ CREATE TABLE `ã‚ã‚ã‚` (
`ã‹ã‹ã‹` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ã„ã„ã„`;
Table Create Table
ã„ã„ã„ CREATE TABLE `ã„ã„ã„` (
`ããã` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ã†ã†ã†`;
Table Create Table
ã†ã†ã† CREATE TABLE `ã†ã†ã†` (
`ããã` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ãˆãˆãˆ`;
Table Create Table
ãˆãˆãˆ CREATE TEMPORARY TABLE `ãˆãˆãˆ` (
`ã‘ã‘ã‘` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ãŠãŠãŠ`;
Table Create Table
ãŠãŠãŠ CREATE TEMPORARY TABLE `ãŠãŠãŠ` (
`ã“ã“ã“` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `é¾–é¾–é¾–`;
Table Create Table
é¾–é¾–é¾– CREATE TABLE `é¾–é¾–é¾–` (
`丂丂丂` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `é¾—é¾—é¾—`;
Table Create Table
é¾—é¾—é¾— CREATE TABLE `é¾—é¾—é¾—` (
`丄丄丄` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `龞龞龞`;
Table Create Table
龞龞龞 CREATE TABLE `龞龞龞` (
`丅丅丅` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `龡龡龡`;
Table Create Table
龡龡龡 CREATE TEMPORARY TABLE `龡龡龡` (
`丌丌丌` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `龢龢龢`;
Table Create Table
龢龢龢 CREATE TEMPORARY TABLE `龢龢龢` (
`丒丒丒` char(1) default NULL
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
DROP TABLE `アアア`;
DROP TABLE `イイイ`;
DROP TABLE `ウウウ`;
@@ -490,11 +526,23 @@ CREATE TABLE `ã„ã„ã„`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
CREATE TABLE `龖龖龖`(`丂丂丂` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
CREATE TABLE `龗龗龗`(`丄丄丄` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
CREATE TABLE IF NOT EXISTS `アアア`(`カカカ` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
+Warnings:
+Note 1050 Table 'アアア' already exists
CREATE TABLE IF NOT EXISTS `イイイ`(`キキキ` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
+Warnings:
+Note 1050 Table 'イイイ' already exists
CREATE TABLE IF NOT EXISTS `ã‚ã‚ã‚`(`ã‹ã‹ã‹` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
+Warnings:
+Note 1050 Table 'ã‚ã‚ã‚' already exists
CREATE TABLE IF NOT EXISTS `ã„ã„ã„`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
+Warnings:
+Note 1050 Table 'ã„ã„ã„' already exists
CREATE TABLE IF NOT EXISTS `龖龖龖`(`丂丂丂` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
+Warnings:
+Note 1050 Table 'é¾–é¾–é¾–' already exists
CREATE TABLE IF NOT EXISTS `龗龗龗`(`丄丄丄` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
+Warnings:
+Note 1050 Table 'é¾—é¾—é¾—' already exists
CREATE TABLE IF NOT EXISTS `ウウウ`(`ククク` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
CREATE TABLE IF NOT EXISTS `ã†ã†ã†`(`ããã` char(1)) DEFAULT CHARSET = utf8 engine=BDB;
CREATE TABLE IF NOT EXISTS `龞龞龞`(`丅丅丅`char(1)) DEFAULT CHARSET = utf8 engine=BDB;
diff --git a/mysql-test/suite/jp/r/jp_enum_sjis.result b/mysql-test/suite/jp/r/jp_enum_sjis.result
index 1e46dbffbb1..43994123e3b 100644
--- a/mysql-test/suite/jp/r/jp_enum_sjis.result
+++ b/mysql-test/suite/jp/r/jp_enum_sjis.result
@@ -137,19 +137,19 @@ Table Create Table
‚s‚V CREATE TABLE `‚s‚V` (
`‚b‚P` enum('±','²','³') default NULL,
KEY `‚b‚P` (`‚b‚P`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚W`;
Table Create Table
‚s‚W CREATE TABLE `‚s‚W` (
`‚b‚P` enum('‚ ','‚¢','‚¤') default NULL,
KEY `‚b‚P` (`‚b‚P`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚X`;
Table Create Table
‚s‚X CREATE TABLE `‚s‚X` (
`‚b‚P` enum('ƒ\','\','•\') default NULL,
KEY `‚b‚P` (`‚b‚P`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚P‚O`;
Table Create Table
‚s‚P‚O CREATE TABLE `‚s‚P‚O` (
@@ -219,134 +219,134 @@ ALTER TABLE `‚s‚P‚Q` ADD `‚b‚Q` CHAR(1) NOT NULL FIRST;
SHOW CREATE TABLE `‚s‚P`;
Table Create Table
‚s‚P CREATE TABLE `‚s‚P` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('±','²','³') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=InnoDB DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚Q`;
Table Create Table
‚s‚Q CREATE TABLE `‚s‚Q` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('‚ ','‚¢','‚¤') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=InnoDB DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚R`;
Table Create Table
‚s‚R CREATE TABLE `‚s‚R` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('ƒ\','\','•\') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=InnoDB DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚S`;
Table Create Table
‚s‚S CREATE TABLE `‚s‚S` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('±','²','³') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=MyISAM DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚T`;
Table Create Table
‚s‚T CREATE TABLE `‚s‚T` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('‚ ','‚¢','‚¤') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=MyISAM DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚U`;
Table Create Table
‚s‚U CREATE TABLE `‚s‚U` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('ƒ\','\','•\') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=MyISAM DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚V`;
Table Create Table
‚s‚V CREATE TABLE `‚s‚V` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('±','²','³') default NULL,
KEY `‚b‚P` (`‚b‚P`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚W`;
Table Create Table
‚s‚W CREATE TABLE `‚s‚W` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('‚ ','‚¢','‚¤') default NULL,
KEY `‚b‚P` (`‚b‚P`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚X`;
Table Create Table
‚s‚X CREATE TABLE `‚s‚X` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('ƒ\','\','•\') default NULL,
KEY `‚b‚P` (`‚b‚P`)
-) ENGINE=HEAP DEFAULT CHARSET=sjis
+) ENGINE=MEMORY DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚P‚O`;
Table Create Table
‚s‚P‚O CREATE TABLE `‚s‚P‚O` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('±','²','³') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚P‚P`;
Table Create Table
‚s‚P‚P CREATE TABLE `‚s‚P‚P` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('‚ ','‚¢','‚¤') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=sjis
SHOW CREATE TABLE `‚s‚P‚Q`;
Table Create Table
‚s‚P‚Q CREATE TABLE `‚s‚P‚Q` (
- `‚b‚Q` char(1) NOT NULL default '',
+ `‚b‚Q` char(1) NOT NULL,
`‚b‚P` enum('ƒ\','\','•\') default NULL,
KEY `‚b‚P` (`‚b‚P`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=sjis
DESC `‚s‚P`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('±','²','³') YES MUL NULL
DESC `‚s‚Q`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('‚ ','‚¢','‚¤') YES MUL NULL
DESC `‚s‚R`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('ƒ\','\','•\') YES MUL NULL
DESC `‚s‚S`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('±','²','³') YES MUL NULL
DESC `‚s‚T`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('‚ ','‚¢','‚¤') YES MUL NULL
DESC `‚s‚U`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('ƒ\','\','•\') YES MUL NULL
DESC `‚s‚V`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('±','²','³') YES MUL NULL
DESC `‚s‚W`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('‚ ','‚¢','‚¤') YES MUL NULL
DESC `‚s‚X`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('ƒ\','\','•\') YES MUL NULL
DESC `‚s‚P‚O`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('±','²','³') YES MUL NULL
DESC `‚s‚P‚P`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('‚ ','‚¢','‚¤') YES MUL NULL
DESC `‚s‚P‚Q`;
Field Type Null Key Default Extra
-‚b‚Q char(1)
+‚b‚Q char(1) NO NULL
‚b‚P enum('ƒ\','\','•\') YES MUL NULL
DROP TABLE `‚s‚P`;
DROP TABLE `‚s‚Q`;
diff --git a/mysql-test/suite/jp/r/jp_enum_ucs2.result b/mysql-test/suite/jp/r/jp_enum_ucs2.result
index a84cace35fe..c41e6c262eb 100644
--- a/mysql-test/suite/jp/r/jp_enum_ucs2.result
+++ b/mysql-test/suite/jp/r/jp_enum_ucs2.result
@@ -138,19 +138,19 @@ Table Create Table
£Ô£· CREATE TABLE `£Ô£·` (
`£Ã£±` enum('Ž±','Ž²','Ž³') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `£Ô£¸`;
Table Create Table
£Ô£¸ CREATE TABLE `£Ô£¸` (
`£Ã£±` enum('¤¢','¤¤','¤¦') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `£Ô£¹`;
Table Create Table
£Ô£¹ CREATE TABLE `£Ô£¹` (
`£Ã£±` enum('íÜ','íÝ','íÞ') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ucs2
+) ENGINE=MEMORY DEFAULT CHARSET=ucs2
SHOW CREATE TABLE `£Ô£±£°`;
Table Create Table
£Ô£±£° CREATE TABLE `£Ô£±£°` (
diff --git a/mysql-test/suite/jp/r/jp_enum_ujis.result b/mysql-test/suite/jp/r/jp_enum_ujis.result
index dbc850b1368..9ba445eaba5 100644
--- a/mysql-test/suite/jp/r/jp_enum_ujis.result
+++ b/mysql-test/suite/jp/r/jp_enum_ujis.result
@@ -137,19 +137,19 @@ Table Create Table
£Ô£· CREATE TABLE `£Ô£·` (
`£Ã£±` enum('Ž±','Ž²','Ž³') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£¸`;
Table Create Table
£Ô£¸ CREATE TABLE `£Ô£¸` (
`£Ã£±` enum('¤¢','¤¤','¤¦') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£¹`;
Table Create Table
£Ô£¹ CREATE TABLE `£Ô£¹` (
`£Ã£±` enum('íÜ','íÝ','íÞ') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£±£°`;
Table Create Table
£Ô£±£° CREATE TABLE `£Ô£±£°` (
@@ -219,134 +219,134 @@ ALTER TABLE `£Ô£±£²` ADD `£Ã£²` CHAR(1) NOT NULL FIRST;
SHOW CREATE TABLE `£Ô£±`;
Table Create Table
£Ô£± CREATE TABLE `£Ô£±` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('Ž±','Ž²','Ž³') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=InnoDB DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£²`;
Table Create Table
£Ô£² CREATE TABLE `£Ô£²` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('¤¢','¤¤','¤¦') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=InnoDB DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£³`;
Table Create Table
£Ô£³ CREATE TABLE `£Ô£³` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('íÜ','íÝ','íÞ') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=InnoDB DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£´`;
Table Create Table
£Ô£´ CREATE TABLE `£Ô£´` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('Ž±','Ž²','Ž³') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=MyISAM DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£µ`;
Table Create Table
£Ô£µ CREATE TABLE `£Ô£µ` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('¤¢','¤¤','¤¦') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=MyISAM DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£¶`;
Table Create Table
£Ô£¶ CREATE TABLE `£Ô£¶` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('íÜ','íÝ','íÞ') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=MyISAM DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£·`;
Table Create Table
£Ô£· CREATE TABLE `£Ô£·` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('Ž±','Ž²','Ž³') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£¸`;
Table Create Table
£Ô£¸ CREATE TABLE `£Ô£¸` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('¤¢','¤¤','¤¦') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£¹`;
Table Create Table
£Ô£¹ CREATE TABLE `£Ô£¹` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('íÜ','íÝ','íÞ') default NULL,
KEY `£Ã£±` (`£Ã£±`)
-) ENGINE=HEAP DEFAULT CHARSET=ujis
+) ENGINE=MEMORY DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£±£°`;
Table Create Table
£Ô£±£° CREATE TABLE `£Ô£±£°` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('Ž±','Ž²','Ž³') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£±£±`;
Table Create Table
£Ô£±£± CREATE TABLE `£Ô£±£±` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('¤¢','¤¤','¤¦') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=ujis
SHOW CREATE TABLE `£Ô£±£²`;
Table Create Table
£Ô£±£² CREATE TABLE `£Ô£±£²` (
- `£Ã£²` char(1) NOT NULL default '',
+ `£Ã£²` char(1) NOT NULL,
`£Ã£±` enum('íÜ','íÝ','íÞ') default NULL,
KEY `£Ã£±` (`£Ã£±`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=ujis
DESC `£Ô£±`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('Ž±','Ž²','Ž³') YES MUL NULL
DESC `£Ô£²`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('¤¢','¤¤','¤¦') YES MUL NULL
DESC `£Ô£³`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('íÜ','íÝ','íÞ') YES MUL NULL
DESC `£Ô£´`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('Ž±','Ž²','Ž³') YES MUL NULL
DESC `£Ô£µ`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('¤¢','¤¤','¤¦') YES MUL NULL
DESC `£Ô£¶`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('íÜ','íÝ','íÞ') YES MUL NULL
DESC `£Ô£·`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('Ž±','Ž²','Ž³') YES MUL NULL
DESC `£Ô£¸`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('¤¢','¤¤','¤¦') YES MUL NULL
DESC `£Ô£¹`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('íÜ','íÝ','íÞ') YES MUL NULL
DESC `£Ô£±£°`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('Ž±','Ž²','Ž³') YES MUL NULL
DESC `£Ô£±£±`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('¤¢','¤¤','¤¦') YES MUL NULL
DESC `£Ô£±£²`;
Field Type Null Key Default Extra
-£Ã£² char(1)
+£Ã£² char(1) NO NULL
£Ã£± enum('íÜ','íÝ','íÞ') YES MUL NULL
DROP TABLE `£Ô£±`;
DROP TABLE `£Ô£²`;
diff --git a/mysql-test/suite/jp/r/jp_enum_utf8.result b/mysql-test/suite/jp/r/jp_enum_utf8.result
index f2515871ece..c4ff9193447 100644
--- a/mysql-test/suite/jp/r/jp_enum_utf8.result
+++ b/mysql-test/suite/jp/r/jp_enum_utf8.result
@@ -137,19 +137,19 @@ Table Create Table
ï¼´ï¼— CREATE TABLE `ï¼´ï¼—` (
`C1` enum('ア','イ','ウ') default NULL,
KEY `C1` (`C1`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `T8`;
Table Create Table
T8 CREATE TABLE `T8` (
`C1` enum('ã‚','ã„','ã†') default NULL,
KEY `C1` (`C1`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ï¼´ï¼™`;
Table Create Table
ï¼´ï¼™ CREATE TABLE `ï¼´ï¼™` (
`C1` enum('龔','龖','龗') default NULL,
KEY `C1` (`C1`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `T1ï¼`;
Table Create Table
ï¼´ï¼‘ï¼ CREATE TABLE `T1ï¼` (
@@ -219,134 +219,134 @@ ALTER TABLE `T12` ADD `C2` CHAR(1) NOT NULL FIRST;
SHOW CREATE TABLE `T1`;
Table Create Table
T1 CREATE TABLE `T1` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('ア','イ','ウ') default NULL,
KEY `C1` (`C1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ï¼´ï¼’`;
Table Create Table
ï¼´ï¼’ CREATE TABLE `ï¼´ï¼’` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('ã‚','ã„','ã†') default NULL,
KEY `C1` (`C1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SHOW CREATE TABLE `T3`;
Table Create Table
T3 CREATE TABLE `T3` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('龔','龖','龗') default NULL,
KEY `C1` (`C1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ï¼´ï¼”`;
Table Create Table
ï¼´ï¼” CREATE TABLE `ï¼´ï¼”` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('ア','イ','ウ') default NULL,
KEY `C1` (`C1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
SHOW CREATE TABLE `T5`;
Table Create Table
T5 CREATE TABLE `T5` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('ã‚','ã„','ã†') default NULL,
KEY `C1` (`C1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ï¼´ï¼–`;
Table Create Table
ï¼´ï¼– CREATE TABLE `ï¼´ï¼–` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('龔','龖','龗') default NULL,
KEY `C1` (`C1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ï¼´ï¼—`;
Table Create Table
ï¼´ï¼— CREATE TABLE `ï¼´ï¼—` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('ア','イ','ウ') default NULL,
KEY `C1` (`C1`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `T8`;
Table Create Table
T8 CREATE TABLE `T8` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('ã‚','ã„','ã†') default NULL,
KEY `C1` (`C1`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `ï¼´ï¼™`;
Table Create Table
ï¼´ï¼™ CREATE TABLE `ï¼´ï¼™` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('龔','龖','龗') default NULL,
KEY `C1` (`C1`)
-) ENGINE=HEAP DEFAULT CHARSET=utf8
+) ENGINE=MEMORY DEFAULT CHARSET=utf8
SHOW CREATE TABLE `T1ï¼`;
Table Create Table
ï¼´ï¼‘ï¼ CREATE TABLE `T1ï¼` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('ア','イ','ウ') default NULL,
KEY `C1` (`C1`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=utf8
SHOW CREATE TABLE `T11`;
Table Create Table
T11 CREATE TABLE `T11` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('ã‚','ã„','ã†') default NULL,
KEY `C1` (`C1`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=utf8
SHOW CREATE TABLE `T12`;
Table Create Table
T12 CREATE TABLE `T12` (
- `C2` char(1) NOT NULL default '',
+ `C2` char(1) NOT NULL,
`C1` enum('龔','龖','龗') default NULL,
KEY `C1` (`C1`)
) ENGINE=BerkeleyDB DEFAULT CHARSET=utf8
DESC `T1`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('ア','イ','ウ') YES MUL NULL
DESC `ï¼´ï¼’`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('ã‚','ã„','ã†') YES MUL NULL
DESC `T3`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('龔','龖','龗') YES MUL NULL
DESC `ï¼´ï¼”`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('ア','イ','ウ') YES MUL NULL
DESC `T5`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('ã‚','ã„','ã†') YES MUL NULL
DESC `ï¼´ï¼–`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('龔','龖','龗') YES MUL NULL
DESC `ï¼´ï¼—`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('ア','イ','ウ') YES MUL NULL
DESC `T8`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('ã‚','ã„','ã†') YES MUL NULL
DESC `ï¼´ï¼™`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('龔','龖','龗') YES MUL NULL
DESC `T1ï¼`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('ア','イ','ウ') YES MUL NULL
DESC `T11`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('ã‚','ã„','ã†') YES MUL NULL
DESC `T12`;
Field Type Null Key Default Extra
-C2 char(1)
+C2 char(1) NO NULL
C1 enum('龔','龖','龗') YES MUL NULL
DROP TABLE `T1`;
DROP TABLE `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/r/jp_join_sjis.result b/mysql-test/suite/jp/r/jp_join_sjis.result
index a5ccc58ae4c..95df2d5488e 100644
--- a/mysql-test/suite/jp/r/jp_join_sjis.result
+++ b/mysql-test/suite/jp/r/jp_join_sjis.result
@@ -71,31 +71,31 @@ SELECT * FROM `‚s‚Pa` INNER JOIN `‚s‚Pb`;
¶ ±
» ±
SELECT * FROM `‚s‚Pa` JOIN `‚s‚Pb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
+‚b‚P
SELECT * FROM `‚s‚Pa` INNER JOIN `‚s‚Pb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
+‚b‚P
SELECT * FROM `‚s‚Pa` CROSS JOIN `‚s‚Pb`;
‚b‚P ‚b‚P
± ±
¶ ±
» ±
SELECT * FROM `‚s‚Pa` LEFT JOIN `‚s‚Pb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
-¶ NULL
-» NULL
+‚b‚P
SELECT * FROM `‚s‚Pa` LEFT JOIN `‚s‚Pb` ON (`‚s‚Pa`.`‚b‚P` = `‚s‚Pb`.`‚b‚P`);
‚b‚P ‚b‚P
± ±
¶ NULL
» NULL
SELECT * FROM `‚s‚Pb` RIGHT JOIN `‚s‚Pa` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
-NULL ¶
-NULL »
+‚b‚P
SELECT * FROM `‚s‚Pb` RIGHT JOIN `‚s‚Pa` ON (`‚s‚Pa`.`‚b‚P` = `‚s‚Pb`.`‚b‚P`);
‚b‚P ‚b‚P
± ±
@@ -112,31 +112,31 @@ SELECT * FROM `‚s‚Qa` INNER JOIN `‚s‚Qb`;
‚© ‚ 
‚³ ‚ 
SELECT * FROM `‚s‚Qa` JOIN `‚s‚Qb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
+‚b‚P
+‚ 
SELECT * FROM `‚s‚Qa` INNER JOIN `‚s‚Qb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
+‚b‚P
+‚ 
SELECT * FROM `‚s‚Qa` CROSS JOIN `‚s‚Qb`;
‚b‚P ‚b‚P
‚  ‚ 
‚© ‚ 
‚³ ‚ 
SELECT * FROM `‚s‚Qa` LEFT JOIN `‚s‚Qb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
-‚© NULL
-‚³ NULL
+‚b‚P
+‚ 
+‚©
+‚³
SELECT * FROM `‚s‚Qa` LEFT JOIN `‚s‚Qb` ON (`‚s‚Qa`.`‚b‚P` = `‚s‚Qb`.`‚b‚P`);
‚b‚P ‚b‚P
‚  ‚ 
‚© NULL
‚³ NULL
SELECT * FROM `‚s‚Qb` RIGHT JOIN `‚s‚Qa` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
-NULL ‚©
-NULL ‚³
+‚b‚P
+‚ 
+‚©
+‚³
SELECT * FROM `‚s‚Qb` RIGHT JOIN `‚s‚Qa` ON (`‚s‚Qa`.`‚b‚P` = `‚s‚Qb`.`‚b‚P`);
‚b‚P ‚b‚P
‚  ‚ 
@@ -153,31 +153,31 @@ SELECT * FROM `‚s‚Ra` INNER JOIN `‚s‚Rb`;
\ ƒ\
•\ ƒ\
SELECT * FROM `‚s‚Ra` JOIN `‚s‚Rb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
+‚b‚P
+ƒ\
SELECT * FROM `‚s‚Ra` INNER JOIN `‚s‚Rb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
+‚b‚P
+ƒ\
SELECT * FROM `‚s‚Ra` CROSS JOIN `‚s‚Rb`;
‚b‚P ‚b‚P
ƒ\ ƒ\
\ ƒ\
•\ ƒ\
SELECT * FROM `‚s‚Ra` LEFT JOIN `‚s‚Rb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
-\ NULL
-•\ NULL
+‚b‚P
+ƒ\
+\
+•\
SELECT * FROM `‚s‚Ra` LEFT JOIN `‚s‚Rb` ON (`‚s‚Ra`.`‚b‚P` = `‚s‚Rb`.`‚b‚P`);
‚b‚P ‚b‚P
ƒ\ ƒ\
\ NULL
•\ NULL
SELECT * FROM `‚s‚Rb` RIGHT JOIN `‚s‚Ra` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
-NULL \
-NULL •\
+‚b‚P
+ƒ\
+\
+•\
SELECT * FROM `‚s‚Rb` RIGHT JOIN `‚s‚Ra` ON (`‚s‚Ra`.`‚b‚P` = `‚s‚Rb`.`‚b‚P`);
‚b‚P ‚b‚P
ƒ\ ƒ\
@@ -194,31 +194,31 @@ SELECT * FROM `‚s‚Sa` INNER JOIN `‚s‚Sb`;
¶ ±
» ±
SELECT * FROM `‚s‚Sa` JOIN `‚s‚Sb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
+‚b‚P
SELECT * FROM `‚s‚Sa` INNER JOIN `‚s‚Sb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
+‚b‚P
SELECT * FROM `‚s‚Sa` CROSS JOIN `‚s‚Sb`;
‚b‚P ‚b‚P
± ±
¶ ±
» ±
SELECT * FROM `‚s‚Sa` LEFT JOIN `‚s‚Sb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
-¶ NULL
-» NULL
+‚b‚P
SELECT * FROM `‚s‚Sa` LEFT JOIN `‚s‚Sb` ON (`‚s‚Sa`.`‚b‚P` = `‚s‚Sb`.`‚b‚P`);
‚b‚P ‚b‚P
± ±
¶ NULL
» NULL
SELECT * FROM `‚s‚Sb` RIGHT JOIN `‚s‚Sa` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
-NULL ¶
-NULL »
+‚b‚P
SELECT * FROM `‚s‚Sb` RIGHT JOIN `‚s‚Sa` ON (`‚s‚Sa`.`‚b‚P` = `‚s‚Sb`.`‚b‚P`);
‚b‚P ‚b‚P
± ±
@@ -235,31 +235,31 @@ SELECT * FROM `‚s‚Ta` INNER JOIN `‚s‚Tb`;
‚© ‚ 
‚³ ‚ 
SELECT * FROM `‚s‚Ta` JOIN `‚s‚Tb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
+‚b‚P
+‚ 
SELECT * FROM `‚s‚Ta` INNER JOIN `‚s‚Tb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
+‚b‚P
+‚ 
SELECT * FROM `‚s‚Ta` CROSS JOIN `‚s‚Tb`;
‚b‚P ‚b‚P
‚  ‚ 
‚© ‚ 
‚³ ‚ 
SELECT * FROM `‚s‚Ta` LEFT JOIN `‚s‚Tb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
-‚© NULL
-‚³ NULL
+‚b‚P
+‚ 
+‚©
+‚³
SELECT * FROM `‚s‚Ta` LEFT JOIN `‚s‚Tb` ON (`‚s‚Ta`.`‚b‚P` = `‚s‚Tb`.`‚b‚P`);
‚b‚P ‚b‚P
‚  ‚ 
‚© NULL
‚³ NULL
SELECT * FROM `‚s‚Tb` RIGHT JOIN `‚s‚Ta` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
-NULL ‚©
-NULL ‚³
+‚b‚P
+‚ 
+‚©
+‚³
SELECT * FROM `‚s‚Tb` RIGHT JOIN `‚s‚Ta` ON (`‚s‚Ta`.`‚b‚P` = `‚s‚Tb`.`‚b‚P`);
‚b‚P ‚b‚P
‚  ‚ 
@@ -276,31 +276,31 @@ SELECT * FROM `‚s‚Ua` INNER JOIN `‚s‚Ub`;
\ ƒ\
•\ ƒ\
SELECT * FROM `‚s‚Ua` JOIN `‚s‚Ub` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
+‚b‚P
+ƒ\
SELECT * FROM `‚s‚Ua` INNER JOIN `‚s‚Ub` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
+‚b‚P
+ƒ\
SELECT * FROM `‚s‚Ua` CROSS JOIN `‚s‚Ub`;
‚b‚P ‚b‚P
ƒ\ ƒ\
\ ƒ\
•\ ƒ\
SELECT * FROM `‚s‚Ua` LEFT JOIN `‚s‚Ub` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
-\ NULL
-•\ NULL
+‚b‚P
+ƒ\
+\
+•\
SELECT * FROM `‚s‚Ua` LEFT JOIN `‚s‚Ub` ON (`‚s‚Ua`.`‚b‚P` = `‚s‚Ub`.`‚b‚P`);
‚b‚P ‚b‚P
ƒ\ ƒ\
\ NULL
•\ NULL
SELECT * FROM `‚s‚Ub` RIGHT JOIN `‚s‚Ua` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
-NULL \
-NULL •\
+‚b‚P
+ƒ\
+\
+•\
SELECT * FROM `‚s‚Ub` RIGHT JOIN `‚s‚Ua` ON (`‚s‚Ua`.`‚b‚P` = `‚s‚Ub`.`‚b‚P`);
‚b‚P ‚b‚P
ƒ\ ƒ\
@@ -317,31 +317,31 @@ SELECT * FROM `‚s‚Va` INNER JOIN `‚s‚Vb`;
¶ ±
» ±
SELECT * FROM `‚s‚Va` JOIN `‚s‚Vb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
+‚b‚P
SELECT * FROM `‚s‚Va` INNER JOIN `‚s‚Vb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
+‚b‚P
SELECT * FROM `‚s‚Va` CROSS JOIN `‚s‚Vb`;
‚b‚P ‚b‚P
± ±
¶ ±
» ±
SELECT * FROM `‚s‚Va` LEFT JOIN `‚s‚Vb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
-¶ NULL
-» NULL
+‚b‚P
SELECT * FROM `‚s‚Va` LEFT JOIN `‚s‚Vb` ON (`‚s‚Va`.`‚b‚P` = `‚s‚Vb`.`‚b‚P`);
‚b‚P ‚b‚P
± ±
¶ NULL
» NULL
SELECT * FROM `‚s‚Vb` RIGHT JOIN `‚s‚Va` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
-NULL ¶
-NULL »
+‚b‚P
SELECT * FROM `‚s‚Vb` RIGHT JOIN `‚s‚Va` ON (`‚s‚Va`.`‚b‚P` = `‚s‚Vb`.`‚b‚P`);
‚b‚P ‚b‚P
± ±
@@ -358,31 +358,31 @@ SELECT * FROM `‚s‚Wa` INNER JOIN `‚s‚Wb`;
‚© ‚ 
‚³ ‚ 
SELECT * FROM `‚s‚Wa` JOIN `‚s‚Wb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
+‚b‚P
+‚ 
SELECT * FROM `‚s‚Wa` INNER JOIN `‚s‚Wb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
+‚b‚P
+‚ 
SELECT * FROM `‚s‚Wa` CROSS JOIN `‚s‚Wb`;
‚b‚P ‚b‚P
‚  ‚ 
‚© ‚ 
‚³ ‚ 
SELECT * FROM `‚s‚Wa` LEFT JOIN `‚s‚Wb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
-‚© NULL
-‚³ NULL
+‚b‚P
+‚ 
+‚©
+‚³
SELECT * FROM `‚s‚Wa` LEFT JOIN `‚s‚Wb` ON (`‚s‚Wa`.`‚b‚P` = `‚s‚Wb`.`‚b‚P`);
‚b‚P ‚b‚P
‚  ‚ 
‚© NULL
‚³ NULL
SELECT * FROM `‚s‚Wb` RIGHT JOIN `‚s‚Wa` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
-NULL ‚©
-NULL ‚³
+‚b‚P
+‚ 
+‚©
+‚³
SELECT * FROM `‚s‚Wb` RIGHT JOIN `‚s‚Wa` ON (`‚s‚Wa`.`‚b‚P` = `‚s‚Wb`.`‚b‚P`);
‚b‚P ‚b‚P
‚  ‚ 
@@ -399,31 +399,31 @@ SELECT * FROM `‚s‚Xa` INNER JOIN `‚s‚Xb`;
\ ƒ\
•\ ƒ\
SELECT * FROM `‚s‚Xa` JOIN `‚s‚Xb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
+‚b‚P
+ƒ\
SELECT * FROM `‚s‚Xa` INNER JOIN `‚s‚Xb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
+‚b‚P
+ƒ\
SELECT * FROM `‚s‚Xa` CROSS JOIN `‚s‚Xb`;
‚b‚P ‚b‚P
ƒ\ ƒ\
\ ƒ\
•\ ƒ\
SELECT * FROM `‚s‚Xa` LEFT JOIN `‚s‚Xb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
-\ NULL
-•\ NULL
+‚b‚P
+ƒ\
+\
+•\
SELECT * FROM `‚s‚Xa` LEFT JOIN `‚s‚Xb` ON (`‚s‚Xa`.`‚b‚P` = `‚s‚Xb`.`‚b‚P`);
‚b‚P ‚b‚P
ƒ\ ƒ\
\ NULL
•\ NULL
SELECT * FROM `‚s‚Xb` RIGHT JOIN `‚s‚Xa` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
-NULL \
-NULL •\
+‚b‚P
+ƒ\
+\
+•\
SELECT * FROM `‚s‚Xb` RIGHT JOIN `‚s‚Xa` ON (`‚s‚Xa`.`‚b‚P` = `‚s‚Xb`.`‚b‚P`);
‚b‚P ‚b‚P
ƒ\ ƒ\
@@ -440,31 +440,31 @@ SELECT * FROM `‚s‚P‚Oa` INNER JOIN `‚s‚P‚Ob`;
¶ ±
» ±
SELECT * FROM `‚s‚P‚Oa` JOIN `‚s‚P‚Ob` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
+‚b‚P
SELECT * FROM `‚s‚P‚Oa` INNER JOIN `‚s‚P‚Ob` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
+‚b‚P
SELECT * FROM `‚s‚P‚Oa` CROSS JOIN `‚s‚P‚Ob`;
‚b‚P ‚b‚P
± ±
¶ ±
» ±
SELECT * FROM `‚s‚P‚Oa` LEFT JOIN `‚s‚P‚Ob` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
-¶ NULL
-» NULL
+‚b‚P
SELECT * FROM `‚s‚P‚Oa` LEFT JOIN `‚s‚P‚Ob` ON (`‚s‚P‚Oa`.`‚b‚P` = `‚s‚P‚Ob`.`‚b‚P`);
‚b‚P ‚b‚P
± ±
¶ NULL
» NULL
SELECT * FROM `‚s‚P‚Ob` RIGHT JOIN `‚s‚P‚Oa` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-± ±
-NULL ¶
-NULL »
+‚b‚P
SELECT * FROM `‚s‚P‚Ob` RIGHT JOIN `‚s‚P‚Oa` ON (`‚s‚P‚Oa`.`‚b‚P` = `‚s‚P‚Ob`.`‚b‚P`);
‚b‚P ‚b‚P
± ±
@@ -481,31 +481,31 @@ SELECT * FROM `‚s‚P‚Pa` INNER JOIN `‚s‚P‚Pb`;
‚© ‚ 
‚³ ‚ 
SELECT * FROM `‚s‚P‚Pa` JOIN `‚s‚P‚Pb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
+‚b‚P
+‚ 
SELECT * FROM `‚s‚P‚Pa` INNER JOIN `‚s‚P‚Pb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
+‚b‚P
+‚ 
SELECT * FROM `‚s‚P‚Pa` CROSS JOIN `‚s‚P‚Pb`;
‚b‚P ‚b‚P
‚  ‚ 
‚© ‚ 
‚³ ‚ 
SELECT * FROM `‚s‚P‚Pa` LEFT JOIN `‚s‚P‚Pb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
-‚© NULL
-‚³ NULL
+‚b‚P
+‚ 
+‚©
+‚³
SELECT * FROM `‚s‚P‚Pa` LEFT JOIN `‚s‚P‚Pb` ON (`‚s‚P‚Pa`.`‚b‚P` = `‚s‚P‚Pb`.`‚b‚P`);
‚b‚P ‚b‚P
‚  ‚ 
‚© NULL
‚³ NULL
SELECT * FROM `‚s‚P‚Pb` RIGHT JOIN `‚s‚P‚Pa` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-‚  ‚ 
-NULL ‚©
-NULL ‚³
+‚b‚P
+‚ 
+‚©
+‚³
SELECT * FROM `‚s‚P‚Pb` RIGHT JOIN `‚s‚P‚Pa` ON (`‚s‚P‚Pa`.`‚b‚P` = `‚s‚P‚Pb`.`‚b‚P`);
‚b‚P ‚b‚P
‚  ‚ 
@@ -522,31 +522,31 @@ SELECT * FROM `‚s‚P‚Qa` INNER JOIN `‚s‚P‚Qb`;
\ ƒ\
•\ ƒ\
SELECT * FROM `‚s‚P‚Qa` JOIN `‚s‚P‚Qb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
+‚b‚P
+ƒ\
SELECT * FROM `‚s‚P‚Qa` INNER JOIN `‚s‚P‚Qb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
+‚b‚P
+ƒ\
SELECT * FROM `‚s‚P‚Qa` CROSS JOIN `‚s‚P‚Qb`;
‚b‚P ‚b‚P
ƒ\ ƒ\
\ ƒ\
•\ ƒ\
SELECT * FROM `‚s‚P‚Qa` LEFT JOIN `‚s‚P‚Qb` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
-\ NULL
-•\ NULL
+‚b‚P
+ƒ\
+\
+•\
SELECT * FROM `‚s‚P‚Qa` LEFT JOIN `‚s‚P‚Qb` ON (`‚s‚P‚Qa`.`‚b‚P` = `‚s‚P‚Qb`.`‚b‚P`);
‚b‚P ‚b‚P
ƒ\ ƒ\
\ NULL
•\ NULL
SELECT * FROM `‚s‚P‚Qb` RIGHT JOIN `‚s‚P‚Qa` USING (`‚b‚P`);
-‚b‚P ‚b‚P
-ƒ\ ƒ\
-NULL \
-NULL •\
+‚b‚P
+ƒ\
+\
+•\
SELECT * FROM `‚s‚P‚Qb` RIGHT JOIN `‚s‚P‚Qa` ON (`‚s‚P‚Qa`.`‚b‚P` = `‚s‚P‚Qb`.`‚b‚P`);
‚b‚P ‚b‚P
ƒ\ ƒ\
diff --git a/mysql-test/suite/jp/r/jp_join_ucs2.result b/mysql-test/suite/jp/r/jp_join_ucs2.result
index 76988f15cc4..ac19554eb5a 100644
--- a/mysql-test/suite/jp/r/jp_join_ucs2.result
+++ b/mysql-test/suite/jp/r/jp_join_ucs2.result
@@ -72,31 +72,31 @@ SELECT * FROM `£Ô£±a` INNER JOIN `£Ô£±b`;
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£±a` JOIN `£Ô£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£±a` INNER JOIN `£Ô£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£±a` CROSS JOIN `£Ô£±b`;
£Ã£± £Ã£±
Ž± Ž±
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£±a` LEFT JOIN `£Ô£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-Ž¶ NULL
-Ž» NULL
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£±a` LEFT JOIN `£Ô£±b` ON (`£Ô£±a`.`£Ã£±` = `£Ô£±b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
Ž¶ NULL
Ž» NULL
SELECT * FROM `£Ô£±b` RIGHT JOIN `£Ô£±a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-NULL Ž¶
-NULL Ž»
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£±b` RIGHT JOIN `£Ô£±a` ON (`£Ô£±a`.`£Ã£±` = `£Ô£±b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
@@ -113,31 +113,31 @@ SELECT * FROM `£Ô£²a` INNER JOIN `£Ô£²b`;
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£²a` JOIN `£Ô£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£²a` INNER JOIN `£Ô£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£²a` CROSS JOIN `£Ô£²b`;
£Ã£± £Ã£±
¤¢ ¤¢
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£²a` LEFT JOIN `£Ô£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-¤« NULL
-¤µ NULL
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£²a` LEFT JOIN `£Ô£²b` ON (`£Ô£²a`.`£Ã£±` = `£Ô£²b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
¤« NULL
¤µ NULL
SELECT * FROM `£Ô£²b` RIGHT JOIN `£Ô£²a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-NULL ¤«
-NULL ¤µ
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£²b` RIGHT JOIN `£Ô£²a` ON (`£Ô£²a`.`£Ã£±` = `£Ô£²b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
@@ -154,31 +154,31 @@ SELECT * FROM `£Ô£³a` INNER JOIN `£Ô£³b`;
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£³a` JOIN `£Ô£³b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£³a` INNER JOIN `£Ô£³b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£³a` CROSS JOIN `£Ô£³b`;
£Ã£± £Ã£±
íÜ íÜ
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£³a` LEFT JOIN `£Ô£³b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-íÝ NULL
-íÞ NULL
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£³a` LEFT JOIN `£Ô£³b` ON (`£Ô£³a`.`£Ã£±` = `£Ô£³b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
íÝ NULL
íÞ NULL
SELECT * FROM `£Ô£³b` RIGHT JOIN `£Ô£³a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-NULL íÝ
-NULL íÞ
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£³b` RIGHT JOIN `£Ô£³a` ON (`£Ô£³a`.`£Ã£±` = `£Ô£³b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
@@ -195,31 +195,31 @@ SELECT * FROM `£Ô£´a` INNER JOIN `£Ô£´b`;
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£´a` JOIN `£Ô£´b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£´a` INNER JOIN `£Ô£´b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£´a` CROSS JOIN `£Ô£´b`;
£Ã£± £Ã£±
Ž± Ž±
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£´a` LEFT JOIN `£Ô£´b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-Ž¶ NULL
-Ž» NULL
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£´a` LEFT JOIN `£Ô£´b` ON (`£Ô£´a`.`£Ã£±` = `£Ô£´b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
Ž¶ NULL
Ž» NULL
SELECT * FROM `£Ô£´b` RIGHT JOIN `£Ô£´a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-NULL Ž¶
-NULL Ž»
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£´b` RIGHT JOIN `£Ô£´a` ON (`£Ô£´a`.`£Ã£±` = `£Ô£´b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
@@ -236,31 +236,31 @@ SELECT * FROM `£Ô£µa` INNER JOIN `£Ô£µb`;
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£µa` JOIN `£Ô£µb` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£µa` INNER JOIN `£Ô£µb` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£µa` CROSS JOIN `£Ô£µb`;
£Ã£± £Ã£±
¤¢ ¤¢
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£µa` LEFT JOIN `£Ô£µb` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-¤« NULL
-¤µ NULL
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£µa` LEFT JOIN `£Ô£µb` ON (`£Ô£µa`.`£Ã£±` = `£Ô£µb`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
¤« NULL
¤µ NULL
SELECT * FROM `£Ô£µb` RIGHT JOIN `£Ô£µa` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-NULL ¤«
-NULL ¤µ
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£µb` RIGHT JOIN `£Ô£µa` ON (`£Ô£µa`.`£Ã£±` = `£Ô£µb`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
@@ -277,31 +277,31 @@ SELECT * FROM `£Ô£¶a` INNER JOIN `£Ô£¶b`;
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£¶a` JOIN `£Ô£¶b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£¶a` INNER JOIN `£Ô£¶b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£¶a` CROSS JOIN `£Ô£¶b`;
£Ã£± £Ã£±
íÜ íÜ
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£¶a` LEFT JOIN `£Ô£¶b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-íÝ NULL
-íÞ NULL
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£¶a` LEFT JOIN `£Ô£¶b` ON (`£Ô£¶a`.`£Ã£±` = `£Ô£¶b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
íÝ NULL
íÞ NULL
SELECT * FROM `£Ô£¶b` RIGHT JOIN `£Ô£¶a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-NULL íÝ
-NULL íÞ
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£¶b` RIGHT JOIN `£Ô£¶a` ON (`£Ô£¶a`.`£Ã£±` = `£Ô£¶b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
@@ -318,31 +318,31 @@ SELECT * FROM `£Ô£·a` INNER JOIN `£Ô£·b`;
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£·a` JOIN `£Ô£·b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£·a` INNER JOIN `£Ô£·b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£·a` CROSS JOIN `£Ô£·b`;
£Ã£± £Ã£±
Ž± Ž±
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£·a` LEFT JOIN `£Ô£·b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-Ž¶ NULL
-Ž» NULL
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£·a` LEFT JOIN `£Ô£·b` ON (`£Ô£·a`.`£Ã£±` = `£Ô£·b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
Ž¶ NULL
Ž» NULL
SELECT * FROM `£Ô£·b` RIGHT JOIN `£Ô£·a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-NULL Ž¶
-NULL Ž»
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£·b` RIGHT JOIN `£Ô£·a` ON (`£Ô£·a`.`£Ã£±` = `£Ô£·b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
@@ -359,31 +359,31 @@ SELECT * FROM `£Ô£¸a` INNER JOIN `£Ô£¸b`;
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£¸a` JOIN `£Ô£¸b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£¸a` INNER JOIN `£Ô£¸b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£¸a` CROSS JOIN `£Ô£¸b`;
£Ã£± £Ã£±
¤¢ ¤¢
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£¸a` LEFT JOIN `£Ô£¸b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-¤« NULL
-¤µ NULL
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£¸a` LEFT JOIN `£Ô£¸b` ON (`£Ô£¸a`.`£Ã£±` = `£Ô£¸b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
¤« NULL
¤µ NULL
SELECT * FROM `£Ô£¸b` RIGHT JOIN `£Ô£¸a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-NULL ¤«
-NULL ¤µ
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£¸b` RIGHT JOIN `£Ô£¸a` ON (`£Ô£¸a`.`£Ã£±` = `£Ô£¸b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
@@ -400,31 +400,31 @@ SELECT * FROM `£Ô£¹a` INNER JOIN `£Ô£¹b`;
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£¹a` JOIN `£Ô£¹b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£¹a` INNER JOIN `£Ô£¹b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£¹a` CROSS JOIN `£Ô£¹b`;
£Ã£± £Ã£±
íÜ íÜ
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£¹a` LEFT JOIN `£Ô£¹b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-íÝ NULL
-íÞ NULL
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£¹a` LEFT JOIN `£Ô£¹b` ON (`£Ô£¹a`.`£Ã£±` = `£Ô£¹b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
íÝ NULL
íÞ NULL
SELECT * FROM `£Ô£¹b` RIGHT JOIN `£Ô£¹a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-NULL íÝ
-NULL íÞ
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£¹b` RIGHT JOIN `£Ô£¹a` ON (`£Ô£¹a`.`£Ã£±` = `£Ô£¹b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
@@ -441,31 +441,31 @@ SELECT * FROM `£Ô£±£°a` INNER JOIN `£Ô£±£°b`;
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£±£°a` JOIN `£Ô£±£°b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£±£°a` INNER JOIN `£Ô£±£°b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£±£°a` CROSS JOIN `£Ô£±£°b`;
£Ã£± £Ã£±
Ž± Ž±
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£±£°a` LEFT JOIN `£Ô£±£°b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-Ž¶ NULL
-Ž» NULL
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£±£°a` LEFT JOIN `£Ô£±£°b` ON (`£Ô£±£°a`.`£Ã£±` = `£Ô£±£°b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
Ž¶ NULL
Ž» NULL
SELECT * FROM `£Ô£±£°b` RIGHT JOIN `£Ô£±£°a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-NULL Ž¶
-NULL Ž»
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£±£°b` RIGHT JOIN `£Ô£±£°a` ON (`£Ô£±£°a`.`£Ã£±` = `£Ô£±£°b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
@@ -482,31 +482,31 @@ SELECT * FROM `£Ô£±£±a` INNER JOIN `£Ô£±£±b`;
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£±£±a` JOIN `£Ô£±£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£±£±a` INNER JOIN `£Ô£±£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£±£±a` CROSS JOIN `£Ô£±£±b`;
£Ã£± £Ã£±
¤¢ ¤¢
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£±£±a` LEFT JOIN `£Ô£±£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-¤« NULL
-¤µ NULL
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£±£±a` LEFT JOIN `£Ô£±£±b` ON (`£Ô£±£±a`.`£Ã£±` = `£Ô£±£±b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
¤« NULL
¤µ NULL
SELECT * FROM `£Ô£±£±b` RIGHT JOIN `£Ô£±£±a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-NULL ¤«
-NULL ¤µ
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£±£±b` RIGHT JOIN `£Ô£±£±a` ON (`£Ô£±£±a`.`£Ã£±` = `£Ô£±£±b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
@@ -523,31 +523,31 @@ SELECT * FROM `£Ô£±£²a` INNER JOIN `£Ô£±£²b`;
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£±£²a` JOIN `£Ô£±£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£±£²a` INNER JOIN `£Ô£±£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£±£²a` CROSS JOIN `£Ô£±£²b`;
£Ã£± £Ã£±
íÜ íÜ
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£±£²a` LEFT JOIN `£Ô£±£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-íÝ NULL
-íÞ NULL
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£±£²a` LEFT JOIN `£Ô£±£²b` ON (`£Ô£±£²a`.`£Ã£±` = `£Ô£±£²b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
íÝ NULL
íÞ NULL
SELECT * FROM `£Ô£±£²b` RIGHT JOIN `£Ô£±£²a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-NULL íÝ
-NULL íÞ
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£±£²b` RIGHT JOIN `£Ô£±£²a` ON (`£Ô£±£²a`.`£Ã£±` = `£Ô£±£²b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
diff --git a/mysql-test/suite/jp/r/jp_join_ujis.result b/mysql-test/suite/jp/r/jp_join_ujis.result
index ac430cd9b5e..838d701cdcc 100644
--- a/mysql-test/suite/jp/r/jp_join_ujis.result
+++ b/mysql-test/suite/jp/r/jp_join_ujis.result
@@ -71,31 +71,31 @@ SELECT * FROM `£Ô£±a` INNER JOIN `£Ô£±b`;
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£±a` JOIN `£Ô£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£±a` INNER JOIN `£Ô£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£±a` CROSS JOIN `£Ô£±b`;
£Ã£± £Ã£±
Ž± Ž±
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£±a` LEFT JOIN `£Ô£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-Ž¶ NULL
-Ž» NULL
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£±a` LEFT JOIN `£Ô£±b` ON (`£Ô£±a`.`£Ã£±` = `£Ô£±b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
Ž¶ NULL
Ž» NULL
SELECT * FROM `£Ô£±b` RIGHT JOIN `£Ô£±a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-NULL Ž¶
-NULL Ž»
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£±b` RIGHT JOIN `£Ô£±a` ON (`£Ô£±a`.`£Ã£±` = `£Ô£±b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
@@ -112,31 +112,31 @@ SELECT * FROM `£Ô£²a` INNER JOIN `£Ô£²b`;
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£²a` JOIN `£Ô£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£²a` INNER JOIN `£Ô£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£²a` CROSS JOIN `£Ô£²b`;
£Ã£± £Ã£±
¤¢ ¤¢
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£²a` LEFT JOIN `£Ô£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-¤« NULL
-¤µ NULL
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£²a` LEFT JOIN `£Ô£²b` ON (`£Ô£²a`.`£Ã£±` = `£Ô£²b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
¤« NULL
¤µ NULL
SELECT * FROM `£Ô£²b` RIGHT JOIN `£Ô£²a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-NULL ¤«
-NULL ¤µ
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£²b` RIGHT JOIN `£Ô£²a` ON (`£Ô£²a`.`£Ã£±` = `£Ô£²b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
@@ -153,31 +153,31 @@ SELECT * FROM `£Ô£³a` INNER JOIN `£Ô£³b`;
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£³a` JOIN `£Ô£³b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£³a` INNER JOIN `£Ô£³b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£³a` CROSS JOIN `£Ô£³b`;
£Ã£± £Ã£±
íÜ íÜ
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£³a` LEFT JOIN `£Ô£³b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-íÝ NULL
-íÞ NULL
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£³a` LEFT JOIN `£Ô£³b` ON (`£Ô£³a`.`£Ã£±` = `£Ô£³b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
íÝ NULL
íÞ NULL
SELECT * FROM `£Ô£³b` RIGHT JOIN `£Ô£³a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-NULL íÝ
-NULL íÞ
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£³b` RIGHT JOIN `£Ô£³a` ON (`£Ô£³a`.`£Ã£±` = `£Ô£³b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
@@ -194,31 +194,31 @@ SELECT * FROM `£Ô£´a` INNER JOIN `£Ô£´b`;
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£´a` JOIN `£Ô£´b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£´a` INNER JOIN `£Ô£´b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£´a` CROSS JOIN `£Ô£´b`;
£Ã£± £Ã£±
Ž± Ž±
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£´a` LEFT JOIN `£Ô£´b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-Ž¶ NULL
-Ž» NULL
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£´a` LEFT JOIN `£Ô£´b` ON (`£Ô£´a`.`£Ã£±` = `£Ô£´b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
Ž¶ NULL
Ž» NULL
SELECT * FROM `£Ô£´b` RIGHT JOIN `£Ô£´a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-NULL Ž¶
-NULL Ž»
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£´b` RIGHT JOIN `£Ô£´a` ON (`£Ô£´a`.`£Ã£±` = `£Ô£´b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
@@ -235,31 +235,31 @@ SELECT * FROM `£Ô£µa` INNER JOIN `£Ô£µb`;
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£µa` JOIN `£Ô£µb` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£µa` INNER JOIN `£Ô£µb` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£µa` CROSS JOIN `£Ô£µb`;
£Ã£± £Ã£±
¤¢ ¤¢
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£µa` LEFT JOIN `£Ô£µb` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-¤« NULL
-¤µ NULL
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£µa` LEFT JOIN `£Ô£µb` ON (`£Ô£µa`.`£Ã£±` = `£Ô£µb`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
¤« NULL
¤µ NULL
SELECT * FROM `£Ô£µb` RIGHT JOIN `£Ô£µa` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-NULL ¤«
-NULL ¤µ
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£µb` RIGHT JOIN `£Ô£µa` ON (`£Ô£µa`.`£Ã£±` = `£Ô£µb`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
@@ -276,31 +276,31 @@ SELECT * FROM `£Ô£¶a` INNER JOIN `£Ô£¶b`;
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£¶a` JOIN `£Ô£¶b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£¶a` INNER JOIN `£Ô£¶b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£¶a` CROSS JOIN `£Ô£¶b`;
£Ã£± £Ã£±
íÜ íÜ
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£¶a` LEFT JOIN `£Ô£¶b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-íÝ NULL
-íÞ NULL
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£¶a` LEFT JOIN `£Ô£¶b` ON (`£Ô£¶a`.`£Ã£±` = `£Ô£¶b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
íÝ NULL
íÞ NULL
SELECT * FROM `£Ô£¶b` RIGHT JOIN `£Ô£¶a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-NULL íÝ
-NULL íÞ
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£¶b` RIGHT JOIN `£Ô£¶a` ON (`£Ô£¶a`.`£Ã£±` = `£Ô£¶b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
@@ -317,31 +317,31 @@ SELECT * FROM `£Ô£·a` INNER JOIN `£Ô£·b`;
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£·a` JOIN `£Ô£·b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£·a` INNER JOIN `£Ô£·b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£·a` CROSS JOIN `£Ô£·b`;
£Ã£± £Ã£±
Ž± Ž±
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£·a` LEFT JOIN `£Ô£·b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-Ž¶ NULL
-Ž» NULL
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£·a` LEFT JOIN `£Ô£·b` ON (`£Ô£·a`.`£Ã£±` = `£Ô£·b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
Ž¶ NULL
Ž» NULL
SELECT * FROM `£Ô£·b` RIGHT JOIN `£Ô£·a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-NULL Ž¶
-NULL Ž»
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£·b` RIGHT JOIN `£Ô£·a` ON (`£Ô£·a`.`£Ã£±` = `£Ô£·b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
@@ -358,31 +358,31 @@ SELECT * FROM `£Ô£¸a` INNER JOIN `£Ô£¸b`;
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£¸a` JOIN `£Ô£¸b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£¸a` INNER JOIN `£Ô£¸b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£¸a` CROSS JOIN `£Ô£¸b`;
£Ã£± £Ã£±
¤¢ ¤¢
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£¸a` LEFT JOIN `£Ô£¸b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-¤« NULL
-¤µ NULL
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£¸a` LEFT JOIN `£Ô£¸b` ON (`£Ô£¸a`.`£Ã£±` = `£Ô£¸b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
¤« NULL
¤µ NULL
SELECT * FROM `£Ô£¸b` RIGHT JOIN `£Ô£¸a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-NULL ¤«
-NULL ¤µ
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£¸b` RIGHT JOIN `£Ô£¸a` ON (`£Ô£¸a`.`£Ã£±` = `£Ô£¸b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
@@ -399,31 +399,31 @@ SELECT * FROM `£Ô£¹a` INNER JOIN `£Ô£¹b`;
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£¹a` JOIN `£Ô£¹b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£¹a` INNER JOIN `£Ô£¹b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£¹a` CROSS JOIN `£Ô£¹b`;
£Ã£± £Ã£±
íÜ íÜ
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£¹a` LEFT JOIN `£Ô£¹b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-íÝ NULL
-íÞ NULL
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£¹a` LEFT JOIN `£Ô£¹b` ON (`£Ô£¹a`.`£Ã£±` = `£Ô£¹b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
íÝ NULL
íÞ NULL
SELECT * FROM `£Ô£¹b` RIGHT JOIN `£Ô£¹a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-NULL íÝ
-NULL íÞ
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£¹b` RIGHT JOIN `£Ô£¹a` ON (`£Ô£¹a`.`£Ã£±` = `£Ô£¹b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
@@ -440,31 +440,31 @@ SELECT * FROM `£Ô£±£°a` INNER JOIN `£Ô£±£°b`;
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£±£°a` JOIN `£Ô£±£°b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£±£°a` INNER JOIN `£Ô£±£°b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
+£Ã£±
+Ž±
SELECT * FROM `£Ô£±£°a` CROSS JOIN `£Ô£±£°b`;
£Ã£± £Ã£±
Ž± Ž±
Ž¶ Ž±
Ž» Ž±
SELECT * FROM `£Ô£±£°a` LEFT JOIN `£Ô£±£°b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-Ž¶ NULL
-Ž» NULL
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£±£°a` LEFT JOIN `£Ô£±£°b` ON (`£Ô£±£°a`.`£Ã£±` = `£Ô£±£°b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
Ž¶ NULL
Ž» NULL
SELECT * FROM `£Ô£±£°b` RIGHT JOIN `£Ô£±£°a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-Ž± Ž±
-NULL Ž¶
-NULL Ž»
+£Ã£±
+Ž±
+Ž¶
+Ž»
SELECT * FROM `£Ô£±£°b` RIGHT JOIN `£Ô£±£°a` ON (`£Ô£±£°a`.`£Ã£±` = `£Ô£±£°b`.`£Ã£±`);
£Ã£± £Ã£±
Ž± Ž±
@@ -481,31 +481,31 @@ SELECT * FROM `£Ô£±£±a` INNER JOIN `£Ô£±£±b`;
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£±£±a` JOIN `£Ô£±£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£±£±a` INNER JOIN `£Ô£±£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
+£Ã£±
+¤¢
SELECT * FROM `£Ô£±£±a` CROSS JOIN `£Ô£±£±b`;
£Ã£± £Ã£±
¤¢ ¤¢
¤« ¤¢
¤µ ¤¢
SELECT * FROM `£Ô£±£±a` LEFT JOIN `£Ô£±£±b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-¤« NULL
-¤µ NULL
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£±£±a` LEFT JOIN `£Ô£±£±b` ON (`£Ô£±£±a`.`£Ã£±` = `£Ô£±£±b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
¤« NULL
¤µ NULL
SELECT * FROM `£Ô£±£±b` RIGHT JOIN `£Ô£±£±a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-¤¢ ¤¢
-NULL ¤«
-NULL ¤µ
+£Ã£±
+¤¢
+¤«
+¤µ
SELECT * FROM `£Ô£±£±b` RIGHT JOIN `£Ô£±£±a` ON (`£Ô£±£±a`.`£Ã£±` = `£Ô£±£±b`.`£Ã£±`);
£Ã£± £Ã£±
¤¢ ¤¢
@@ -522,31 +522,31 @@ SELECT * FROM `£Ô£±£²a` INNER JOIN `£Ô£±£²b`;
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£±£²a` JOIN `£Ô£±£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£±£²a` INNER JOIN `£Ô£±£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
+£Ã£±
+íÜ
SELECT * FROM `£Ô£±£²a` CROSS JOIN `£Ô£±£²b`;
£Ã£± £Ã£±
íÜ íÜ
íÝ íÜ
íÞ íÜ
SELECT * FROM `£Ô£±£²a` LEFT JOIN `£Ô£±£²b` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-íÝ NULL
-íÞ NULL
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£±£²a` LEFT JOIN `£Ô£±£²b` ON (`£Ô£±£²a`.`£Ã£±` = `£Ô£±£²b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
íÝ NULL
íÞ NULL
SELECT * FROM `£Ô£±£²b` RIGHT JOIN `£Ô£±£²a` USING (`£Ã£±`);
-£Ã£± £Ã£±
-íÜ íÜ
-NULL íÝ
-NULL íÞ
+£Ã£±
+íÜ
+íÝ
+íÞ
SELECT * FROM `£Ô£±£²b` RIGHT JOIN `£Ô£±£²a` ON (`£Ô£±£²a`.`£Ã£±` = `£Ô£±£²b`.`£Ã£±`);
£Ã£± £Ã£±
íÜ íÜ
diff --git a/mysql-test/suite/jp/r/jp_join_utf8.result b/mysql-test/suite/jp/r/jp_join_utf8.result
index 716e97a2bb3..8c222653c3e 100644
--- a/mysql-test/suite/jp/r/jp_join_utf8.result
+++ b/mysql-test/suite/jp/r/jp_join_utf8.result
@@ -71,31 +71,31 @@ SELECT * FROM `T1a` INNER JOIN `T1b`;
カ ア
ï½» ï½±
SELECT * FROM `T1a` JOIN `T1b` USING (`C1`);
-C1 C1
-ï½± ï½±
+C1
+ï½±
SELECT * FROM `T1a` INNER JOIN `T1b` USING (`C1`);
-C1 C1
-ï½± ï½±
+C1
+ï½±
SELECT * FROM `T1a` CROSS JOIN `T1b`;
C1 C1
ï½± ï½±
カ ア
ï½» ï½±
SELECT * FROM `T1a` LEFT JOIN `T1b` USING (`C1`);
-C1 C1
-ï½± ï½±
-カ NULL
-ï½» NULL
+C1
+ï½±
+カ
+ï½»
SELECT * FROM `T1a` LEFT JOIN `T1b` ON (`T1a`.`C1` = `T1b`.`C1`);
C1 C1
ï½± ï½±
カ NULL
ï½» NULL
SELECT * FROM `T1b` RIGHT JOIN `T1a` USING (`C1`);
-C1 C1
-ï½± ï½±
-NULL カ
-NULL ï½»
+C1
+ï½±
+カ
+ï½»
SELECT * FROM `T1b` RIGHT JOIN `T1a` ON (`T1a`.`C1` = `T1b`.`C1`);
C1 C1
ï½± ï½±
@@ -112,31 +112,31 @@ SELECT * FROM `ï¼´ï¼’a` INNER JOIN `ï¼´ï¼’b`;
ã‹ ã‚
ã• ã‚
SELECT * FROM `T2a` JOIN `T2b` USING (`C1`);
-C1 C1
-ã‚ ã‚
+C1
+ã‚
SELECT * FROM `T2a` INNER JOIN `T2b` USING (`C1`);
-C1 C1
-ã‚ ã‚
+C1
+ã‚
SELECT * FROM `ï¼´ï¼’a` CROSS JOIN `ï¼´ï¼’b`;
C1 C1
ã‚ ã‚
ã‹ ã‚
ã• ã‚
SELECT * FROM `T2a` LEFT JOIN `T2b` USING (`C1`);
-C1 C1
-ã‚ ã‚
-ã‹ NULL
-ã• NULL
+C1
+ã‚
+ã‹
+ã•
SELECT * FROM `T2a` LEFT JOIN `T2b` ON (`T2a`.`C1` = `T2b`.`C1`);
C1 C1
ã‚ ã‚
ã‹ NULL
ã• NULL
SELECT * FROM `T2b` RIGHT JOIN `T2a` USING (`C1`);
-C1 C1
-ã‚ ã‚
-NULL ã‹
-NULL ã•
+C1
+ã‚
+ã‹
+ã•
SELECT * FROM `T2b` RIGHT JOIN `T2a` ON (`T2a`.`C1` = `T2b`.`C1`);
C1 C1
ã‚ ã‚
@@ -153,31 +153,31 @@ SELECT * FROM `T3a` INNER JOIN `T3b`;
é¾– é¾”
é¾— é¾”
SELECT * FROM `T3a` JOIN `T3b` USING (`C1`);
-C1 C1
-é¾” é¾”
+C1
+é¾”
SELECT * FROM `T3a` INNER JOIN `T3b` USING (`C1`);
-C1 C1
-é¾” é¾”
+C1
+é¾”
SELECT * FROM `T3a` CROSS JOIN `T3b`;
C1 C1
é¾” é¾”
é¾– é¾”
é¾— é¾”
SELECT * FROM `T3a` LEFT JOIN `T3b` USING (`C1`);
-C1 C1
-é¾” é¾”
-é¾– NULL
-é¾— NULL
+C1
+é¾”
+é¾–
+é¾—
SELECT * FROM `T3a` LEFT JOIN `T3b` ON (`T3a`.`C1` = `T3b`.`C1`);
C1 C1
é¾” é¾”
é¾– NULL
é¾— NULL
SELECT * FROM `T3b` RIGHT JOIN `T3a` USING (`C1`);
-C1 C1
-é¾” é¾”
-NULL é¾–
-NULL é¾—
+C1
+é¾”
+é¾–
+é¾—
SELECT * FROM `T3b` RIGHT JOIN `T3a` ON (`T3a`.`C1` = `T3b`.`C1`);
C1 C1
é¾” é¾”
@@ -194,31 +194,31 @@ SELECT * FROM `ï¼´ï¼”a` INNER JOIN `ï¼´ï¼”b`;
カ ア
ï½» ï½±
SELECT * FROM `T4a` JOIN `T4b` USING (`C1`);
-C1 C1
-ï½± ï½±
+C1
+ï½±
SELECT * FROM `T4a` INNER JOIN `T4b` USING (`C1`);
-C1 C1
-ï½± ï½±
+C1
+ï½±
SELECT * FROM `ï¼´ï¼”a` CROSS JOIN `ï¼´ï¼”b`;
C1 C1
ï½± ï½±
カ ア
ï½» ï½±
SELECT * FROM `T4a` LEFT JOIN `T4b` USING (`C1`);
-C1 C1
-ï½± ï½±
-カ NULL
-ï½» NULL
+C1
+ï½±
+カ
+ï½»
SELECT * FROM `T4a` LEFT JOIN `T4b` ON (`T4a`.`C1` = `T4b`.`C1`);
C1 C1
ï½± ï½±
カ NULL
ï½» NULL
SELECT * FROM `T4b` RIGHT JOIN `T4a` USING (`C1`);
-C1 C1
-ï½± ï½±
-NULL カ
-NULL ï½»
+C1
+ï½±
+カ
+ï½»
SELECT * FROM `T4b` RIGHT JOIN `T4a` ON (`T4a`.`C1` = `T4b`.`C1`);
C1 C1
ï½± ï½±
@@ -235,31 +235,31 @@ SELECT * FROM `T5a` INNER JOIN `T5b`;
ã‹ ã‚
ã• ã‚
SELECT * FROM `T5a` JOIN `T5b` USING (`C1`);
-C1 C1
-ã‚ ã‚
+C1
+ã‚
SELECT * FROM `T5a` INNER JOIN `T5b` USING (`C1`);
-C1 C1
-ã‚ ã‚
+C1
+ã‚
SELECT * FROM `T5a` CROSS JOIN `T5b`;
C1 C1
ã‚ ã‚
ã‹ ã‚
ã• ã‚
SELECT * FROM `T5a` LEFT JOIN `T5b` USING (`C1`);
-C1 C1
-ã‚ ã‚
-ã‹ NULL
-ã• NULL
+C1
+ã‚
+ã‹
+ã•
SELECT * FROM `T5a` LEFT JOIN `T5b` ON (`T5a`.`C1` = `T5b`.`C1`);
C1 C1
ã‚ ã‚
ã‹ NULL
ã• NULL
SELECT * FROM `T5b` RIGHT JOIN `T5a` USING (`C1`);
-C1 C1
-ã‚ ã‚
-NULL ã‹
-NULL ã•
+C1
+ã‚
+ã‹
+ã•
SELECT * FROM `T5b` RIGHT JOIN `T5a` ON (`T5a`.`C1` = `T5b`.`C1`);
C1 C1
ã‚ ã‚
@@ -276,31 +276,31 @@ SELECT * FROM `ï¼´ï¼–a` INNER JOIN `ï¼´ï¼–b`;
é¾– é¾”
é¾— é¾”
SELECT * FROM `T6a` JOIN `T6b` USING (`C1`);
-C1 C1
-é¾” é¾”
+C1
+é¾”
SELECT * FROM `T6a` INNER JOIN `T6b` USING (`C1`);
-C1 C1
-é¾” é¾”
+C1
+é¾”
SELECT * FROM `ï¼´ï¼–a` CROSS JOIN `ï¼´ï¼–b`;
C1 C1
é¾” é¾”
é¾– é¾”
é¾— é¾”
SELECT * FROM `T6a` LEFT JOIN `T6b` USING (`C1`);
-C1 C1
-é¾” é¾”
-é¾– NULL
-é¾— NULL
+C1
+é¾”
+é¾–
+é¾—
SELECT * FROM `T6a` LEFT JOIN `T6b` ON (`T6a`.`C1` = `T6b`.`C1`);
C1 C1
é¾” é¾”
é¾– NULL
é¾— NULL
SELECT * FROM `T6b` RIGHT JOIN `T6a` USING (`C1`);
-C1 C1
-é¾” é¾”
-NULL é¾–
-NULL é¾—
+C1
+é¾”
+é¾–
+é¾—
SELECT * FROM `T6b` RIGHT JOIN `T6a` ON (`T6a`.`C1` = `T6b`.`C1`);
C1 C1
é¾” é¾”
@@ -317,31 +317,31 @@ SELECT * FROM `ï¼´ï¼—a` INNER JOIN `ï¼´ï¼—b`;
カ ア
ï½» ï½±
SELECT * FROM `T7a` JOIN `T7b` USING (`C1`);
-C1 C1
-ï½± ï½±
+C1
+ï½±
SELECT * FROM `T7a` INNER JOIN `T7b` USING (`C1`);
-C1 C1
-ï½± ï½±
+C1
+ï½±
SELECT * FROM `ï¼´ï¼—a` CROSS JOIN `ï¼´ï¼—b`;
C1 C1
ï½± ï½±
カ ア
ï½» ï½±
SELECT * FROM `T7a` LEFT JOIN `T7b` USING (`C1`);
-C1 C1
-ï½± ï½±
-カ NULL
-ï½» NULL
+C1
+ï½±
+カ
+ï½»
SELECT * FROM `T7a` LEFT JOIN `T7b` ON (`T7a`.`C1` = `T7b`.`C1`);
C1 C1
ï½± ï½±
カ NULL
ï½» NULL
SELECT * FROM `T7b` RIGHT JOIN `T7a` USING (`C1`);
-C1 C1
-ï½± ï½±
-NULL カ
-NULL ï½»
+C1
+ï½±
+カ
+ï½»
SELECT * FROM `T7b` RIGHT JOIN `T7a` ON (`T7a`.`C1` = `T7b`.`C1`);
C1 C1
ï½± ï½±
@@ -358,31 +358,31 @@ SELECT * FROM `T8a` INNER JOIN `T8b`;
ã‹ ã‚
ã• ã‚
SELECT * FROM `T8a` JOIN `T8b` USING (`C1`);
-C1 C1
-ã‚ ã‚
+C1
+ã‚
SELECT * FROM `T8a` INNER JOIN `T8b` USING (`C1`);
-C1 C1
-ã‚ ã‚
+C1
+ã‚
SELECT * FROM `T8a` CROSS JOIN `T8b`;
C1 C1
ã‚ ã‚
ã‹ ã‚
ã• ã‚
SELECT * FROM `T8a` LEFT JOIN `T8b` USING (`C1`);
-C1 C1
-ã‚ ã‚
-ã‹ NULL
-ã• NULL
+C1
+ã‚
+ã‹
+ã•
SELECT * FROM `T8a` LEFT JOIN `T8b` ON (`T8a`.`C1` = `T8b`.`C1`);
C1 C1
ã‚ ã‚
ã‹ NULL
ã• NULL
SELECT * FROM `T8b` RIGHT JOIN `T8a` USING (`C1`);
-C1 C1
-ã‚ ã‚
-NULL ã‹
-NULL ã•
+C1
+ã‚
+ã‹
+ã•
SELECT * FROM `T8b` RIGHT JOIN `T8a` ON (`T8a`.`C1` = `T8b`.`C1`);
C1 C1
ã‚ ã‚
@@ -399,31 +399,31 @@ SELECT * FROM `ï¼´ï¼™a` INNER JOIN `ï¼´ï¼™b`;
é¾– é¾”
é¾— é¾”
SELECT * FROM `T9a` JOIN `T9b` USING (`C1`);
-C1 C1
-é¾” é¾”
+C1
+é¾”
SELECT * FROM `T9a` INNER JOIN `T9b` USING (`C1`);
-C1 C1
-é¾” é¾”
+C1
+é¾”
SELECT * FROM `ï¼´ï¼™a` CROSS JOIN `ï¼´ï¼™b`;
C1 C1
é¾” é¾”
é¾– é¾”
é¾— é¾”
SELECT * FROM `T9a` LEFT JOIN `T9b` USING (`C1`);
-C1 C1
-é¾” é¾”
-é¾– NULL
-é¾— NULL
+C1
+é¾”
+é¾–
+é¾—
SELECT * FROM `T9a` LEFT JOIN `T9b` ON (`T9a`.`C1` = `T9b`.`C1`);
C1 C1
é¾” é¾”
é¾– NULL
é¾— NULL
SELECT * FROM `T9b` RIGHT JOIN `T9a` USING (`C1`);
-C1 C1
-é¾” é¾”
-NULL é¾–
-NULL é¾—
+C1
+é¾”
+é¾–
+é¾—
SELECT * FROM `T9b` RIGHT JOIN `T9a` ON (`T9a`.`C1` = `T9b`.`C1`);
C1 C1
é¾” é¾”
@@ -440,31 +440,31 @@ SELECT * FROM `T1ï¼a` INNER JOIN `T1ï¼b`;
カ ア
ï½» ï½±
SELECT * FROM `T1ï¼a` JOIN `T1ï¼b` USING (`C1`);
-C1 C1
-ï½± ï½±
+C1
+ï½±
SELECT * FROM `T1ï¼a` INNER JOIN `T1ï¼b` USING (`C1`);
-C1 C1
-ï½± ï½±
+C1
+ï½±
SELECT * FROM `T1ï¼a` CROSS JOIN `T1ï¼b`;
C1 C1
ï½± ï½±
カ ア
ï½» ï½±
SELECT * FROM `T1ï¼a` LEFT JOIN `T1ï¼b` USING (`C1`);
-C1 C1
-ï½± ï½±
-カ NULL
-ï½» NULL
+C1
+ï½±
+カ
+ï½»
SELECT * FROM `T1ï¼a` LEFT JOIN `T1ï¼b` ON (`T1ï¼a`.`C1` = `T1ï¼b`.`C1`);
C1 C1
ï½± ï½±
カ NULL
ï½» NULL
SELECT * FROM `T1ï¼b` RIGHT JOIN `T1ï¼a` USING (`C1`);
-C1 C1
-ï½± ï½±
-NULL カ
-NULL ï½»
+C1
+ï½±
+カ
+ï½»
SELECT * FROM `T1ï¼b` RIGHT JOIN `T1ï¼a` ON (`T1ï¼a`.`C1` = `T1ï¼b`.`C1`);
C1 C1
ï½± ï½±
@@ -481,31 +481,31 @@ SELECT * FROM `T11a` INNER JOIN `T11b`;
ã‹ ã‚
ã• ã‚
SELECT * FROM `T11a` JOIN `T11b` USING (`C1`);
-C1 C1
-ã‚ ã‚
+C1
+ã‚
SELECT * FROM `T11a` INNER JOIN `T11b` USING (`C1`);
-C1 C1
-ã‚ ã‚
+C1
+ã‚
SELECT * FROM `T11a` CROSS JOIN `T11b`;
C1 C1
ã‚ ã‚
ã‹ ã‚
ã• ã‚
SELECT * FROM `T11a` LEFT JOIN `T11b` USING (`C1`);
-C1 C1
-ã‚ ã‚
-ã‹ NULL
-ã• NULL
+C1
+ã‚
+ã‹
+ã•
SELECT * FROM `T11a` LEFT JOIN `T11b` ON (`T11a`.`C1` = `T11b`.`C1`);
C1 C1
ã‚ ã‚
ã‹ NULL
ã• NULL
SELECT * FROM `T11b` RIGHT JOIN `T11a` USING (`C1`);
-C1 C1
-ã‚ ã‚
-NULL ã‹
-NULL ã•
+C1
+ã‚
+ã‹
+ã•
SELECT * FROM `T11b` RIGHT JOIN `T11a` ON (`T11a`.`C1` = `T11b`.`C1`);
C1 C1
ã‚ ã‚
@@ -522,31 +522,31 @@ SELECT * FROM `T12a` INNER JOIN `T12b`;
é¾– é¾”
é¾— é¾”
SELECT * FROM `T12a` JOIN `T12b` USING (`C1`);
-C1 C1
-é¾” é¾”
+C1
+é¾”
SELECT * FROM `T12a` INNER JOIN `T12b` USING (`C1`);
-C1 C1
-é¾” é¾”
+C1
+é¾”
SELECT * FROM `T12a` CROSS JOIN `T12b`;
C1 C1
é¾” é¾”
é¾– é¾”
é¾— é¾”
SELECT * FROM `T12a` LEFT JOIN `T12b` USING (`C1`);
-C1 C1
-é¾” é¾”
-é¾– NULL
-é¾— NULL
+C1
+é¾”
+é¾–
+é¾—
SELECT * FROM `T12a` LEFT JOIN `T12b` ON (`T12a`.`C1` = `T12b`.`C1`);
C1 C1
é¾” é¾”
é¾– NULL
é¾— NULL
SELECT * FROM `T12b` RIGHT JOIN `T12a` USING (`C1`);
-C1 C1
-é¾” é¾”
-NULL é¾–
-NULL é¾—
+C1
+é¾”
+é¾–
+é¾—
SELECT * FROM `T12b` RIGHT JOIN `T12a` ON (`T12a`.`C1` = `T12b`.`C1`);
C1 C1
é¾” é¾”
diff --git a/mysql-test/suite/jp/r/jp_like_sjis.result b/mysql-test/suite/jp/r/jp_like_sjis.result
index a8145fb08f0..3e52781c7bd 100644
--- a/mysql-test/suite/jp/r/jp_like_sjis.result
+++ b/mysql-test/suite/jp/r/jp_like_sjis.result
@@ -24,18 +24,6 @@ CREATE TABLE `‚s‚X` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engi
CREATE TABLE `‚s‚P‚O` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚P` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
SELECT * FROM `‚s‚P` WHERE `‚b‚P` LIKE ' %';
‚b‚P
!"#$%&'()*+,-./
diff --git a/mysql-test/suite/jp/r/jp_like_ujis.result b/mysql-test/suite/jp/r/jp_like_ujis.result
index 5d623df0384..f685d185072 100644
--- a/mysql-test/suite/jp/r/jp_like_ujis.result
+++ b/mysql-test/suite/jp/r/jp_like_ujis.result
@@ -24,18 +24,6 @@ CREATE TABLE `£Ô£¹` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engi
CREATE TABLE `£Ô£±£°` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£±` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£²` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
SELECT * FROM `£Ô£±` WHERE `£Ã£±` LIKE ' %';
£Ã£±
!"#$%&'()*+,-./
diff --git a/mysql-test/suite/jp/r/jp_like_utf8.result b/mysql-test/suite/jp/r/jp_like_utf8.result
index bf48da79951..90b960ca3a7 100644
--- a/mysql-test/suite/jp/r/jp_like_utf8.result
+++ b/mysql-test/suite/jp/r/jp_like_utf8.result
@@ -24,18 +24,6 @@ CREATE TABLE `T9` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf
CREATE TABLE `T1ï¼` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T11` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T12` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
SELECT * FROM `T1` WHERE `C1` LIKE ' %';
C1
!"#$%&'()*+,-./
diff --git a/mysql-test/suite/jp/r/jp_select_sjis.result b/mysql-test/suite/jp/r/jp_select_sjis.result
index d48d08d745f..021b0d29f43 100644
--- a/mysql-test/suite/jp/r/jp_select_sjis.result
+++ b/mysql-test/suite/jp/r/jp_select_sjis.result
@@ -24,18 +24,6 @@ CREATE TABLE `‚s‚X` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engi
CREATE TABLE `‚s‚P‚O` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚P` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
SELECT * FROM `‚s‚P`;
‚b‚P
!"#$%&'()*+,-./
@@ -118,6 +106,7 @@ SELECT * FROM `‚s‚Q`;
êê‘ê’ê“ê”ê•ê–ê—ê˜ê™êšê›êœêêžEEEEE
SELECT * FROM `‚s‚R`;
‚b‚P
+
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
SELECT * FROM `‚s‚S`;
‚b‚P
@@ -201,6 +190,7 @@ SELECT * FROM `‚s‚T`;
êê‘ê’ê“ê”ê•ê–ê—ê˜ê™êšê›êœêêžEEEEE
SELECT * FROM `‚s‚U`;
‚b‚P
+
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
SELECT * FROM `‚s‚V`;
‚b‚P
@@ -285,6 +275,7 @@ SELECT * FROM `‚s‚W`;
SELECT * FROM `‚s‚X`;
‚b‚P
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
+
SELECT * FROM `‚s‚P‚O`;
‚b‚P
!"#$%&'()*+,-./
@@ -368,6 +359,7 @@ SELECT * FROM `‚s‚P‚P`;
SELECT * FROM `‚s‚P‚Q`;
‚b‚P
ƒ\\•\—\\‰\Ž\\“\”\–\˜\‘\’\™\š\›\œ\\ž\
+
drop table `‚s‚P`;
drop table `‚s‚Q`;
drop table `‚s‚R`;
diff --git a/mysql-test/suite/jp/r/jp_select_ujis.result b/mysql-test/suite/jp/r/jp_select_ujis.result
index 3eea73c8083..d70997b0a01 100644
--- a/mysql-test/suite/jp/r/jp_select_ujis.result
+++ b/mysql-test/suite/jp/r/jp_select_ujis.result
@@ -24,18 +24,6 @@ CREATE TABLE `£Ô£¹` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = ujis engine = hea
CREATE TABLE `£Ô£±£°` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£±` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£²` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = ujis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
SELECT * FROM `£Ô£±`;
c1
!"#$%&'()*+,-./
diff --git a/mysql-test/suite/jp/r/jp_select_utf8.result b/mysql-test/suite/jp/r/jp_select_utf8.result
index 43704ad2f6e..8bc61b802be 100644
--- a/mysql-test/suite/jp/r/jp_select_utf8.result
+++ b/mysql-test/suite/jp/r/jp_select_utf8.result
@@ -24,18 +24,6 @@ CREATE TABLE `ï¼´ï¼™` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = utf8 engine = h
CREATE TABLE `T1ï¼` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T11` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T12` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = utf8 engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
SELECT * FROM `T1`;
c1
!"#$%&'()*+,-./
diff --git a/mysql-test/suite/jp/r/jp_where_sjis.result b/mysql-test/suite/jp/r/jp_where_sjis.result
index a3cbc24c113..e8be6e10850 100644
--- a/mysql-test/suite/jp/r/jp_where_sjis.result
+++ b/mysql-test/suite/jp/r/jp_where_sjis.result
@@ -24,18 +24,6 @@ CREATE TABLE `‚s‚X` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engi
CREATE TABLE `‚s‚P‚O` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚P` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
SELECT * FROM `‚s‚P` WHERE `‚b‚P` = '°±²³´µ¶·¸¹º»¼½¾¿';
‚b‚P
°±²³´µ¶·¸¹º»¼½¾¿
diff --git a/mysql-test/suite/jp/r/jp_where_ujis.result b/mysql-test/suite/jp/r/jp_where_ujis.result
index b13b8a10ef8..6b7dc4dde22 100644
--- a/mysql-test/suite/jp/r/jp_where_ujis.result
+++ b/mysql-test/suite/jp/r/jp_where_ujis.result
@@ -24,18 +24,6 @@ CREATE TABLE `£Ô£¹` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engi
CREATE TABLE `£Ô£±£°` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£±` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
CREATE TABLE `£Ô£±£²` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
SELECT * FROM `£Ô£±` WHERE `£Ã£±` = 'Ž°Ž±Ž²Ž³Ž´ŽµŽ¶Ž·Ž¸Ž¹ŽºŽ»Ž¼Ž½Ž¾Ž¿';
£Ã£±
Ž°Ž±Ž²Ž³Ž´ŽµŽ¶Ž·Ž¸Ž¹ŽºŽ»Ž¼Ž½Ž¾Ž¿
diff --git a/mysql-test/suite/jp/r/jp_where_utf8.result b/mysql-test/suite/jp/r/jp_where_utf8.result
index d69aaf8715d..cd7a4c0e500 100644
--- a/mysql-test/suite/jp/r/jp_where_utf8.result
+++ b/mysql-test/suite/jp/r/jp_where_utf8.result
@@ -24,18 +24,6 @@ CREATE TABLE `T9` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf
CREATE TABLE `T1ï¼` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T11` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
CREATE TABLE `T12` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET = utf8 engine = bdb;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
SELECT * FROM `T1` WHERE `C1` = 'ーアイウエオカキクケコサシスセソ';
C1
ーアイウエオカキクケコサシスセソ
diff --git a/mysql-test/suite/jp/t/jp_alter_sjis.test b/mysql-test/suite/jp/t/jp_alter_sjis.test
index b7b31862599..f250afcf5dd 100644
--- a/mysql-test/suite/jp/t/jp_alter_sjis.test
+++ b/mysql-test/suite/jp/t/jp_alter_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
SET NAMES sjis;
SET character_set_database = sjis;
diff --git a/mysql-test/suite/jp/t/jp_alter_ucs2.test b/mysql-test/suite/jp/t/jp_alter_ucs2.test
index 6c5b3132edf..27cf5b72839 100644
--- a/mysql-test/suite/jp/t/jp_alter_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_alter_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_alter_ujis.test b/mysql-test/suite/jp/t/jp_alter_ujis.test
index d388d20c49b..b817f608446 100644
--- a/mysql-test/suite/jp/t/jp_alter_ujis.test
+++ b/mysql-test/suite/jp/t/jp_alter_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_alter_utf8.test b/mysql-test/suite/jp/t/jp_alter_utf8.test
index 6771343f38f..60a67485ba5 100644
--- a/mysql-test/suite/jp/t/jp_alter_utf8.test
+++ b/mysql-test/suite/jp/t/jp_alter_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
DROP TABLE IF EXISTS `アアア`;
DROP TABLE IF EXISTS `イイイ`;
diff --git a/mysql-test/suite/jp/t/jp_charlength_sjis.test b/mysql-test/suite/jp/t/jp_charlength_sjis.test
index 5f3543bb7a6..350605450da 100644
--- a/mysql-test/suite/jp/t/jp_charlength_sjis.test
+++ b/mysql-test/suite/jp/t/jp_charlength_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_charlength_ucs2.test b/mysql-test/suite/jp/t/jp_charlength_ucs2.test
index 2db9db7cfc6..714ced47ff8 100644
--- a/mysql-test/suite/jp/t/jp_charlength_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_charlength_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_charlength_ujis.test b/mysql-test/suite/jp/t/jp_charlength_ujis.test
index 08973231f27..923bffef540 100644
--- a/mysql-test/suite/jp/t/jp_charlength_ujis.test
+++ b/mysql-test/suite/jp/t/jp_charlength_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_charlength_utf8.test b/mysql-test/suite/jp/t/jp_charlength_utf8.test
index a3f74db27ee..bc099caf74a 100644
--- a/mysql-test/suite/jp/t/jp_charlength_utf8.test
+++ b/mysql-test/suite/jp/t/jp_charlength_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_charset_sjis.test b/mysql-test/suite/jp/t/jp_charset_sjis.test
index 3a9f264bdfe..26a56fb61d6 100644
--- a/mysql-test/suite/jp/t/jp_charset_sjis.test
+++ b/mysql-test/suite/jp/t/jp_charset_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
@@ -38,18 +40,20 @@ CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20)) DEFAULT CHARSET = sjis engine = bdb;
# jisx0201 hankaku-katakana data
# jisx0208 data
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--disable_query_log
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--enable_query_log
#InnoDB
SELECT DISTINCT CHARSET(`‚b‚P`) FROM `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_charset_ucs2.test b/mysql-test/suite/jp/t/jp_charset_ucs2.test
index 5183071033b..f7971095fa6 100644
--- a/mysql-test/suite/jp/t/jp_charset_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_charset_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_charset_ujis.test b/mysql-test/suite/jp/t/jp_charset_ujis.test
index de9ef318530..6308c7124ee 100644
--- a/mysql-test/suite/jp/t/jp_charset_ujis.test
+++ b/mysql-test/suite/jp/t/jp_charset_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
@@ -40,18 +42,20 @@ CREATE TABLE `£Ô£±£²` (`£Ã£±` char(20)) DEFAULT CHARSET = ujis engine = bdb;
# jisx0208 data
# jisx0212 supplemental character data
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--disable_query_log
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--enable_query_log
#InnoDB
SELECT DISTINCT CHARSET(`£Ã£±`) FROM `£Ô£±`;
diff --git a/mysql-test/suite/jp/t/jp_charset_utf8.test b/mysql-test/suite/jp/t/jp_charset_utf8.test
index 2d73daba42a..dcce0477204 100644
--- a/mysql-test/suite/jp/t/jp_charset_utf8.test
+++ b/mysql-test/suite/jp/t/jp_charset_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
@@ -38,18 +40,20 @@ CREATE TABLE `T12` (`C1` char(20)) DEFAULT CHARSET = utf8 engine = bdb
# jisx0208 data
# jisx0212 supplemental character data
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--disable_query_log
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--enable_query_log
#InnoDB
SELECT DISTINCT CHARSET(`C1`) FROM `T1`;
diff --git a/mysql-test/suite/jp/t/jp_convert_sjis.test b/mysql-test/suite/jp/t/jp_convert_sjis.test
index 93fa33029bf..4e76b414442 100644
--- a/mysql-test/suite/jp/t/jp_convert_sjis.test
+++ b/mysql-test/suite/jp/t/jp_convert_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
SET NAMES sjis;
SET character_set_database = sjis;
@@ -39,18 +41,20 @@ CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis en
# jisx0208 data
# jisx0212 supplemental character data
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--disable_query_log
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
+ --eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--enable_query_log
#InnoDB
SELECT `‚b‚P`, CONVERT(`‚b‚P` using utf8) FROM `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_convert_ucs2.test b/mysql-test/suite/jp/t/jp_convert_ucs2.test
index 88b0d0c9cba..3ed4efe158d 100644
--- a/mysql-test/suite/jp/t/jp_convert_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_convert_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_convert_ujis.test b/mysql-test/suite/jp/t/jp_convert_ujis.test
index d6303b66f34..7d53d1853d3 100644
--- a/mysql-test/suite/jp/t/jp_convert_ujis.test
+++ b/mysql-test/suite/jp/t/jp_convert_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
@@ -40,18 +42,20 @@ CREATE TABLE `£Ô£±£²` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis en
# jisx0208 data
# jisx0212 supplemental character data
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--enable_query_log
#InnoDB
SELECT `£Ã£±`, CONVERT(`£Ã£±` using utf8) FROM `£Ô£±`;
diff --git a/mysql-test/suite/jp/t/jp_convert_utf8.test b/mysql-test/suite/jp/t/jp_convert_utf8.test
index a687b0f06cb..3d81704e87c 100644
--- a/mysql-test/suite/jp/t/jp_convert_utf8.test
+++ b/mysql-test/suite/jp/t/jp_convert_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
@@ -38,18 +40,20 @@ CREATE TABLE `T12` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET =
# jisx0208 data
# jisx0212 supplemental character data
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
- LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--enable_query_log
#InnoDB
SELECT `C1`, CONVERT(`C1` using ujis) FROM `T1`;
diff --git a/mysql-test/suite/jp/t/jp_create_tbl_sjis.test b/mysql-test/suite/jp/t/jp_create_tbl_sjis.test
index 45c0b24388b..93f3ac3c4a3 100644
--- a/mysql-test/suite/jp/t/jp_create_tbl_sjis.test
+++ b/mysql-test/suite/jp/t/jp_create_tbl_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
SET NAMES sjis;
SET character_set_database = sjis;
diff --git a/mysql-test/suite/jp/t/jp_create_tbl_ucs2.test b/mysql-test/suite/jp/t/jp_create_tbl_ucs2.test
index 519697e3530..553ef8a4dad 100644
--- a/mysql-test/suite/jp/t/jp_create_tbl_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_create_tbl_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_create_tbl_ujis.test b/mysql-test/suite/jp/t/jp_create_tbl_ujis.test
index ac70facdce9..1106ddc1417 100644
--- a/mysql-test/suite/jp/t/jp_create_tbl_ujis.test
+++ b/mysql-test/suite/jp/t/jp_create_tbl_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_create_tbl_utf8.test b/mysql-test/suite/jp/t/jp_create_tbl_utf8.test
index 5c816eb169a..9b0ece77e34 100644
--- a/mysql-test/suite/jp/t/jp_create_tbl_utf8.test
+++ b/mysql-test/suite/jp/t/jp_create_tbl_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
DROP TABLE IF EXISTS `アアア`;
DROP TABLE IF EXISTS `イイイ`;
diff --git a/mysql-test/suite/jp/t/jp_enum_sjis.test b/mysql-test/suite/jp/t/jp_enum_sjis.test
index 2ea1bf320e0..c433e0bcac4 100644
--- a/mysql-test/suite/jp/t/jp_enum_sjis.test
+++ b/mysql-test/suite/jp/t/jp_enum_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_enum_ucs2.test b/mysql-test/suite/jp/t/jp_enum_ucs2.test
index 2239ebab478..79f5952cf97 100644
--- a/mysql-test/suite/jp/t/jp_enum_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_enum_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
# half-with kana is not handled correctly in 4.1
diff --git a/mysql-test/suite/jp/t/jp_enum_ujis.test b/mysql-test/suite/jp/t/jp_enum_ujis.test
index da41165aad0..f48d176ec6b 100644
--- a/mysql-test/suite/jp/t/jp_enum_ujis.test
+++ b/mysql-test/suite/jp/t/jp_enum_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_enum_utf8.test b/mysql-test/suite/jp/t/jp_enum_utf8.test
index 4ce3576b604..64fe2129164 100644
--- a/mysql-test/suite/jp/t/jp_enum_utf8.test
+++ b/mysql-test/suite/jp/t/jp_enum_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_insert_sjis.test b/mysql-test/suite/jp/t/jp_insert_sjis.test
index 0266ad1eaca..a940eeb5782 100644
--- a/mysql-test/suite/jp/t/jp_insert_sjis.test
+++ b/mysql-test/suite/jp/t/jp_insert_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_insert_ucs2.test b/mysql-test/suite/jp/t/jp_insert_ucs2.test
index 9b0a02e57d8..443f6f1107b 100644
--- a/mysql-test/suite/jp/t/jp_insert_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_insert_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_insert_ujis.test b/mysql-test/suite/jp/t/jp_insert_ujis.test
index 7b6d2838386..ab82db59326 100644
--- a/mysql-test/suite/jp/t/jp_insert_ujis.test
+++ b/mysql-test/suite/jp/t/jp_insert_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_insert_utf8.test b/mysql-test/suite/jp/t/jp_insert_utf8.test
index ef6acb90063..e8c41bab4ea 100644
--- a/mysql-test/suite/jp/t/jp_insert_utf8.test
+++ b/mysql-test/suite/jp/t/jp_insert_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_instr_sjis.test b/mysql-test/suite/jp/t/jp_instr_sjis.test
index c19b5f2b14c..83480ea0267 100644
--- a/mysql-test/suite/jp/t/jp_instr_sjis.test
+++ b/mysql-test/suite/jp/t/jp_instr_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_instr_ucs2.test b/mysql-test/suite/jp/t/jp_instr_ucs2.test
index b8f83961e90..7b442d09a3d 100644
--- a/mysql-test/suite/jp/t/jp_instr_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_instr_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_instr_ujis.test b/mysql-test/suite/jp/t/jp_instr_ujis.test
index 696e1147372..d0373ba73ce 100644
--- a/mysql-test/suite/jp/t/jp_instr_ujis.test
+++ b/mysql-test/suite/jp/t/jp_instr_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_instr_utf8.test b/mysql-test/suite/jp/t/jp_instr_utf8.test
index b25b72bc8d0..c7491101872 100644
--- a/mysql-test/suite/jp/t/jp_instr_utf8.test
+++ b/mysql-test/suite/jp/t/jp_instr_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_join_sjis.test b/mysql-test/suite/jp/t/jp_join_sjis.test
index 30b23913929..77d1dc15c5c 100644
--- a/mysql-test/suite/jp/t/jp_join_sjis.test
+++ b/mysql-test/suite/jp/t/jp_join_sjis.test
@@ -1,3 +1,4 @@
+-- source include/have_innodb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_join_ucs2.test b/mysql-test/suite/jp/t/jp_join_ucs2.test
index 27e49203dd2..276af80f7af 100644
--- a/mysql-test/suite/jp/t/jp_join_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_join_ucs2.test
@@ -1,3 +1,4 @@
+-- source include/have_innodb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_join_ujis.test b/mysql-test/suite/jp/t/jp_join_ujis.test
index 079f260cc26..5716ee12e60 100644
--- a/mysql-test/suite/jp/t/jp_join_ujis.test
+++ b/mysql-test/suite/jp/t/jp_join_ujis.test
@@ -1,3 +1,4 @@
+-- source include/have_innodb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_join_utf8.test b/mysql-test/suite/jp/t/jp_join_utf8.test
index 0b2f033f8bb..36f8e930bc3 100644
--- a/mysql-test/suite/jp/t/jp_join_utf8.test
+++ b/mysql-test/suite/jp/t/jp_join_utf8.test
@@ -1,3 +1,4 @@
+-- source include/have_innodb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_left_sjis.test b/mysql-test/suite/jp/t/jp_left_sjis.test
index 5d69d9892e2..e93e92493a1 100644
--- a/mysql-test/suite/jp/t/jp_left_sjis.test
+++ b/mysql-test/suite/jp/t/jp_left_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_left_ucs2.test b/mysql-test/suite/jp/t/jp_left_ucs2.test
index 59d10b7d736..2c1be4a7e6a 100644
--- a/mysql-test/suite/jp/t/jp_left_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_left_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_left_ujis.test b/mysql-test/suite/jp/t/jp_left_ujis.test
index 718639cd8a4..f639bf643df 100644
--- a/mysql-test/suite/jp/t/jp_left_ujis.test
+++ b/mysql-test/suite/jp/t/jp_left_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_left_utf8.test b/mysql-test/suite/jp/t/jp_left_utf8.test
index f9c99718e0f..63d9061a879 100644
--- a/mysql-test/suite/jp/t/jp_left_utf8.test
+++ b/mysql-test/suite/jp/t/jp_left_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_length_sjis.test b/mysql-test/suite/jp/t/jp_length_sjis.test
index 7023891b7f0..81121a4432e 100644
--- a/mysql-test/suite/jp/t/jp_length_sjis.test
+++ b/mysql-test/suite/jp/t/jp_length_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_length_ucs2.test b/mysql-test/suite/jp/t/jp_length_ucs2.test
index 9951c9b6cd1..1dcc975d868 100644
--- a/mysql-test/suite/jp/t/jp_length_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_length_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_length_ujis.test b/mysql-test/suite/jp/t/jp_length_ujis.test
index ac3aef2c768..ad41c7a7113 100644
--- a/mysql-test/suite/jp/t/jp_length_ujis.test
+++ b/mysql-test/suite/jp/t/jp_length_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_length_utf8.test b/mysql-test/suite/jp/t/jp_length_utf8.test
index 5c5021f37be..7bfe1896034 100644
--- a/mysql-test/suite/jp/t/jp_length_utf8.test
+++ b/mysql-test/suite/jp/t/jp_length_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_like_sjis.test b/mysql-test/suite/jp/t/jp_like_sjis.test
index 5c41b9ff7ef..ad2c5f7b465 100644
--- a/mysql-test/suite/jp/t/jp_like_sjis.test
+++ b/mysql-test/suite/jp/t/jp_like_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
@@ -38,18 +40,20 @@ CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis en
# jisx0201 hankaku-katakana data
# jisx0208 data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--enable_query_log
#InnoDB
SELECT * FROM `‚s‚P` WHERE `‚b‚P` LIKE ' %';
diff --git a/mysql-test/suite/jp/t/jp_like_ucs2.test b/mysql-test/suite/jp/t/jp_like_ucs2.test
index feae40de49e..1f9b7c09b9d 100644
--- a/mysql-test/suite/jp/t/jp_like_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_like_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_like_ujis.test b/mysql-test/suite/jp/t/jp_like_ujis.test
index 29ef7c5d48b..c3660e8f88f 100644
--- a/mysql-test/suite/jp/t/jp_like_ujis.test
+++ b/mysql-test/suite/jp/t/jp_like_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
@@ -40,18 +42,20 @@ CREATE TABLE `£Ô£±£²` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis en
# jisx0208 data
# jisx0212 supplemental character data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--enable_query_log
#InnoDB
SELECT * FROM `£Ô£±` WHERE `£Ã£±` LIKE ' %';
diff --git a/mysql-test/suite/jp/t/jp_like_utf8.test b/mysql-test/suite/jp/t/jp_like_utf8.test
index 4247242029d..57fc1584471 100644
--- a/mysql-test/suite/jp/t/jp_like_utf8.test
+++ b/mysql-test/suite/jp/t/jp_like_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
@@ -38,18 +40,20 @@ CREATE TABLE `T12` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET =
# jisx0208 data
# jisx0212 supplemental character data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--enable_query_log
#InnoDB
SELECT * FROM `T1` WHERE `C1` LIKE ' %';
diff --git a/mysql-test/suite/jp/t/jp_locate_sjis.test b/mysql-test/suite/jp/t/jp_locate_sjis.test
index 92c671199b6..a015109e2a3 100644
--- a/mysql-test/suite/jp/t/jp_locate_sjis.test
+++ b/mysql-test/suite/jp/t/jp_locate_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_locate_ucs2.test b/mysql-test/suite/jp/t/jp_locate_ucs2.test
index d00ad67235a..111caefb02e 100644
--- a/mysql-test/suite/jp/t/jp_locate_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_locate_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_locate_ujis.test b/mysql-test/suite/jp/t/jp_locate_ujis.test
index 5375fad75db..872555a4532 100644
--- a/mysql-test/suite/jp/t/jp_locate_ujis.test
+++ b/mysql-test/suite/jp/t/jp_locate_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_locate_utf8.test b/mysql-test/suite/jp/t/jp_locate_utf8.test
index cbf6714e322..85d2e69fd60 100644
--- a/mysql-test/suite/jp/t/jp_locate_utf8.test
+++ b/mysql-test/suite/jp/t/jp_locate_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_lpad_sjis.test b/mysql-test/suite/jp/t/jp_lpad_sjis.test
index 7038112cbc8..4b18402473d 100644
--- a/mysql-test/suite/jp/t/jp_lpad_sjis.test
+++ b/mysql-test/suite/jp/t/jp_lpad_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_lpad_ucs2.test b/mysql-test/suite/jp/t/jp_lpad_ucs2.test
index e3bead0855a..95dd088abce 100644
--- a/mysql-test/suite/jp/t/jp_lpad_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_lpad_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_lpad_ujis.test b/mysql-test/suite/jp/t/jp_lpad_ujis.test
index eea4877ec3a..c1149a67207 100644
--- a/mysql-test/suite/jp/t/jp_lpad_ujis.test
+++ b/mysql-test/suite/jp/t/jp_lpad_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_lpad_utf8.test b/mysql-test/suite/jp/t/jp_lpad_utf8.test
index 599bf5eba28..42aa2fd860b 100644
--- a/mysql-test/suite/jp/t/jp_lpad_utf8.test
+++ b/mysql-test/suite/jp/t/jp_lpad_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_ltrim_sjis.test b/mysql-test/suite/jp/t/jp_ltrim_sjis.test
index 864238df07c..7b5e20ec9a4 100644
--- a/mysql-test/suite/jp/t/jp_ltrim_sjis.test
+++ b/mysql-test/suite/jp/t/jp_ltrim_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_ltrim_ucs2.test b/mysql-test/suite/jp/t/jp_ltrim_ucs2.test
index 0ae647f5222..25a6eaabc60 100644
--- a/mysql-test/suite/jp/t/jp_ltrim_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_ltrim_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_ltrim_ujis.test b/mysql-test/suite/jp/t/jp_ltrim_ujis.test
index 64363aa330b..fbba90a38b5 100644
--- a/mysql-test/suite/jp/t/jp_ltrim_ujis.test
+++ b/mysql-test/suite/jp/t/jp_ltrim_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_ltrim_utf8.test b/mysql-test/suite/jp/t/jp_ltrim_utf8.test
index 846ce11163b..b33d22e459d 100644
--- a/mysql-test/suite/jp/t/jp_ltrim_utf8.test
+++ b/mysql-test/suite/jp/t/jp_ltrim_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_ps_sjis.test b/mysql-test/suite/jp/t/jp_ps_sjis.test
index cc93dca2a79..2e09c51cf7a 100644
--- a/mysql-test/suite/jp/t/jp_ps_sjis.test
+++ b/mysql-test/suite/jp/t/jp_ps_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
DROP TABLE IF EXISTS t1;
diff --git a/mysql-test/suite/jp/t/jp_ps_ujis.test b/mysql-test/suite/jp/t/jp_ps_ujis.test
index 7d61c12e496..ab64fcf5216 100644
--- a/mysql-test/suite/jp/t/jp_ps_ujis.test
+++ b/mysql-test/suite/jp/t/jp_ps_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_replace_sjis.test b/mysql-test/suite/jp/t/jp_replace_sjis.test
index 811d3350a34..91996ba83e9 100644
--- a/mysql-test/suite/jp/t/jp_replace_sjis.test
+++ b/mysql-test/suite/jp/t/jp_replace_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_replace_ucs2.test b/mysql-test/suite/jp/t/jp_replace_ucs2.test
index 7739a30cd9c..3043115ef62 100644
--- a/mysql-test/suite/jp/t/jp_replace_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_replace_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_replace_ujis.test b/mysql-test/suite/jp/t/jp_replace_ujis.test
index 3d8724e63d5..1ba29426010 100644
--- a/mysql-test/suite/jp/t/jp_replace_ujis.test
+++ b/mysql-test/suite/jp/t/jp_replace_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_replace_utf8.test b/mysql-test/suite/jp/t/jp_replace_utf8.test
index 1d89a43648b..81b892a5df7 100644
--- a/mysql-test/suite/jp/t/jp_replace_utf8.test
+++ b/mysql-test/suite/jp/t/jp_replace_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_reverse_sjis.test b/mysql-test/suite/jp/t/jp_reverse_sjis.test
index c1e2b2a17ca..5d9014dc3a6 100644
--- a/mysql-test/suite/jp/t/jp_reverse_sjis.test
+++ b/mysql-test/suite/jp/t/jp_reverse_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_reverse_ucs2.test b/mysql-test/suite/jp/t/jp_reverse_ucs2.test
index d91ec7f70e8..95afeeda570 100644
--- a/mysql-test/suite/jp/t/jp_reverse_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_reverse_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_reverse_ujis.test b/mysql-test/suite/jp/t/jp_reverse_ujis.test
index d37d363f59a..0d66201c367 100644
--- a/mysql-test/suite/jp/t/jp_reverse_ujis.test
+++ b/mysql-test/suite/jp/t/jp_reverse_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_reverse_utf8.test b/mysql-test/suite/jp/t/jp_reverse_utf8.test
index 4e53d4be049..ee323b64ada 100644
--- a/mysql-test/suite/jp/t/jp_reverse_utf8.test
+++ b/mysql-test/suite/jp/t/jp_reverse_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_right_sjis.test b/mysql-test/suite/jp/t/jp_right_sjis.test
index f481ec532ec..edf3795c510 100644
--- a/mysql-test/suite/jp/t/jp_right_sjis.test
+++ b/mysql-test/suite/jp/t/jp_right_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_right_ucs2.test b/mysql-test/suite/jp/t/jp_right_ucs2.test
index 23ca2fa4fae..d3132b3e11f 100644
--- a/mysql-test/suite/jp/t/jp_right_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_right_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_right_ujis.test b/mysql-test/suite/jp/t/jp_right_ujis.test
index b5284489c7e..92cd7ed83dc 100644
--- a/mysql-test/suite/jp/t/jp_right_ujis.test
+++ b/mysql-test/suite/jp/t/jp_right_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_right_utf8.test b/mysql-test/suite/jp/t/jp_right_utf8.test
index 863755c1dcf..6d884e55771 100644
--- a/mysql-test/suite/jp/t/jp_right_utf8.test
+++ b/mysql-test/suite/jp/t/jp_right_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_rpad_sjis.test b/mysql-test/suite/jp/t/jp_rpad_sjis.test
index cc008631548..1bf752020bb 100644
--- a/mysql-test/suite/jp/t/jp_rpad_sjis.test
+++ b/mysql-test/suite/jp/t/jp_rpad_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_rpad_ucs2.test b/mysql-test/suite/jp/t/jp_rpad_ucs2.test
index ca5059497d3..f3876dafe2f 100644
--- a/mysql-test/suite/jp/t/jp_rpad_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_rpad_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_rpad_ujis.test b/mysql-test/suite/jp/t/jp_rpad_ujis.test
index d7725b80af7..6ace7442b8d 100644
--- a/mysql-test/suite/jp/t/jp_rpad_ujis.test
+++ b/mysql-test/suite/jp/t/jp_rpad_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_rpad_utf8.test b/mysql-test/suite/jp/t/jp_rpad_utf8.test
index b5a335bc6ce..6c075e20cb9 100644
--- a/mysql-test/suite/jp/t/jp_rpad_utf8.test
+++ b/mysql-test/suite/jp/t/jp_rpad_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_rtrim_sjis.test b/mysql-test/suite/jp/t/jp_rtrim_sjis.test
index c80cf9410f9..1a9511698ce 100644
--- a/mysql-test/suite/jp/t/jp_rtrim_sjis.test
+++ b/mysql-test/suite/jp/t/jp_rtrim_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_rtrim_ucs2.test b/mysql-test/suite/jp/t/jp_rtrim_ucs2.test
index 0fac38d12d1..2132eaa5cbe 100644
--- a/mysql-test/suite/jp/t/jp_rtrim_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_rtrim_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_rtrim_ujis.test b/mysql-test/suite/jp/t/jp_rtrim_ujis.test
index 46cda84dd55..07b42b96dfd 100644
--- a/mysql-test/suite/jp/t/jp_rtrim_ujis.test
+++ b/mysql-test/suite/jp/t/jp_rtrim_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_rtrim_utf8.test b/mysql-test/suite/jp/t/jp_rtrim_utf8.test
index 4880a42db3e..48f863d891c 100644
--- a/mysql-test/suite/jp/t/jp_rtrim_utf8.test
+++ b/mysql-test/suite/jp/t/jp_rtrim_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_select_sjis.test b/mysql-test/suite/jp/t/jp_select_sjis.test
index d84ed7a4b2c..698d87a6852 100644
--- a/mysql-test/suite/jp/t/jp_select_sjis.test
+++ b/mysql-test/suite/jp/t/jp_select_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
@@ -39,18 +41,20 @@ CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis en
# jisx0208 data
# jisx0212 supplemental character data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--enable_query_log
#InnoDB
SELECT * FROM `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_select_ucs2.test b/mysql-test/suite/jp/t/jp_select_ucs2.test
index 2e4602e7ea4..6cebdb65db1 100644
--- a/mysql-test/suite/jp/t/jp_select_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_select_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_select_ujis.test b/mysql-test/suite/jp/t/jp_select_ujis.test
index 4ad9e581a92..7c8ec46d06e 100644
--- a/mysql-test/suite/jp/t/jp_select_ujis.test
+++ b/mysql-test/suite/jp/t/jp_select_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
@@ -40,18 +42,20 @@ CREATE TABLE `£Ô£±£²` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = ujis engine = b
# jisx0208 data
# jisx0212 supplemental character data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--enable_query_log
#InnoDB
SELECT * FROM `£Ô£±`;
diff --git a/mysql-test/suite/jp/t/jp_select_utf8.test b/mysql-test/suite/jp/t/jp_select_utf8.test
index e614b9ccfb0..f410333fcfa 100644
--- a/mysql-test/suite/jp/t/jp_select_utf8.test
+++ b/mysql-test/suite/jp/t/jp_select_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
@@ -38,18 +40,20 @@ CREATE TABLE `T12` (c1 char(20), INDEX(c1)) DEFAULT CHARSET = utf8 engine
# jisx0208 data
# jisx0212 supplemental character data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--enable_query_log
#InnoDB
SELECT * FROM `T1`;
diff --git a/mysql-test/suite/jp/t/jp_subquery_sjis.test b/mysql-test/suite/jp/t/jp_subquery_sjis.test
index 5292c7a2519..b6aa3e52f51 100644
--- a/mysql-test/suite/jp/t/jp_subquery_sjis.test
+++ b/mysql-test/suite/jp/t/jp_subquery_sjis.test
@@ -1,3 +1,4 @@
+-- source include/have_innodb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_subquery_ucs2.test b/mysql-test/suite/jp/t/jp_subquery_ucs2.test
index 311433438f4..d2c1fd29358 100644
--- a/mysql-test/suite/jp/t/jp_subquery_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_subquery_ucs2.test
@@ -1,3 +1,4 @@
+-- source include/have_innodb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_subquery_ujis.test b/mysql-test/suite/jp/t/jp_subquery_ujis.test
index 67c9f00fd85..2fd0427481c 100644
--- a/mysql-test/suite/jp/t/jp_subquery_ujis.test
+++ b/mysql-test/suite/jp/t/jp_subquery_ujis.test
@@ -1,3 +1,4 @@
+-- source include/have_innodb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_subquery_utf8.test b/mysql-test/suite/jp/t/jp_subquery_utf8.test
index 97c2df8ce30..460f1c1a903 100644
--- a/mysql-test/suite/jp/t/jp_subquery_utf8.test
+++ b/mysql-test/suite/jp/t/jp_subquery_utf8.test
@@ -1,3 +1,4 @@
+-- source include/have_innodb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_substring_sjis.test b/mysql-test/suite/jp/t/jp_substring_sjis.test
index ac929114880..a6c9496a873 100644
--- a/mysql-test/suite/jp/t/jp_substring_sjis.test
+++ b/mysql-test/suite/jp/t/jp_substring_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_substring_ucs2.test b/mysql-test/suite/jp/t/jp_substring_ucs2.test
index f3cd5550072..71c0f903aa8 100644
--- a/mysql-test/suite/jp/t/jp_substring_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_substring_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_substring_ujis.test b/mysql-test/suite/jp/t/jp_substring_ujis.test
index c201c7148da..c93ab761352 100644
--- a/mysql-test/suite/jp/t/jp_substring_ujis.test
+++ b/mysql-test/suite/jp/t/jp_substring_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_substring_utf8.test b/mysql-test/suite/jp/t/jp_substring_utf8.test
index 9f88115c899..3bd1bbbb491 100644
--- a/mysql-test/suite/jp/t/jp_substring_utf8.test
+++ b/mysql-test/suite/jp/t/jp_substring_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_trim_sjis.test b/mysql-test/suite/jp/t/jp_trim_sjis.test
index 0f6821605ed..04dc832d49f 100644
--- a/mysql-test/suite/jp/t/jp_trim_sjis.test
+++ b/mysql-test/suite/jp/t/jp_trim_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_trim_ucs2.test b/mysql-test/suite/jp/t/jp_trim_ucs2.test
index 1d8a12650e0..7c82c249dcc 100644
--- a/mysql-test/suite/jp/t/jp_trim_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_trim_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_trim_ujis.test b/mysql-test/suite/jp/t/jp_trim_ujis.test
index de401217fcf..bcd9942f0ae 100644
--- a/mysql-test/suite/jp/t/jp_trim_ujis.test
+++ b/mysql-test/suite/jp/t/jp_trim_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_trim_utf8.test b/mysql-test/suite/jp/t/jp_trim_utf8.test
index 0777de15c36..f6f487254bc 100644
--- a/mysql-test/suite/jp/t/jp_trim_utf8.test
+++ b/mysql-test/suite/jp/t/jp_trim_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_union_ujis.test b/mysql-test/suite/jp/t/jp_union_ujis.test
index e36d18c85c0..c1252b9f5a2 100644
--- a/mysql-test/suite/jp/t/jp_union_ujis.test
+++ b/mysql-test/suite/jp/t/jp_union_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_update_sjis.test b/mysql-test/suite/jp/t/jp_update_sjis.test
index 0dc7372ae92..4b3733cff76 100644
--- a/mysql-test/suite/jp/t/jp_update_sjis.test
+++ b/mysql-test/suite/jp/t/jp_update_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
diff --git a/mysql-test/suite/jp/t/jp_update_ucs2.test b/mysql-test/suite/jp/t/jp_update_ucs2.test
index 7a3c1233210..6ad7db9c5a0 100644
--- a/mysql-test/suite/jp/t/jp_update_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_update_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_update_ujis.test b/mysql-test/suite/jp/t/jp_update_ujis.test
index 852e45b9eeb..14ca6580f04 100644
--- a/mysql-test/suite/jp/t/jp_update_ujis.test
+++ b/mysql-test/suite/jp/t/jp_update_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_update_utf8.test b/mysql-test/suite/jp/t/jp_update_utf8.test
index b4b3d18ecab..135f6e6981c 100644
--- a/mysql-test/suite/jp/t/jp_update_utf8.test
+++ b/mysql-test/suite/jp/t/jp_update_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
diff --git a/mysql-test/suite/jp/t/jp_where_sjis.test b/mysql-test/suite/jp/t/jp_where_sjis.test
index 452d137f643..6fda91a7b4b 100644
--- a/mysql-test/suite/jp/t/jp_where_sjis.test
+++ b/mysql-test/suite/jp/t/jp_where_sjis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--character_set sjis
--disable_warnings
drop table if exists `‚s‚P`;
@@ -39,18 +41,20 @@ CREATE TABLE `‚s‚P‚Q` (`‚b‚P` char(20), INDEX(`‚b‚P`)) DEFAULT CHARSET = sjis en
# jisx0208 data
# jisx0212 supplemental character data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚Q`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚R`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚S`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚T`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚U`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚V`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚W`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚X`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_sjis.dat' INTO TABLE `‚s‚P‚O`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis.dat' INTO TABLE `‚s‚P‚P`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_sjis2.dat' INTO TABLE `‚s‚P‚Q`;
+--enable_query_log
#InnoDB
SELECT * FROM `‚s‚P` WHERE `‚b‚P` = '°±²³´µ¶·¸¹º»¼½¾¿';
diff --git a/mysql-test/suite/jp/t/jp_where_ucs2.test b/mysql-test/suite/jp/t/jp_where_ucs2.test
index 3b82eacd615..7d90faaaa89 100644
--- a/mysql-test/suite/jp/t/jp_where_ucs2.test
+++ b/mysql-test/suite/jp/t/jp_where_ucs2.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ucs2.inc
--disable_warnings
diff --git a/mysql-test/suite/jp/t/jp_where_ujis.test b/mysql-test/suite/jp/t/jp_where_ujis.test
index e96404fbb17..6343610306e 100644
--- a/mysql-test/suite/jp/t/jp_where_ujis.test
+++ b/mysql-test/suite/jp/t/jp_where_ujis.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--source include/have_ujis.inc
--disable_warnings
@@ -40,18 +42,20 @@ CREATE TABLE `£Ô£±£²` (`£Ã£±` char(20), INDEX(`£Ã£±`)) DEFAULT CHARSET = ujis en
# jisx0208 data
# jisx0212 supplemental character data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£²`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£³`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£´`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£µ`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¶`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£·`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£¸`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£¹`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_ujis.dat' INTO TABLE `£Ô£±£°`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_ujis.dat' INTO TABLE `£Ô£±£±`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_ujis.dat' INTO TABLE `£Ô£±£²`;
+--enable_query_log
#InnoDB
SELECT * FROM `£Ô£±` WHERE `£Ã£±` = 'Ž°Ž±Ž²Ž³Ž´ŽµŽ¶Ž·Ž¸Ž¹ŽºŽ»Ž¼Ž½Ž¾Ž¿';
diff --git a/mysql-test/suite/jp/t/jp_where_utf8.test b/mysql-test/suite/jp/t/jp_where_utf8.test
index 7280bc33f21..a37b6f1a41a 100644
--- a/mysql-test/suite/jp/t/jp_where_utf8.test
+++ b/mysql-test/suite/jp/t/jp_where_utf8.test
@@ -1,3 +1,5 @@
+-- source include/have_innodb.inc
+-- source include/have_bdb.inc
--disable_warnings
drop table if exists `T1`;
drop table if exists `ï¼´ï¼’`;
@@ -38,18 +40,20 @@ CREATE TABLE `T12` (`C1` char(20), INDEX(`C1`)) DEFAULT CHARSET =
# jisx0208 data
# jisx0212 supplemental character data
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
-LOAD DATA LOCAL INFILE 'suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--disable_query_log
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `ï¼´ï¼’`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T3`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼”`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T5`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼–`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `ï¼´ï¼—`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T8`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `ï¼´ï¼™`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0201_utf8.dat' INTO TABLE `T1ï¼`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0208_utf8.dat' INTO TABLE `T11`;
+--eval LOAD DATA LOCAL INFILE '$MYSQL_TEST_DIR/suite/jp/std_data/jisx0212_utf8.dat' INTO TABLE `T12`;
+--enable_query_log
#InnoDB
SELECT * FROM `T1` WHERE `C1` = 'ーアイウエオカキクケコサシスセソ';
diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test
index 4b0f91e4408..e396fbcebd8 100644
--- a/mysql-test/t/func_str.test
+++ b/mysql-test/t/func_str.test
@@ -1177,5 +1177,18 @@ INSERT INTO t1 VALUES ('aaaaaaaa');
SELECT LOAD_FILE(a) FROM t1;
DROP TABLE t1;
+#
+# Bug#46815 CONCAT_WS returning wrong data
+#
+CREATE TABLE t1 (f2 VARCHAR(20));
+CREATE TABLE t2 (f2 VARCHAR(20));
+
+INSERT INTO t1 VALUES ('MIN'),('MAX');
+INSERT INTO t2 VALUES ('LOAD');
+
+SELECT CONCAT_WS('_', (SELECT t2.f2 FROM t2), t1.f2) AS concat_name FROM t1;
+
+DROP TABLE t1, t2;
+
--echo End of 5.0 tests
diff --git a/mysql-test/t/subselect4.test b/mysql-test/t/subselect4.test
new file mode 100644
index 00000000000..440eca22828
--- /dev/null
+++ b/mysql-test/t/subselect4.test
@@ -0,0 +1,64 @@
+# General purpose bug fix tests go here : subselect.test too large
+
+
+--echo #
+--echo # Bug #46791: Assertion failed:(table->key_read==0),function unknown
+--echo # function,file sql_base.cc
+--echo #
+
+CREATE TABLE t1 (a INT, b INT, KEY(a));
+INSERT INTO t1 VALUES (1,1),(2,2);
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 VALUES (1,1),(2,2);
+CREATE TABLE t3 LIKE t1;
+
+--echo # should have 1 impossible where and 2 dependent subqueries
+EXPLAIN
+SELECT 1 FROM t1
+WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3))
+ORDER BY count(*);
+
+--echo # should not crash the next statement
+SELECT 1 FROM t1
+WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE 1 = (SELECT MIN(t2.b) FROM t3))
+ORDER BY count(*);
+
+--echo # should not crash: the crash is caused by the previous statement
+SELECT 1;
+
+DROP TABLE t1,t2,t3;
+
+--echo #
+--echo # Bug #47106: Crash / segfault on adding EXPLAIN to a non-crashing
+--echo # query
+--echo #
+
+CREATE TABLE t1 (
+ a INT,
+ b INT,
+ PRIMARY KEY (a),
+ KEY b (b)
+);
+INSERT INTO t1 VALUES (1, 1), (2, 1);
+
+CREATE TABLE t2 LIKE t1;
+INSERT INTO t2 SELECT * FROM t1;
+
+CREATE TABLE t3 LIKE t1;
+INSERT INTO t3 SELECT * FROM t1;
+
+--echo # Should not crash.
+--echo # Should have 1 impossible where and 2 dependent subqs.
+EXPLAIN
+SELECT
+ (SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
+FROM t3 WHERE 1 = 0 GROUP BY 1;
+
+--echo # should return 0 rows
+SELECT
+ (SELECT 1 FROM t1,t2 WHERE t2.b > t3.b)
+FROM t3 WHERE 1 = 0 GROUP BY 1;
+
+DROP TABLE t1,t2,t3;
+
+--echo End of 5.0 tests.
diff --git a/mysys/hash.c b/mysys/hash.c
index 4aab75609f4..3e7851a886f 100644
--- a/mysys/hash.c
+++ b/mysys/hash.c
@@ -332,11 +332,8 @@ my_bool my_hash_insert(HASH *info,const byte *record)
{
int flag;
uint halfbuff,hash_nr,first_index,idx;
- byte *ptr_to_rec,*ptr_to_rec2;
- HASH_LINK *data,*empty,*gpos,*gpos2,*pos;
-
- LINT_INIT(gpos); LINT_INIT(gpos2);
- LINT_INIT(ptr_to_rec); LINT_INIT(ptr_to_rec2);
+ byte *UNINIT_VAR(ptr_to_rec),*UNINIT_VAR(ptr_to_rec2);
+ HASH_LINK *data,*empty,*UNINIT_VAR(gpos),*UNINIT_VAR(gpos2),*pos;
flag=0;
if (!(empty=(HASH_LINK*) alloc_dynamic(&info->array)))
diff --git a/mysys/mf_keycache.c b/mysys/mf_keycache.c
index 0720d172317..3c11e6731b7 100644
--- a/mysys/mf_keycache.c
+++ b/mysys/mf_keycache.c
@@ -13,7 +13,8 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
-/*
+/**
+ @file
These functions handle keyblock cacheing for ISAM and MyISAM tables.
One cache can handle many files.
@@ -38,7 +39,73 @@
as such gives the maximum number of in-use blocks at any time.
*/
+/*
+ Key Cache Locking
+ =================
+
+ All key cache locking is done with a single mutex per key cache:
+ keycache->cache_lock. This mutex is locked almost all the time
+ when executing code in this file (mf_keycache.c).
+ However it is released for I/O and some copy operations.
+
+ The cache_lock is also released when waiting for some event. Waiting
+ and signalling is done via condition variables. In most cases the
+ thread waits on its thread->suspend condition variable. Every thread
+ has a my_thread_var structure, which contains this variable and a
+ '*next' and '**prev' pointer. These pointers are used to insert the
+ thread into a wait queue.
+
+ A thread can wait for one block and thus be in one wait queue at a
+ time only.
+
+ Before starting to wait on its condition variable with
+ pthread_cond_wait(), the thread enters itself to a specific wait queue
+ with link_into_queue() (double linked with '*next' + '**prev') or
+ wait_on_queue() (single linked with '*next').
+
+ Another thread, when releasing a resource, looks up the waiting thread
+ in the related wait queue. It sends a signal with
+ pthread_cond_signal() to the waiting thread.
+
+ NOTE: Depending on the particular wait situation, either the sending
+ thread removes the waiting thread from the wait queue with
+ unlink_from_queue() or release_whole_queue() respectively, or the waiting
+ thread removes itself.
+
+ There is one exception from this locking scheme when one thread wants
+ to reuse a block for some other address. This works by first marking
+ the block reserved (status= BLOCK_IN_SWITCH) and then waiting for all
+ threads that are reading the block to finish. Each block has a
+ reference to a condition variable (condvar). It holds a reference to
+ the thread->suspend condition variable for the waiting thread (if such
+ a thread exists). When that thread is signaled, the reference is
+ cleared. The number of readers of a block is registered in
+ block->hash_link->requests. See wait_for_readers() / remove_reader()
+ for details. This is similar to the above, but it clearly means that
+ only one thread can wait for a particular block. There is no queue in
+ this case. Strangely enough block->convar is used for waiting for the
+ assigned hash_link only. More precisely it is used to wait for all
+ requests to be unregistered from the assigned hash_link.
+
+ The resize_queue serves two purposes:
+ 1. Threads that want to do a resize wait there if in_resize is set.
+ This is not used in the server. The server refuses a second resize
+ request if one is already active. keycache->in_init is used for the
+ synchronization. See set_var.cc.
+ 2. Threads that want to access blocks during resize wait here during
+ the re-initialization phase.
+ When the resize is done, all threads on the queue are signalled.
+ Hypothetical resizers can compete for resizing, and read/write
+ requests will restart to request blocks from the freshly resized
+ cache. If the cache has been resized too small, it is disabled and
+ 'can_be_used' is false. In this case read/write requests bypass the
+ cache. Since they increment and decrement 'cnt_for_resize_op', the
+ next resizer can wait on the queue 'waiting_for_resize_cnt' until all
+ I/O finished.
+*/
+
#include "mysys_priv.h"
+#include "mysys_err.h"
#include <keycache.h>
#include "my_static.h"
#include <m_string.h>
@@ -119,12 +186,16 @@ struct st_hash_link
};
/* simple states of a block */
-#define BLOCK_ERROR 1 /* an error occured when performing disk i/o */
-#define BLOCK_READ 2 /* the is page in the block buffer */
-#define BLOCK_IN_SWITCH 4 /* block is preparing to read new page */
-#define BLOCK_REASSIGNED 8 /* block does not accept requests for old page */
-#define BLOCK_IN_FLUSH 16 /* block is in flush operation */
-#define BLOCK_CHANGED 32 /* block buffer contains a dirty page */
+#define BLOCK_ERROR 1 /* an error occured when performing file i/o */
+#define BLOCK_READ 2 /* file block is in the block buffer */
+#define BLOCK_IN_SWITCH 4 /* block is preparing to read new page */
+#define BLOCK_REASSIGNED 8 /* blk does not accept requests for old page */
+#define BLOCK_IN_FLUSH 16 /* block is selected for flush */
+#define BLOCK_CHANGED 32 /* block buffer contains a dirty page */
+#define BLOCK_IN_USE 64 /* block is not free */
+#define BLOCK_IN_EVICTION 128 /* block is selected for eviction */
+#define BLOCK_IN_FLUSHWRITE 256 /* block is in write to file */
+#define BLOCK_FOR_UPDATE 512 /* block is selected for buffer modification */
/* page status, returned by find_key_block */
#define PAGE_READ 0
@@ -161,13 +232,15 @@ KEY_CACHE *dflt_key_cache= &dflt_key_cache_var;
static int flush_all_key_blocks(KEY_CACHE *keycache);
#ifdef THREAD
-static void link_into_queue(KEYCACHE_WQUEUE *wqueue,
- struct st_my_thread_var *thread);
-static void unlink_from_queue(KEYCACHE_WQUEUE *wqueue,
- struct st_my_thread_var *thread);
+static void wait_on_queue(KEYCACHE_WQUEUE *wqueue,
+ pthread_mutex_t *mutex);
+static void release_whole_queue(KEYCACHE_WQUEUE *wqueue);
+#else
+#define wait_on_queue(wqueue, mutex) do {} while (0)
+#define release_whole_queue(wqueue) do {} while (0)
#endif
static void free_block(KEY_CACHE *keycache, BLOCK_LINK *block);
-#ifndef DBUG_OFF
+#if !defined(DBUG_OFF)
static void test_key_cache(KEY_CACHE *keycache,
const char *where, my_bool lock);
#endif
@@ -263,6 +336,16 @@ static int keycache_pthread_cond_signal(pthread_cond_t *cond);
#define keycache_pthread_cond_signal pthread_cond_signal
#endif /* defined(KEYCACHE_DEBUG) */
+#if !defined(DBUG_OFF)
+#if defined(inline)
+#undef inline
+#endif
+#define inline /* disabled inline for easier debugging */
+static int fail_block(BLOCK_LINK *block);
+static int fail_hlink(HASH_LINK *hlink);
+static int cache_empty(KEY_CACHE *keycache);
+#endif
+
static uint next_power(uint value)
{
uint old_value= 1;
@@ -323,6 +406,14 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
if (! keycache->key_cache_inited)
{
keycache->key_cache_inited= 1;
+ /*
+ Initialize these variables once only.
+ Their value must survive re-initialization during resizing.
+ */
+ keycache->in_resize= 0;
+ keycache->resize_in_flush= 0;
+ keycache->cnt_for_resize_op= 0;
+ keycache->waiting_for_resize_cnt.last_thread= NULL;
keycache->in_init= 0;
pthread_mutex_init(&keycache->cache_lock, MY_MUTEX_INIT_FAST);
keycache->resize_queue.last_thread= NULL;
@@ -336,7 +427,7 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
blocks= (ulong) (use_mem / (sizeof(BLOCK_LINK) + 2 * sizeof(HASH_LINK) +
sizeof(HASH_LINK*) * 5/4 + key_cache_block_size));
/* It doesn't make sense to have too few blocks (less than 8) */
- if (blocks >= 8 && keycache->disk_blocks < 0)
+ if (blocks >= 8)
{
for ( ; ; )
{
@@ -356,8 +447,8 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
blocks--;
/* Allocate memory for cache page buffers */
if ((keycache->block_mem=
- my_large_malloc((size_t) blocks * keycache->key_cache_block_size,
- MYF(MY_WME))))
+ my_large_malloc((size_t) blocks * keycache->key_cache_block_size,
+ MYF(0))))
{
/*
Allocate memory for blocks, hash_links and hash entries;
@@ -372,6 +463,7 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
if (blocks < 8)
{
my_errno= ENOMEM;
+ my_error(EE_OUTOFMEMORY, MYF(0), blocks * keycache->key_cache_block_size);
goto err;
}
blocks= blocks / 4*3;
@@ -410,8 +502,6 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
blocks * age_threshold / 100 :
blocks);
- keycache->cnt_for_resize_op= 0;
- keycache->resize_in_flush= 0;
keycache->can_be_used= 1;
keycache->waiting_for_hash_link.last_thread= NULL;
@@ -427,6 +517,11 @@ int init_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
bzero((gptr) keycache->file_blocks,
sizeof(keycache->file_blocks[0]) * CHANGED_BLOCKS_HASH);
}
+ else
+ {
+ /* key_buffer_size is specified too small. Disable the cache. */
+ keycache->can_be_used= 0;
+ }
keycache->blocks= keycache->disk_blocks > 0 ? keycache->disk_blocks : 0;
DBUG_RETURN((int) keycache->disk_blocks);
@@ -485,8 +580,6 @@ int resize_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
uint age_threshold)
{
int blocks;
- struct st_my_thread_var *thread;
- KEYCACHE_WQUEUE *wqueue;
DBUG_ENTER("resize_key_cache");
if (!keycache->key_cache_inited)
@@ -502,54 +595,86 @@ int resize_key_cache(KEY_CACHE *keycache, uint key_cache_block_size,
keycache_pthread_mutex_lock(&keycache->cache_lock);
#ifdef THREAD
- wqueue= &keycache->resize_queue;
- thread= my_thread_var;
- link_into_queue(wqueue, thread);
-
- while (wqueue->last_thread->next != thread)
+ /*
+ We may need to wait for another thread which is doing a resize
+ already. This cannot happen in the MySQL server though. It allows
+ one resizer only. In set_var.cc keycache->in_init is used to block
+ multiple attempts.
+ */
+ while (keycache->in_resize)
{
- keycache_pthread_cond_wait(&thread->suspend, &keycache->cache_lock);
+ /* purecov: begin inspected */
+ wait_on_queue(&keycache->resize_queue, &keycache->cache_lock);
+ /* purecov: end */
}
#endif
- keycache->resize_in_flush= 1;
- if (flush_all_key_blocks(keycache))
+ /*
+ Mark the operation in progress. This blocks other threads from doing
+ a resize in parallel. It prohibits new blocks to enter the cache.
+ Read/write requests can bypass the cache during the flush phase.
+ */
+ keycache->in_resize= 1;
+
+ /* Need to flush only if keycache is enabled. */
+ if (keycache->can_be_used)
{
- /* TODO: if this happens, we should write a warning in the log file ! */
+ /* Start the flush phase. */
+ keycache->resize_in_flush= 1;
+
+ if (flush_all_key_blocks(keycache))
+ {
+ /* TODO: if this happens, we should write a warning in the log file ! */
+ keycache->resize_in_flush= 0;
+ blocks= 0;
+ keycache->can_be_used= 0;
+ goto finish;
+ }
+ DBUG_ASSERT(cache_empty(keycache));
+
+ /* End the flush phase. */
keycache->resize_in_flush= 0;
- blocks= 0;
- keycache->can_be_used= 0;
- goto finish;
}
- keycache->resize_in_flush= 0;
- keycache->can_be_used= 0;
+
#ifdef THREAD
+ /*
+ Some direct read/write operations (bypassing the cache) may still be
+ unfinished. Wait until they are done. If the key cache can be used,
+ direct I/O is done in increments of key_cache_block_size. That is,
+ every block is checked if it is in the cache. We need to wait for
+ pending I/O before re-initializing the cache, because we may change
+ the block size. Otherwise they could check for blocks at file
+ positions where the new block division has none. We do also want to
+ wait for I/O done when (if) the cache was disabled. It must not
+ run in parallel with normal cache operation.
+ */
while (keycache->cnt_for_resize_op)
- {
- KEYCACHE_DBUG_PRINT("resize_key_cache: wait",
- ("suspend thread %ld", thread->id));
- keycache_pthread_cond_wait(&thread->suspend, &keycache->cache_lock);
- }
+ wait_on_queue(&keycache->waiting_for_resize_cnt, &keycache->cache_lock);
#else
KEYCACHE_DBUG_ASSERT(keycache->cnt_for_resize_op == 0);
#endif
+ /*
+ Free old cache structures, allocate new structures, and initialize
+ them. Note that the cache_lock mutex and the resize_queue are left
+ untouched. We do not lose the cache_lock and will release it only at
+ the end of this function.
+ */
end_key_cache(keycache, 0); /* Don't free mutex */
/* The following will work even if use_mem is 0 */
blocks= init_key_cache(keycache, key_cache_block_size, use_mem,
division_limit, age_threshold);
finish:
-#ifdef THREAD
- unlink_from_queue(wqueue, thread);
- /* Signal for the next resize request to proceeed if any */
- if (wqueue->last_thread)
- {
- KEYCACHE_DBUG_PRINT("resize_key_cache: signal",
- ("thread %ld", wqueue->last_thread->next->id));
- keycache_pthread_cond_signal(&wqueue->last_thread->next->suspend);
- }
-#endif
+ /*
+ Mark the resize finished. This allows other threads to start a
+ resize or to request new cache blocks.
+ */
+ keycache->in_resize= 0;
+
+ /* Signal waiting threads. */
+ release_whole_queue(&keycache->resize_queue);
+
keycache_pthread_mutex_unlock(&keycache->cache_lock);
DBUG_RETURN(blocks);
}
@@ -570,18 +695,8 @@ static inline void inc_counter_for_resize_op(KEY_CACHE *keycache)
*/
static inline void dec_counter_for_resize_op(KEY_CACHE *keycache)
{
-#ifdef THREAD
- struct st_my_thread_var *last_thread;
- if (!--keycache->cnt_for_resize_op &&
- (last_thread= keycache->resize_queue.last_thread))
- {
- KEYCACHE_DBUG_PRINT("dec_counter_for_resize_op: signal",
- ("thread %ld", last_thread->next->id));
- keycache_pthread_cond_signal(&last_thread->next->suspend);
- }
-#else
- keycache->cnt_for_resize_op--;
-#endif
+ if (!--keycache->cnt_for_resize_op)
+ release_whole_queue(&keycache->waiting_for_resize_cnt);
}
/*
@@ -661,6 +776,13 @@ void end_key_cache(KEY_CACHE *keycache, my_bool cleanup)
(ulong) keycache->global_cache_r_requests,
(ulong) keycache->global_cache_read));
+ /*
+ Reset these values to be able to detect a disabled key cache.
+ See Bug#44068 (RESTORE can disable the MyISAM Key Cache).
+ */
+ keycache->blocks_used= 0;
+ keycache->blocks_unused= 0;
+
if (cleanup)
{
pthread_mutex_destroy(&keycache->cache_lock);
@@ -672,6 +794,7 @@ void end_key_cache(KEY_CACHE *keycache, my_bool cleanup)
#ifdef THREAD
+
/*
Link a thread into double-linked queue of waiting threads.
@@ -693,6 +816,8 @@ static void link_into_queue(KEYCACHE_WQUEUE *wqueue,
struct st_my_thread_var *thread)
{
struct st_my_thread_var *last;
+
+ DBUG_ASSERT(!thread->next && !thread->prev);
if (! (last= wqueue->last_thread))
{
/* Queue is empty */
@@ -728,6 +853,7 @@ static void unlink_from_queue(KEYCACHE_WQUEUE *wqueue,
struct st_my_thread_var *thread)
{
KEYCACHE_DBUG_PRINT("unlink_from_queue", ("thread %ld", thread->id));
+ DBUG_ASSERT(thread->next && thread->prev);
if (thread->next == thread)
/* The queue contains only one member */
wqueue->last_thread= NULL;
@@ -740,6 +866,13 @@ static void unlink_from_queue(KEYCACHE_WQUEUE *wqueue,
thread->prev);
}
thread->next= NULL;
+#if !defined(DBUG_OFF)
+ /*
+ This makes it easier to see it's not in a chain during debugging.
+ And some DBUG_ASSERT() rely on it.
+ */
+ thread->prev= NULL;
+#endif
}
@@ -747,9 +880,9 @@ static void unlink_from_queue(KEYCACHE_WQUEUE *wqueue,
Add a thread to single-linked queue of waiting threads
SYNOPSIS
- add_to_queue()
- wqueue pointer to the queue structure
- thread pointer to the thread to be added to the queue
+ wait_on_queue()
+ wqueue Pointer to the queue structure.
+ mutex Cache_lock to acquire after awake.
RETURN VALUE
none
@@ -758,12 +891,23 @@ static void unlink_from_queue(KEYCACHE_WQUEUE *wqueue,
Queue is represented by a circular list of the thread structures
The list is single-linked of the type (*next), accessed by a pointer
to the last element.
+
+ The function protects against stray signals by verifying that the
+ current thread is unlinked from the queue when awaking. However,
+ since several threads can wait for the same event, it might be
+ necessary for the caller of the function to check again if the
+ condition for awake is indeed matched.
*/
-static inline void add_to_queue(KEYCACHE_WQUEUE *wqueue,
- struct st_my_thread_var *thread)
+static void wait_on_queue(KEYCACHE_WQUEUE *wqueue,
+ pthread_mutex_t *mutex)
{
struct st_my_thread_var *last;
+ struct st_my_thread_var *thread= my_thread_var;
+
+ /* Add to queue. */
+ DBUG_ASSERT(!thread->next);
+ DBUG_ASSERT(!thread->prev); /* Not required, but must be true anyway. */
if (! (last= wqueue->last_thread))
thread->next= thread;
else
@@ -772,6 +916,17 @@ static inline void add_to_queue(KEYCACHE_WQUEUE *wqueue,
last->next= thread;
}
wqueue->last_thread= thread;
+
+ /*
+ Wait until thread is removed from queue by the signalling thread.
+ The loop protects against stray signals.
+ */
+ do
+ {
+ KEYCACHE_DBUG_PRINT("wait", ("suspend thread %ld", thread->id));
+ keycache_pthread_cond_wait(&thread->suspend, mutex);
+ }
+ while (thread->next);
}
@@ -779,36 +934,47 @@ static inline void add_to_queue(KEYCACHE_WQUEUE *wqueue,
Remove all threads from queue signaling them to proceed
SYNOPSIS
- realease_queue()
- wqueue pointer to the queue structure
- thread pointer to the thread to be added to the queue
+ release_whole_queue()
+ wqueue pointer to the queue structure
RETURN VALUE
none
NOTES.
- See notes for add_to_queue
+ See notes for wait_on_queue().
When removed from the queue each thread is signaled via condition
variable thread->suspend.
*/
-static void release_queue(KEYCACHE_WQUEUE *wqueue)
+static void release_whole_queue(KEYCACHE_WQUEUE *wqueue)
{
- struct st_my_thread_var *last= wqueue->last_thread;
- struct st_my_thread_var *next= last->next;
+ struct st_my_thread_var *last;
+ struct st_my_thread_var *next;
struct st_my_thread_var *thread;
+
+ /* Queue may be empty. */
+ if (!(last= wqueue->last_thread))
+ return;
+
+ next= last->next;
do
{
thread=next;
- KEYCACHE_DBUG_PRINT("release_queue: signal", ("thread %ld", thread->id));
+ KEYCACHE_DBUG_PRINT("release_whole_queue: signal",
+ ("thread %ld", thread->id));
+ /* Signal the thread. */
keycache_pthread_cond_signal(&thread->suspend);
+ /* Take thread from queue. */
next=thread->next;
thread->next= NULL;
}
while (thread != last);
+
+ /* Now queue is definitely empty. */
wqueue->last_thread= NULL;
}
-#endif
+
+#endif /* THREAD */
/*
@@ -817,9 +983,19 @@ static void release_queue(KEYCACHE_WQUEUE *wqueue)
static inline void unlink_changed(BLOCK_LINK *block)
{
+ DBUG_ASSERT(block->prev_changed && *block->prev_changed == block);
if (block->next_changed)
block->next_changed->prev_changed= block->prev_changed;
*block->prev_changed= block->next_changed;
+
+#if !defined(DBUG_OFF)
+ /*
+ This makes it easier to see it's not in a chain during debugging.
+ And some DBUG_ASSERT() rely on it.
+ */
+ block->next_changed= NULL;
+ block->prev_changed= NULL;
+#endif
}
@@ -829,6 +1005,8 @@ static inline void unlink_changed(BLOCK_LINK *block)
static inline void link_changed(BLOCK_LINK *block, BLOCK_LINK **phead)
{
+ DBUG_ASSERT(!block->next_changed);
+ DBUG_ASSERT(!block->prev_changed);
block->prev_changed= phead;
if ((block->next_changed= *phead))
(*phead)->prev_changed= &block->next_changed;
@@ -837,14 +1015,37 @@ static inline void link_changed(BLOCK_LINK *block, BLOCK_LINK **phead)
/*
- Unlink a block from the chain of dirty/clean blocks, if it's asked for,
- and link it to the chain of clean blocks for the specified file
+ Link a block in a chain of clean blocks of a file.
+
+ SYNOPSIS
+ link_to_file_list()
+ keycache Key cache handle
+ block Block to relink
+ file File to be linked to
+ unlink If to unlink first
+
+ DESCRIPTION
+ Unlink a block from whichever chain it is linked in, if it's
+ asked for, and link it to the chain of clean blocks of the
+ specified file.
+
+ NOTE
+ Please do never set/clear BLOCK_CHANGED outside of
+ link_to_file_list() or link_to_changed_list().
+ You would risk to damage correct counting of changed blocks
+ and to find blocks in the wrong hash.
+
+ RETURN
+ void
*/
static void link_to_file_list(KEY_CACHE *keycache,
BLOCK_LINK *block, int file,
my_bool unlink_block)
{
+ DBUG_ASSERT(block->status & BLOCK_IN_USE);
+ DBUG_ASSERT(block->hash_link && block->hash_link->block == block);
+ DBUG_ASSERT(block->hash_link->file == file);
if (unlink_block)
unlink_changed(block);
link_changed(block, &keycache->file_blocks[FILE_HASH(file)]);
@@ -858,13 +1059,34 @@ static void link_to_file_list(KEY_CACHE *keycache,
/*
- Unlink a block from the chain of clean blocks for the specified
- file and link it to the chain of dirty blocks for this file
+ Re-link a block from the clean chain to the dirty chain of a file.
+
+ SYNOPSIS
+ link_to_changed_list()
+ keycache key cache handle
+ block block to relink
+
+ DESCRIPTION
+ Unlink a block from the chain of clean blocks of a file
+ and link it to the chain of dirty blocks of the same file.
+
+ NOTE
+ Please do never set/clear BLOCK_CHANGED outside of
+ link_to_file_list() or link_to_changed_list().
+ You would risk to damage correct counting of changed blocks
+ and to find blocks in the wrong hash.
+
+ RETURN
+ void
*/
-static inline void link_to_changed_list(KEY_CACHE *keycache,
- BLOCK_LINK *block)
+static void link_to_changed_list(KEY_CACHE *keycache,
+ BLOCK_LINK *block)
{
+ DBUG_ASSERT(block->status & BLOCK_IN_USE);
+ DBUG_ASSERT(!(block->status & BLOCK_CHANGED));
+ DBUG_ASSERT(block->hash_link && block->hash_link->block == block);
+
unlink_changed(block);
link_changed(block,
&keycache->changed_blocks[FILE_HASH(block->hash_link->file)]);
@@ -889,13 +1111,13 @@ static inline void link_to_changed_list(KEY_CACHE *keycache,
none
NOTES.
- The LRU chain is represented by a curcular list of block structures.
+ The LRU ring is represented by a circular list of block structures.
The list is double-linked of the type (**prev,*next) type.
- The LRU chain is divided into two parts - hot and warm.
+ The LRU ring is divided into two parts - hot and warm.
There are two pointers to access the last blocks of these two
parts. The beginning of the warm part follows right after the
end of the hot part.
- Only blocks of the warm part can be used for replacement.
+ Only blocks of the warm part can be used for eviction.
The first block from the beginning of this subchain is always
taken for eviction (keycache->last_used->next)
@@ -908,6 +1130,9 @@ static inline void link_to_changed_list(KEY_CACHE *keycache,
+----| beg |---->...----| end |----+
+------+ +------+ins
first for eviction
+
+ It is also possible that the block is selected for eviction and thus
+ not linked in the LRU ring.
*/
static void link_block(KEY_CACHE *keycache, BLOCK_LINK *block, my_bool hot,
@@ -916,7 +1141,12 @@ static void link_block(KEY_CACHE *keycache, BLOCK_LINK *block, my_bool hot,
BLOCK_LINK *ins;
BLOCK_LINK **pins;
- KEYCACHE_DBUG_ASSERT(! (block->hash_link && block->hash_link->requests));
+ DBUG_ASSERT((block->status & ~BLOCK_CHANGED) == (BLOCK_READ | BLOCK_IN_USE));
+ DBUG_ASSERT(block->hash_link); /*backptr to block NULL from free_block()*/
+ DBUG_ASSERT(!block->requests);
+ DBUG_ASSERT(block->prev_changed && *block->prev_changed == block);
+ DBUG_ASSERT(!block->next_used);
+ DBUG_ASSERT(!block->prev_used);
#ifdef THREAD
if (!hot && keycache->waiting_for_block.last_thread)
{
@@ -945,6 +1175,29 @@ static void link_block(KEY_CACHE *keycache, BLOCK_LINK *block, my_bool hot,
}
while (thread != last_thread);
hash_link->block= block;
+ /*
+ NOTE: We assigned the block to the hash_link and signalled the
+ requesting thread(s). But it is possible that other threads runs
+ first. These threads see the hash_link assigned to a block which
+ is assigned to another hash_link and not marked BLOCK_IN_SWITCH.
+ This can be a problem for functions that do not select the block
+ via its hash_link: flush and free. They do only see a block which
+ is in a "normal" state and don't know that it will be evicted soon.
+
+ We cannot set BLOCK_IN_SWITCH here because only one of the
+ requesting threads must handle the eviction. All others must wait
+ for it to complete. If we set the flag here, the threads would not
+ know who is in charge of the eviction. Without the flag, the first
+ thread takes the stick and sets the flag.
+
+ But we need to note in the block that is has been selected for
+ eviction. It must not be freed. The evicting thread will not
+ expect the block in the free list. Before freeing we could also
+ check if block->requests > 1. But I think including another flag
+ in the check of block->status is slightly more efficient and
+ probably easier to read.
+ */
+ block->status|= BLOCK_IN_EVICTION;
KEYCACHE_THREAD_TRACE("link_block: after signaling");
#if defined(KEYCACHE_DEBUG)
KEYCACHE_DBUG_PRINT("link_block",
@@ -971,7 +1224,7 @@ static void link_block(KEY_CACHE *keycache, BLOCK_LINK *block, my_bool hot,
}
else
{
- /* The LRU chain is empty */
+ /* The LRU ring is empty. Let the block point to itself. */
keycache->used_last= keycache->used_ins= block->next_used= block;
block->prev_used= &block->next_used;
}
@@ -1005,6 +1258,13 @@ static void link_block(KEY_CACHE *keycache, BLOCK_LINK *block, my_bool hot,
static void unlink_block(KEY_CACHE *keycache, BLOCK_LINK *block)
{
+ DBUG_ASSERT((block->status & ~BLOCK_CHANGED) == (BLOCK_READ | BLOCK_IN_USE));
+ DBUG_ASSERT(block->hash_link); /*backptr to block NULL from free_block()*/
+ DBUG_ASSERT(!block->requests);
+ DBUG_ASSERT(block->prev_changed && *block->prev_changed == block);
+ DBUG_ASSERT(block->next_used && block->prev_used &&
+ (block->next_used->prev_used == &block->next_used) &&
+ (*block->prev_used == block));
if (block->next_used == block)
/* The list contains only one member */
keycache->used_last= keycache->used_ins= NULL;
@@ -1018,26 +1278,48 @@ static void unlink_block(KEY_CACHE *keycache, BLOCK_LINK *block)
keycache->used_ins=STRUCT_PTR(BLOCK_LINK, next_used, block->prev_used);
}
block->next_used= NULL;
+#if !defined(DBUG_OFF)
+ /*
+ This makes it easier to see it's not in a chain during debugging.
+ And some DBUG_ASSERT() rely on it.
+ */
+ block->prev_used= NULL;
+#endif
KEYCACHE_THREAD_TRACE("unlink_block");
#if defined(KEYCACHE_DEBUG)
+ KEYCACHE_DBUG_ASSERT(keycache->blocks_available != 0);
keycache->blocks_available--;
KEYCACHE_DBUG_PRINT("unlink_block",
("unlinked block %u status=%x #requests=%u #available=%u",
BLOCK_NUMBER(block), block->status,
block->requests, keycache->blocks_available));
- KEYCACHE_DBUG_ASSERT(keycache->blocks_available >= 0);
#endif
}
/*
- Register requests for a block
+ Register requests for a block.
+
+ SYNOPSIS
+ reg_requests()
+ keycache Pointer to a key cache data structure.
+ block Pointer to the block to register a request on.
+ count Number of requests. Always 1.
+
+ NOTE
+ The first request unlinks the block from the LRU ring. This means
+ that it is protected against eveiction.
+
+ RETURN
+ void
*/
static void reg_requests(KEY_CACHE *keycache, BLOCK_LINK *block, int count)
{
- if (! block->requests)
- /* First request for the block unlinks it */
+ DBUG_ASSERT(block->status & BLOCK_IN_USE);
+ DBUG_ASSERT(block->hash_link);
+
+ if (!block->requests)
unlink_block(keycache, block);
block->requests+=count;
}
@@ -1057,7 +1339,7 @@ static void reg_requests(KEY_CACHE *keycache, BLOCK_LINK *block, int count)
none
NOTES.
- Every linking to the LRU chain decrements by one a special block
+ Every linking to the LRU ring decrements by one a special block
counter (if it's positive). If the at_end parameter is TRUE the block is
added either at the end of warm sub-chain or at the end of hot sub-chain.
It is added to the hot subchain if its counter is zero and number of
@@ -1070,12 +1352,25 @@ static void reg_requests(KEY_CACHE *keycache, BLOCK_LINK *block, int count)
At the same time the block at the very beginning of the hot subchain
might be moved to the beginning of the warm subchain if it stays untouched
for a too long time (this time is determined by parameter age_threshold).
+
+ It is also possible that the block is selected for eviction and thus
+ not linked in the LRU ring.
*/
static void unreg_request(KEY_CACHE *keycache,
BLOCK_LINK *block, int at_end)
{
- if (! --block->requests)
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ DBUG_ASSERT(block->hash_link); /*backptr to block NULL from free_block()*/
+ DBUG_ASSERT(block->requests);
+ DBUG_ASSERT(block->prev_changed && *block->prev_changed == block);
+ DBUG_ASSERT(!block->next_used);
+ DBUG_ASSERT(!block->prev_used);
+ /*
+ Unregister the request, but do not link erroneous blocks into the
+ LRU ring.
+ */
+ if (!--block->requests && !(block->status & BLOCK_ERROR))
{
my_bool hot;
if (block->hits_left)
@@ -1093,9 +1388,22 @@ static void unreg_request(KEY_CACHE *keycache,
link_block(keycache, block, hot, (my_bool)at_end);
block->last_hit_time= keycache->keycache_time;
keycache->keycache_time++;
+ /*
+ At this place, the block might be in the LRU ring or not. If an
+ evicter was waiting for a block, it was selected for eviction and
+ not linked in the LRU ring.
+ */
+ /*
+ Check if we should link a hot block to the warm block sub-chain.
+ It is possible that we select the same block as above. But it can
+ also be another block. In any case a block from the LRU ring is
+ selected. In other words it works even if the above block was
+ selected for eviction and not linked in the LRU ring. Since this
+ happens only if the LRU ring is empty, the block selected below
+ would be NULL and the rest of the function skipped.
+ */
block= keycache->used_ins;
- /* Check if we should link a hot block to the warm block */
if (block && keycache->keycache_time - block->last_hit_time >
keycache->age_threshold)
{
@@ -1116,10 +1424,20 @@ static void unreg_request(KEY_CACHE *keycache,
Remove a reader of the page in block
*/
-static inline void remove_reader(BLOCK_LINK *block)
+static void remove_reader(BLOCK_LINK *block)
{
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ DBUG_ASSERT(block->hash_link && block->hash_link->block == block);
+ DBUG_ASSERT(block->prev_changed && *block->prev_changed == block);
+ DBUG_ASSERT(!block->next_used);
+ DBUG_ASSERT(!block->prev_used);
+ DBUG_ASSERT(block->hash_link->requests);
+#ifdef THREAD
if (! --block->hash_link->requests && block->condvar)
keycache_pthread_cond_signal(block->condvar);
+#else
+ --block->hash_link->requests;
+#endif
}
@@ -1128,15 +1446,27 @@ static inline void remove_reader(BLOCK_LINK *block)
signals on its termination
*/
-static inline void wait_for_readers(KEY_CACHE *keycache, BLOCK_LINK *block)
+static void wait_for_readers(KEY_CACHE *keycache,
+ BLOCK_LINK *block)
{
#ifdef THREAD
struct st_my_thread_var *thread= my_thread_var;
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ DBUG_ASSERT(!(block->status & (BLOCK_IN_FLUSH | BLOCK_CHANGED)));
+ DBUG_ASSERT(block->hash_link);
+ DBUG_ASSERT(block->hash_link->block == block);
+ /* Linked in file_blocks or changed_blocks hash. */
+ DBUG_ASSERT(block->prev_changed && *block->prev_changed == block);
+ /* Not linked in LRU ring. */
+ DBUG_ASSERT(!block->next_used);
+ DBUG_ASSERT(!block->prev_used);
while (block->hash_link->requests)
{
KEYCACHE_DBUG_PRINT("wait_for_readers: wait",
("suspend thread %ld block %u",
thread->id, BLOCK_NUMBER(block)));
+ /* There must be no other waiter. We have no queue here. */
+ DBUG_ASSERT(!block->condvar);
block->condvar= &thread->suspend;
keycache_pthread_cond_wait(&thread->suspend, &keycache->cache_lock);
block->condvar= NULL;
@@ -1225,7 +1555,6 @@ static HASH_LINK *get_hash_link(KEY_CACHE *keycache,
int file, my_off_t filepos)
{
reg1 HASH_LINK *hash_link, **start;
- KEYCACHE_PAGE page;
#if defined(KEYCACHE_DEBUG)
int cnt;
#endif
@@ -1280,6 +1609,7 @@ restart:
#ifdef THREAD
/* Wait for a free hash link */
struct st_my_thread_var *thread= my_thread_var;
+ KEYCACHE_PAGE page;
KEYCACHE_DBUG_PRINT("get_hash_link", ("waiting"));
page.file= file;
page.filepos= filepos;
@@ -1365,77 +1695,308 @@ static BLOCK_LINK *find_key_block(KEY_CACHE *keycache,
#endif
restart:
- /* Find the hash link for the requested page (file, filepos) */
+ /*
+ If the flush phase of a resize operation fails, the cache is left
+ unusable. This will be detected only after "goto restart".
+ */
+ if (!keycache->can_be_used)
+ DBUG_RETURN(0);
+
+ /*
+ Find the hash_link for the requested file block (file, filepos). We
+ do always get a hash_link here. It has registered our request so
+ that no other thread can use it for another file block until we
+ release the request (which is done by remove_reader() usually). The
+ hash_link can have a block assigned to it or not. If there is a
+ block, it may be assigned to this hash_link or not. In cases where a
+ block is evicted from the cache, it is taken from the LRU ring and
+ referenced by the new hash_link. But the block can still be assigned
+ to its old hash_link for some time if it needs to be flushed first,
+ or if there are other threads still reading it.
+
+ Summary:
+ hash_link is always returned.
+ hash_link->block can be:
+ - NULL or
+ - not assigned to this hash_link or
+ - assigned to this hash_link. If assigned, the block can have
+ - invalid data (when freshly assigned) or
+ - valid data. Valid data can be
+ - changed over the file contents (dirty) or
+ - not changed (clean).
+ */
hash_link= get_hash_link(keycache, file, filepos);
+ DBUG_ASSERT((hash_link->file == file) && (hash_link->diskpos == filepos));
page_status= -1;
if ((block= hash_link->block) &&
block->hash_link == hash_link && (block->status & BLOCK_READ))
+ {
+ /* Assigned block with valid (changed or unchanged) contents. */
page_status= PAGE_READ;
+ }
+ /*
+ else (page_status == -1)
+ - block == NULL or
+ - block not assigned to this hash_link or
+ - block assigned but not yet read from file (invalid data).
+ */
- if (wrmode && keycache->resize_in_flush)
+ if (keycache->in_resize)
{
- /* This is a write request during the flush phase of a resize operation */
+ /* This is a request during a resize operation */
- if (page_status != PAGE_READ)
+ if (!block)
{
- /* We don't need the page in the cache: we are going to write on disk */
+ struct st_my_thread_var *thread;
+
+ /*
+ The file block is not in the cache. We don't need it in the
+ cache: we are going to read or write directly to file. Cancel
+ the request. We can simply decrement hash_link->requests because
+ we did not release cache_lock since increasing it. So no other
+ thread can wait for our request to become released.
+ */
+ if (hash_link->requests == 1)
+ {
+ /*
+ We are the only one to request this hash_link (this file/pos).
+ Free the hash_link.
+ */
+ hash_link->requests--;
+ unlink_hash(keycache, hash_link);
+ DBUG_RETURN(0);
+ }
+
+ /*
+ More requests on the hash_link. Someone tries to evict a block
+ for this hash_link (could have started before resizing started).
+ This means that the LRU ring is empty. Otherwise a block could
+ be assigned immediately. Behave like a thread that wants to
+ evict a block for this file/pos. Add to the queue of threads
+ waiting for a block. Wait until there is one assigned.
+
+ Refresh the request on the hash-link so that it cannot be reused
+ for another file/pos.
+ */
+ thread= my_thread_var;
+ thread->opt_info= (void *) hash_link;
+ link_into_queue(&keycache->waiting_for_block, thread);
+ do
+ {
+ KEYCACHE_DBUG_PRINT("find_key_block: wait",
+ ("suspend thread %ld", thread->id));
+ keycache_pthread_cond_wait(&thread->suspend,
+ &keycache->cache_lock);
+ } while (thread->next);
+ thread->opt_info= NULL;
+ /*
+ A block should now be assigned to the hash_link. But it may
+ still need to be evicted. Anyway, we should re-check the
+ situation. page_status must be set correctly.
+ */
hash_link->requests--;
- unlink_hash(keycache, hash_link);
- DBUG_RETURN(0);
+ goto restart;
+ } /* end of if (!block) */
+
+ /*
+ There is a block for this file/pos in the cache. Register a
+ request on it. This unlinks it from the LRU ring (if it is there)
+ and hence protects it against eviction (if not already in
+ eviction). We need this for returning the block to the caller, for
+ calling remove_reader() (for debugging purposes), and for calling
+ free_block(). The only case where we don't need the request is if
+ the block is in eviction. In that case we have to unregister the
+ request later.
+ */
+ reg_requests(keycache, block, 1);
+
+ if (page_status != PAGE_READ)
+ {
+ /*
+ - block not assigned to this hash_link or
+ - block assigned but not yet read from file (invalid data).
+
+ This must be a block in eviction. It will be read soon. We need
+ to wait here until this happened. Otherwise the caller could
+ access a wrong block or a block which is in read. While waiting
+ we cannot lose hash_link nor block. We have registered a request
+ on the hash_link. Everything can happen to the block but changes
+ in the hash_link -> block relationship. In other words:
+ everything can happen to the block but free or another completed
+ eviction.
+
+ Note that we bahave like a secondary requestor here. We just
+ cannot return with PAGE_WAIT_TO_BE_READ. This would work for
+ read requests and writes on dirty blocks that are not in flush
+ only. Waiting here on COND_FOR_REQUESTED works in all
+ situations.
+ */
+ DBUG_ASSERT(((block->hash_link != hash_link) &&
+ (block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH))) ||
+ ((block->hash_link == hash_link) &&
+ !(block->status & BLOCK_READ)));
+ wait_on_queue(&block->wqueue[COND_FOR_REQUESTED], &keycache->cache_lock);
+ /*
+ Here we can trust that the block has been assigned to this
+ hash_link (block->hash_link == hash_link) and read into the
+ buffer (BLOCK_READ). The worst things possible here are that the
+ block is in free (BLOCK_REASSIGNED). But the block is still
+ assigned to the hash_link. The freeing thread waits until we
+ release our request on the hash_link. The block must not be
+ again in eviction because we registered an request on it before
+ starting to wait.
+ */
+ DBUG_ASSERT(block->hash_link == hash_link);
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ DBUG_ASSERT(!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH)));
}
- if (!(block->status & BLOCK_IN_FLUSH))
+ /*
+ The block is in the cache. Assigned to the hash_link. Valid data.
+ Note that in case of page_st == PAGE_READ, the block can be marked
+ for eviction. In any case it can be marked for freeing.
+ */
+
+ if (!wrmode)
+ {
+ /* A reader can just read the block. */
+ *page_st= PAGE_READ;
+ DBUG_ASSERT((hash_link->file == file) &&
+ (hash_link->diskpos == filepos) &&
+ (block->hash_link == hash_link));
+ DBUG_RETURN(block);
+ }
+
+ /*
+ This is a writer. No two writers for the same block can exist.
+ This must be assured by locks outside of the key cache.
+ */
+ DBUG_ASSERT(!(block->status & BLOCK_FOR_UPDATE) || fail_block(block));
+
+ while (block->status & BLOCK_IN_FLUSH)
+ {
+ /*
+ Wait until the block is flushed to file. Do not release the
+ request on the hash_link yet to prevent that the block is freed
+ or reassigned while we wait. While we wait, several things can
+ happen to the block, including another flush. But the block
+ cannot be reassigned to another hash_link until we release our
+ request on it. But it can be marked BLOCK_REASSIGNED from free
+ or eviction, while they wait for us to release the hash_link.
+ */
+ wait_on_queue(&block->wqueue[COND_FOR_SAVED], &keycache->cache_lock);
+ /*
+ If the flush phase failed, the resize could have finished while
+ we waited here.
+ */
+ if (!keycache->in_resize)
+ {
+ remove_reader(block);
+ unreg_request(keycache, block, 1);
+ goto restart;
+ }
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ DBUG_ASSERT(!(block->status & BLOCK_FOR_UPDATE) || fail_block(block));
+ DBUG_ASSERT(block->hash_link == hash_link);
+ }
+
+ if (block->status & BLOCK_CHANGED)
+ {
+ /*
+ We want to write a block with changed contents. If the cache
+ block size is bigger than the callers block size (e.g. MyISAM),
+ the caller may replace part of the block only. Changes of the
+ other part of the block must be preserved. Since the block has
+ not yet been selected for flush, we can still add our changes.
+ */
+ *page_st= PAGE_READ;
+ DBUG_ASSERT((hash_link->file == file) &&
+ (hash_link->diskpos == filepos) &&
+ (block->hash_link == hash_link));
+ DBUG_RETURN(block);
+ }
+
+ /*
+ This is a write request for a clean block. We do not want to have
+ new dirty blocks in the cache while resizing. We will free the
+ block and write directly to file. If the block is in eviction or
+ in free, we just let it go.
+
+ Unregister from the hash_link. This must be done before freeing
+ the block. And it must be done if not freeing the block. Because
+ we could have waited above, we need to call remove_reader(). Other
+ threads could wait for us to release our request on the hash_link.
+ */
+ remove_reader(block);
+
+ /* If the block is not in eviction and not in free, we can free it. */
+ if (!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH |
+ BLOCK_REASSIGNED)))
{
- hash_link->requests--;
/*
- Remove block to invalidate the page in the block buffer
- as we are going to write directly on disk.
- Although we have an exlusive lock for the updated key part
- the control can be yieded by the current thread as we might
+ Free block as we are going to write directly to file.
+ Although we have an exlusive lock for the updated key part,
+ the control can be yielded by the current thread as we might
have unfinished readers of other key parts in the block
buffer. Still we are guaranteed not to have any readers
of the key part we are writing into until the block is
- removed from the cache as we set the BLOCL_REASSIGNED
+ removed from the cache as we set the BLOCK_REASSIGNED
flag (see the code below that handles reading requests).
*/
free_block(keycache, block);
- DBUG_RETURN(0);
}
- /* Wait intil the page is flushed on disk */
- hash_link->requests--;
+ else
{
-#ifdef THREAD
- struct st_my_thread_var *thread= my_thread_var;
- add_to_queue(&block->wqueue[COND_FOR_SAVED], thread);
- do
- {
- KEYCACHE_DBUG_PRINT("find_key_block: wait",
- ("suspend thread %ld", thread->id));
- keycache_pthread_cond_wait(&thread->suspend,
- &keycache->cache_lock);
- }
- while(thread->next);
-#else
- KEYCACHE_DBUG_ASSERT(0);
/*
- Given the use of "resize_in_flush", it seems impossible
- that this whole branch is ever entered in single-threaded case
- because "(wrmode && keycache->resize_in_flush)" cannot be true.
- TODO: Check this, and then put the whole branch into the
- "#ifdef THREAD" guard.
+ The block will be evicted/freed soon. Don't touch it in any way.
+ Unregister the request that we registered above.
*/
-#endif
+ unreg_request(keycache, block, 1);
+
+ /*
+ The block is still assigned to the hash_link (the file/pos that
+ we are going to write to). Wait until the eviction/free is
+ complete. Otherwise the direct write could complete before all
+ readers are done with the block. So they could read outdated
+ data.
+
+ Since we released our request on the hash_link, it can be reused
+ for another file/pos. Hence we cannot just check for
+ block->hash_link == hash_link. As long as the resize is
+ proceeding the block cannot be reassigned to the same file/pos
+ again. So we can terminate the loop when the block is no longer
+ assigned to this file/pos.
+ */
+ do
+ {
+ wait_on_queue(&block->wqueue[COND_FOR_SAVED],
+ &keycache->cache_lock);
+ /*
+ If the flush phase failed, the resize could have finished
+ while we waited here.
+ */
+ if (!keycache->in_resize)
+ goto restart;
+ } while (block->hash_link &&
+ (block->hash_link->file == file) &&
+ (block->hash_link->diskpos == filepos));
}
- /* Invalidate page in the block if it has not been done yet */
- if (block->status)
- free_block(keycache, block);
DBUG_RETURN(0);
}
if (page_status == PAGE_READ &&
- (block->status & (BLOCK_IN_SWITCH | BLOCK_REASSIGNED)))
+ (block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH |
+ BLOCK_REASSIGNED)))
{
- /* This is a request for a page to be removed from cache */
+ /*
+ This is a request for a block to be removed from cache. The block
+ is assigned to this hash_link and contains valid data, but is
+ marked for eviction or to be freed. Possible reasons why it has
+ not yet been evicted/freed can be a flush before reassignment
+ (BLOCK_IN_SWITCH), readers of the block have not finished yet
+ (BLOCK_REASSIGNED), or the evicting thread did not yet awake after
+ the block has been selected for it (BLOCK_IN_EVICTION).
+ */
KEYCACHE_DBUG_PRINT("find_key_block",
("request for old page in block %u "
@@ -1446,43 +2007,58 @@ restart:
all others are to be suspended, then resubmitted
*/
if (!wrmode && !(block->status & BLOCK_REASSIGNED))
+ {
+ /*
+ This is a read request and the block not yet reassigned. We can
+ register our request and proceed. This unlinks the block from
+ the LRU ring and protects it against eviction.
+ */
reg_requests(keycache, block, 1);
+ }
else
{
+ /*
+ Either this is a write request for a block that is in eviction
+ or in free. We must not use it any more. Instead we must evict
+ another block. But we cannot do this before the eviction/free is
+ done. Otherwise we would find the same hash_link + block again
+ and again.
+
+ Or this is a read request for a block in eviction/free that does
+ not require a flush, but waits for readers to finish with the
+ block. We do not read this block to let the eviction/free happen
+ as soon as possible. Again we must wait so that we don't find
+ the same hash_link + block again and again.
+ */
+ DBUG_ASSERT(hash_link->requests);
hash_link->requests--;
KEYCACHE_DBUG_PRINT("find_key_block",
("request waiting for old page to be saved"));
- {
-#ifdef THREAD
- struct st_my_thread_var *thread= my_thread_var;
- /* Put the request into the queue of those waiting for the old page */
- add_to_queue(&block->wqueue[COND_FOR_SAVED], thread);
- /* Wait until the request can be resubmitted */
- do
- {
- KEYCACHE_DBUG_PRINT("find_key_block: wait",
- ("suspend thread %ld", thread->id));
- keycache_pthread_cond_wait(&thread->suspend,
- &keycache->cache_lock);
- }
- while(thread->next);
-#else
- KEYCACHE_DBUG_ASSERT(0);
- /* No parallel requests in single-threaded case */
-#endif
- }
+ wait_on_queue(&block->wqueue[COND_FOR_SAVED], &keycache->cache_lock);
KEYCACHE_DBUG_PRINT("find_key_block",
("request for old page resubmitted"));
- /* Resubmit the request */
+ /*
+ The block is no longer assigned to this hash_link.
+ Get another one.
+ */
goto restart;
}
}
else
{
- /* This is a request for a new page or for a page not to be removed */
+ /*
+ This is a request for a new block or for a block not to be removed.
+ Either
+ - block == NULL or
+ - block not assigned to this hash_link or
+ - block assigned but not yet read from file,
+ or
+ - block assigned with valid (changed or unchanged) data and
+ - it will not be reassigned/freed.
+ */
if (! block)
{
- /* No block is assigned for the page yet */
+ /* No block is assigned to the hash_link yet. */
if (keycache->blocks_unused)
{
if (keycache->free_block_list)
@@ -1494,25 +2070,36 @@ restart:
}
else
{
+ size_t block_mem_offset;
/* There are some never used blocks, take first of them */
+ DBUG_ASSERT(keycache->blocks_used <
+ (ulong) keycache->disk_blocks);
block= &keycache->block_root[keycache->blocks_used];
+ block_mem_offset=
+ ((size_t) keycache->blocks_used) * keycache->key_cache_block_size;
block->buffer= ADD_TO_PTR(keycache->block_mem,
- ((ulong) keycache->blocks_used*
- keycache->key_cache_block_size),
+ block_mem_offset,
byte*);
keycache->blocks_used++;
+ DBUG_ASSERT(!block->next_used);
}
+ DBUG_ASSERT(!block->prev_used);
+ DBUG_ASSERT(!block->next_changed);
+ DBUG_ASSERT(!block->prev_changed);
+ DBUG_ASSERT(!block->hash_link);
+ DBUG_ASSERT(!block->status);
+ DBUG_ASSERT(!block->requests);
keycache->blocks_unused--;
- block->status= 0;
+ block->status= BLOCK_IN_USE;
block->length= 0;
block->offset= keycache->key_cache_block_size;
block->requests= 1;
block->temperature= BLOCK_COLD;
block->hits_left= init_hits_left;
block->last_hit_time= 0;
- link_to_file_list(keycache, block, file, 0);
block->hash_link= hash_link;
hash_link->block= block;
+ link_to_file_list(keycache, block, file, 0);
page_status= PAGE_TO_BE_READ;
KEYCACHE_DBUG_PRINT("find_key_block",
("got free or never used block %u",
@@ -1520,17 +2107,26 @@ restart:
}
else
{
- /* There are no never used blocks, use a block from the LRU chain */
-
- /*
- Wait until a new block is added to the LRU chain;
- several threads might wait here for the same page,
- all of them must get the same block
+ /*
+ There are no free blocks and no never used blocks, use a block
+ from the LRU ring.
*/
#ifdef THREAD
if (! keycache->used_last)
{
+ /*
+ The LRU ring is empty. Wait until a new block is added to
+ it. Several threads might wait here for the same hash_link,
+ all of them must get the same block. While waiting for a
+ block, after a block is selected for this hash_link, other
+ threads can run first before this one awakes. During this
+ time interval other threads find this hash_link pointing to
+ the block, which is still assigned to another hash_link. In
+ this case the block is not marked BLOCK_IN_SWITCH yet, but
+ it is marked BLOCK_IN_EVICTION.
+ */
+
struct st_my_thread_var *thread= my_thread_var;
thread->opt_info= (void *) hash_link;
link_into_queue(&keycache->waiting_for_block, thread);
@@ -1543,24 +2139,50 @@ restart:
}
while (thread->next);
thread->opt_info= NULL;
+ /* Assert that block has a request registered. */
+ DBUG_ASSERT(hash_link->block->requests);
+ /* Assert that block is not in LRU ring. */
+ DBUG_ASSERT(!hash_link->block->next_used);
+ DBUG_ASSERT(!hash_link->block->prev_used);
}
#else
KEYCACHE_DBUG_ASSERT(keycache->used_last);
#endif
+ /*
+ If we waited above, hash_link->block has been assigned by
+ link_block(). Otherwise it is still NULL. In the latter case
+ we need to grab a block from the LRU ring ourselves.
+ */
block= hash_link->block;
if (! block)
{
- /*
- Take the first block from the LRU chain
- unlinking it from the chain
- */
+ /* Select the last block from the LRU ring. */
block= keycache->used_last->next_used;
block->hits_left= init_hits_left;
block->last_hit_time= 0;
- reg_requests(keycache, block,1);
hash_link->block= block;
+ /*
+ Register a request on the block. This unlinks it from the
+ LRU ring and protects it against eviction.
+ */
+ DBUG_ASSERT(!block->requests);
+ reg_requests(keycache, block,1);
+ /*
+ We do not need to set block->status|= BLOCK_IN_EVICTION here
+ because we will set block->status|= BLOCK_IN_SWITCH
+ immediately without releasing the lock in between. This does
+ also support debugging. When looking at the block, one can
+ see if the block has been selected by link_block() after the
+ LRU ring was empty, or if it was grabbed directly from the
+ LRU ring in this branch.
+ */
}
+ /*
+ If we had to wait above, there is a small chance that another
+ thread grabbed this block for the same file block already. But
+ in most cases the first condition is true.
+ */
if (block->hash_link != hash_link &&
! (block->status & BLOCK_IN_SWITCH) )
{
@@ -1575,44 +2197,117 @@ restart:
/* The block contains a dirty page - push it out of the cache */
KEYCACHE_DBUG_PRINT("find_key_block", ("block is dirty"));
+ if (block->status & BLOCK_IN_FLUSH)
+ {
+ /*
+ The block is marked for flush. If we do not wait here,
+ it could happen that we write the block, reassign it to
+ another file block, then, before the new owner can read
+ the new file block, the flusher writes the cache block
+ (which still has the old contents) to the new file block!
+ */
+ wait_on_queue(&block->wqueue[COND_FOR_SAVED],
+ &keycache->cache_lock);
+ /*
+ The block is marked BLOCK_IN_SWITCH. It should be left
+ alone except for reading. No free, no write.
+ */
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ DBUG_ASSERT(!(block->status & (BLOCK_REASSIGNED |
+ BLOCK_CHANGED |
+ BLOCK_FOR_UPDATE)));
+ }
+ else
+ {
+ block->status|= BLOCK_IN_FLUSH | BLOCK_IN_FLUSHWRITE;
+ /*
+ BLOCK_IN_EVICTION may be true or not. Other flags must
+ have a fixed value.
+ */
+ DBUG_ASSERT((block->status & ~BLOCK_IN_EVICTION) ==
+ (BLOCK_READ | BLOCK_IN_SWITCH |
+ BLOCK_IN_FLUSH | BLOCK_IN_FLUSHWRITE |
+ BLOCK_CHANGED | BLOCK_IN_USE));
+ DBUG_ASSERT(block->hash_link);
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
- /*
- The call is thread safe because only the current
- thread might change the block->hash_link value
- */
- error= my_pwrite(block->hash_link->file,
- block->buffer+block->offset,
- block->length - block->offset,
- block->hash_link->diskpos+ block->offset,
- MYF(MY_NABP | MY_WAIT_IF_FULL));
- keycache_pthread_mutex_lock(&keycache->cache_lock);
- keycache->global_cache_write++;
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ /*
+ The call is thread safe because only the current
+ thread might change the block->hash_link value
+ */
+ error= my_pwrite(block->hash_link->file,
+ block->buffer + block->offset,
+ block->length - block->offset,
+ block->hash_link->diskpos + block->offset,
+ MYF(MY_NABP | MY_WAIT_IF_FULL));
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+
+ /* Block status must not have changed. */
+ DBUG_ASSERT((block->status & ~BLOCK_IN_EVICTION) ==
+ (BLOCK_READ | BLOCK_IN_SWITCH |
+ BLOCK_IN_FLUSH | BLOCK_IN_FLUSHWRITE |
+ BLOCK_CHANGED | BLOCK_IN_USE) || fail_block(block));
+ keycache->global_cache_write++;
+ }
}
block->status|= BLOCK_REASSIGNED;
+ /*
+ The block comes from the LRU ring. It must have a hash_link
+ assigned.
+ */
+ DBUG_ASSERT(block->hash_link);
if (block->hash_link)
{
/*
+ All pending requests for this page must be resubmitted.
+ This must be done before waiting for readers. They could
+ wait for the flush to complete. And we must also do it
+ after the wait. Flushers might try to free the block while
+ we wait. They would wait until the reassignment is
+ complete. Also the block status must reflect the correct
+ situation: The block is not changed nor in flush any more.
+ Note that we must not change the BLOCK_CHANGED flag
+ outside of link_to_file_list() so that it is always in the
+ correct queue and the *blocks_changed counters are
+ correct.
+ */
+ block->status&= ~(BLOCK_IN_FLUSH | BLOCK_IN_FLUSHWRITE);
+ link_to_file_list(keycache, block, block->hash_link->file, 1);
+ release_whole_queue(&block->wqueue[COND_FOR_SAVED]);
+ /*
+ The block is still assigned to its old hash_link.
Wait until all pending read requests
for this page are executed
(we could have avoided this waiting, if we had read
a page in the cache in a sweep, without yielding control)
*/
wait_for_readers(keycache, block);
+ DBUG_ASSERT(block->hash_link && block->hash_link->block == block &&
+ block->prev_changed);
+ /* The reader must not have been a writer. */
+ DBUG_ASSERT(!(block->status & BLOCK_CHANGED));
- /* Remove the hash link for this page from the hash table */
+ /* Wake flushers that might have found the block in between. */
+ release_whole_queue(&block->wqueue[COND_FOR_SAVED]);
+
+ /* Remove the hash link for the old file block from the hash. */
unlink_hash(keycache, block->hash_link);
- /* All pending requests for this page must be resubmitted */
- if (block->wqueue[COND_FOR_SAVED].last_thread)
- release_queue(&block->wqueue[COND_FOR_SAVED]);
+
+ /*
+ For sanity checks link_to_file_list() asserts that block
+ and hash_link refer to each other. Hence we need to assign
+ the hash_link first, but then we would not know if it was
+ linked before. Hence we would not know if to unlink it. So
+ unlink it here and call link_to_file_list(..., FALSE).
+ */
+ unlink_changed(block);
}
- link_to_file_list(keycache, block, file,
- (my_bool)(block->hash_link ? 1 : 0));
- block->status= error? BLOCK_ERROR : 0;
+ block->status= error ? BLOCK_ERROR : BLOCK_IN_USE ;
block->length= 0;
block->offset= keycache->key_cache_block_size;
block->hash_link= hash_link;
+ link_to_file_list(keycache, block, file, 0);
page_status= PAGE_TO_BE_READ;
KEYCACHE_DBUG_ASSERT(block->hash_link->block == block);
@@ -1620,7 +2315,20 @@ restart:
}
else
{
- /* This is for secondary requests for a new page only */
+ /*
+ Either (block->hash_link == hash_link),
+ or (block->status & BLOCK_IN_SWITCH).
+
+ This is for secondary requests for a new file block only.
+ Either it is already assigned to the new hash_link meanwhile
+ (if we had to wait due to empty LRU), or it is already in
+ eviction by another thread. Since this block has been
+ grabbed from the LRU ring and attached to this hash_link,
+ another thread cannot grab the same block from the LRU ring
+ anymore. If the block is in eviction already, it must become
+ attached to the same hash_link and as such destined for the
+ same file block.
+ */
KEYCACHE_DBUG_PRINT("find_key_block",
("block->hash_link: %p hash_link: %p "
"block->status: %u", block->hash_link,
@@ -1630,10 +2338,35 @@ restart:
PAGE_READ : PAGE_WAIT_TO_BE_READ);
}
}
- keycache->global_cache_read++;
}
else
{
+ /*
+ Block is not NULL. This hash_link points to a block.
+ Either
+ - block not assigned to this hash_link (yet) or
+ - block assigned but not yet read from file,
+ or
+ - block assigned with valid (changed or unchanged) data and
+ - it will not be reassigned/freed.
+
+ The first condition means hash_link points to a block in
+ eviction. This is not necessarily marked by BLOCK_IN_SWITCH yet.
+ But then it is marked BLOCK_IN_EVICTION. See the NOTE in
+ link_block(). In both cases it is destined for this hash_link
+ and its file block address. When this hash_link got its block
+ address, the block was removed from the LRU ring and cannot be
+ selected for eviction (for another hash_link) again.
+
+ Register a request on the block. This is another protection
+ against eviction.
+ */
+ DBUG_ASSERT(((block->hash_link != hash_link) &&
+ (block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH))) ||
+ ((block->hash_link == hash_link) &&
+ !(block->status & BLOCK_READ)) ||
+ ((block->status & BLOCK_READ) &&
+ !(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH))));
reg_requests(keycache, block, 1);
KEYCACHE_DBUG_PRINT("find_key_block",
("block->hash_link: %p hash_link: %p "
@@ -1646,11 +2379,21 @@ restart:
}
KEYCACHE_DBUG_ASSERT(page_status != -1);
+ /* Same assert basically, but be very sure. */
+ KEYCACHE_DBUG_ASSERT(block);
+ /* Assert that block has a request and is not in LRU ring. */
+ DBUG_ASSERT(block->requests);
+ DBUG_ASSERT(!block->next_used);
+ DBUG_ASSERT(!block->prev_used);
+ /* Assert that we return the correct block. */
+ DBUG_ASSERT((page_status == PAGE_WAIT_TO_BE_READ) ||
+ ((block->hash_link->file == file) &&
+ (block->hash_link->diskpos == filepos)));
*page_st=page_status;
KEYCACHE_DBUG_PRINT("find_key_block",
- ("fd: %d pos: %lu block->status: %u page_status: %u",
+ ("fd: %d pos: %lu block->status: %u page_status: %d",
file, (ulong) filepos, block->status,
- (uint) page_status));
+ page_status));
#if !defined(DBUG_OFF) && defined(EXTRA_DEBUG)
DBUG_EXECUTE("check_keycache2",
@@ -1697,13 +2440,22 @@ static void read_block(KEY_CACHE *keycache,
if (primary)
{
/*
- This code is executed only by threads
- that submitted primary requests
+ This code is executed only by threads that submitted primary
+ requests. Until block->status contains BLOCK_READ, all other
+ request for the block become secondary requests. For a primary
+ request the block must be properly initialized.
*/
+ DBUG_ASSERT(((block->status & ~BLOCK_FOR_UPDATE) == BLOCK_IN_USE) ||
+ fail_block(block));
+ DBUG_ASSERT((block->length == 0) || fail_block(block));
+ DBUG_ASSERT((block->offset == keycache->key_cache_block_size) ||
+ fail_block(block));
+ DBUG_ASSERT((block->requests > 0) || fail_block(block));
KEYCACHE_DBUG_PRINT("read_block",
("page to be read by primary request"));
+ keycache->global_cache_read++;
/* Page is not in buffer yet, is to be read from disk */
keycache_pthread_mutex_unlock(&keycache->cache_lock);
/*
@@ -1713,45 +2465,50 @@ static void read_block(KEY_CACHE *keycache,
got_length= my_pread(block->hash_link->file, block->buffer,
read_length, block->hash_link->diskpos, MYF(0));
keycache_pthread_mutex_lock(&keycache->cache_lock);
+ /*
+ The block can now have been marked for free (in case of
+ FLUSH_RELEASE). Otherwise the state must be unchanged.
+ */
+ DBUG_ASSERT(((block->status & ~(BLOCK_REASSIGNED |
+ BLOCK_FOR_UPDATE)) == BLOCK_IN_USE) ||
+ fail_block(block));
+ DBUG_ASSERT((block->length == 0) || fail_block(block));
+ DBUG_ASSERT((block->offset == keycache->key_cache_block_size) ||
+ fail_block(block));
+ DBUG_ASSERT((block->requests > 0) || fail_block(block));
+
if (got_length < min_length)
block->status|= BLOCK_ERROR;
else
{
- block->status= BLOCK_READ;
+ block->status|= BLOCK_READ;
block->length= got_length;
+ /*
+ Do not set block->offset here. If this block is marked
+ BLOCK_CHANGED later, we want to flush only the modified part. So
+ only a writer may set block->offset down from
+ keycache->key_cache_block_size.
+ */
}
KEYCACHE_DBUG_PRINT("read_block",
("primary request: new page in cache"));
/* Signal that all pending requests for this page now can be processed */
- if (block->wqueue[COND_FOR_REQUESTED].last_thread)
- release_queue(&block->wqueue[COND_FOR_REQUESTED]);
+ release_whole_queue(&block->wqueue[COND_FOR_REQUESTED]);
}
else
{
/*
- This code is executed only by threads
- that submitted secondary requests
+ This code is executed only by threads that submitted secondary
+ requests. At this point it could happen that the cache block is
+ not yet assigned to the hash_link for the requested file block.
+ But at awake from the wait this should be the case. Unfortunately
+ we cannot assert this here because we do not know the hash_link
+ for the requested file block nor the file and position. So we have
+ to assert this in the caller.
*/
KEYCACHE_DBUG_PRINT("read_block",
("secondary request waiting for new page to be read"));
- {
-#ifdef THREAD
- struct st_my_thread_var *thread= my_thread_var;
- /* Put the request into a queue and wait until it can be processed */
- add_to_queue(&block->wqueue[COND_FOR_REQUESTED], thread);
- do
- {
- KEYCACHE_DBUG_PRINT("read_block: wait",
- ("suspend thread %ld", thread->id));
- keycache_pthread_cond_wait(&thread->suspend,
- &keycache->cache_lock);
- }
- while (thread->next);
-#else
- KEYCACHE_DBUG_ASSERT(0);
- /* No parallel requests in single-threaded case */
-#endif
- }
+ wait_on_queue(&block->wqueue[COND_FOR_REQUESTED], &keycache->cache_lock);
KEYCACHE_DBUG_PRINT("read_block",
("secondary request: new page in cache"));
}
@@ -1792,32 +2549,61 @@ byte *key_cache_read(KEY_CACHE *keycache,
uint block_length __attribute__((unused)),
int return_buffer __attribute__((unused)))
{
+ my_bool locked_and_incremented= FALSE;
int error=0;
- uint offset= 0;
byte *start= buff;
DBUG_ENTER("key_cache_read");
DBUG_PRINT("enter", ("fd: %u pos: %lu length: %u",
(uint) file, (ulong) filepos, length));
- if (keycache->can_be_used)
+ if (keycache->key_cache_inited)
{
/* Key cache is used */
reg1 BLOCK_LINK *block;
uint read_length;
- uint status;
+ uint offset;
int page_st;
+ /*
+ When the key cache is once initialized, we use the cache_lock to
+ reliably distinguish the cases of normal operation, resizing, and
+ disabled cache. We always increment and decrement
+ 'cnt_for_resize_op' so that a resizer can wait for pending I/O.
+ */
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+ /*
+ Cache resizing has two phases: Flushing and re-initializing. In
+ the flush phase read requests are allowed to bypass the cache for
+ blocks not in the cache. find_key_block() returns NULL in this
+ case.
+
+ After the flush phase new I/O requests must wait until the
+ re-initialization is done. The re-initialization can be done only
+ if no I/O request is in progress. The reason is that
+ key_cache_block_size can change. With enabled cache, I/O is done
+ in chunks of key_cache_block_size. Every chunk tries to use a
+ cache block first. If the block size changes in the middle, a
+ block could be missed and old data could be read.
+ */
+ while (keycache->in_resize && !keycache->resize_in_flush)
+ wait_on_queue(&keycache->resize_queue, &keycache->cache_lock);
+ /* Register the I/O for the next resize. */
+ inc_counter_for_resize_op(keycache);
+ locked_and_incremented= TRUE;
+ /* Requested data may not always be aligned to cache blocks. */
offset= (uint) (filepos % keycache->key_cache_block_size);
/* Read data in key_cache_block_size increments */
do
{
- keycache_pthread_mutex_lock(&keycache->cache_lock);
+ /* Cache could be disabled in a later iteration. */
if (!keycache->can_be_used)
{
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
- goto no_key_cache;
+ KEYCACHE_DBUG_PRINT("key_cache_read", ("keycache cannot be used"));
+ goto no_key_cache;
}
+ /* Start reading at the beginning of the cache block. */
filepos-= offset;
+ /* Do not read beyond the end of the cache block. */
read_length= length;
set_if_smaller(read_length, keycache->key_cache_block_size-offset);
KEYCACHE_DBUG_ASSERT(read_length > 0);
@@ -1827,34 +2613,61 @@ byte *key_cache_read(KEY_CACHE *keycache,
return_buffer=0;
#endif
- inc_counter_for_resize_op(keycache);
+ /* Request the cache block that matches file/pos. */
keycache->global_cache_r_requests++;
block=find_key_block(keycache, file, filepos, level, 0, &page_st);
- if (block->status != BLOCK_ERROR && page_st != PAGE_READ)
- {
- /* The requested page is to be read into the block buffer */
- read_block(keycache, block,
- keycache->key_cache_block_size, read_length+offset,
- (my_bool)(page_st == PAGE_TO_BE_READ));
- }
- else if (! (block->status & BLOCK_ERROR) &&
- block->length < read_length + offset)
+ if (!block)
{
/*
- Impossible if nothing goes wrong:
- this could only happen if we are using a file with
- small key blocks and are trying to read outside the file
+ This happens only for requests submitted during key cache
+ resize. The block is not in the cache and shall not go in.
+ Read directly from file.
*/
- my_errno= -1;
- block->status|= BLOCK_ERROR;
+ keycache->global_cache_read++;
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ error= (my_pread(file, (byte*) buff, read_length,
+ filepos + offset, MYF(MY_NABP)) != 0);
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+ goto next_block;
+ }
+ if (!(block->status & BLOCK_ERROR))
+ {
+ if (page_st != PAGE_READ)
+ {
+ /* The requested page is to be read into the block buffer */
+ read_block(keycache, block,
+ keycache->key_cache_block_size, read_length+offset,
+ (my_bool)(page_st == PAGE_TO_BE_READ));
+ /*
+ A secondary request must now have the block assigned to the
+ requested file block. It does not hurt to check it for
+ primary requests too.
+ */
+ DBUG_ASSERT(keycache->can_be_used);
+ DBUG_ASSERT(block->hash_link->file == file);
+ DBUG_ASSERT(block->hash_link->diskpos == filepos);
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ }
+ else if (block->length < read_length + offset)
+ {
+ /*
+ Impossible if nothing goes wrong:
+ this could only happen if we are using a file with
+ small key blocks and are trying to read outside the file
+ */
+ my_errno= -1;
+ block->status|= BLOCK_ERROR;
+ }
}
- if (! ((status= block->status) & BLOCK_ERROR))
+ /* block status may have added BLOCK_ERROR in the above 'if'. */
+ if (!(block->status & BLOCK_ERROR))
{
#ifndef THREAD
if (! return_buffer)
#endif
{
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
#if !defined(SERIALIZED_READ_FROM_CACHE)
keycache_pthread_mutex_unlock(&keycache->cache_lock);
#endif
@@ -1867,44 +2680,68 @@ byte *key_cache_read(KEY_CACHE *keycache,
#if !defined(SERIALIZED_READ_FROM_CACHE)
keycache_pthread_mutex_lock(&keycache->cache_lock);
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
#endif
}
}
remove_reader(block);
- /*
- Link the block into the LRU chain
- if it's the last submitted request for the block
- */
- unreg_request(keycache, block, 1);
- dec_counter_for_resize_op(keycache);
-
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ /* Error injection for coverage testing. */
+ DBUG_EXECUTE_IF("key_cache_read_block_error",
+ block->status|= BLOCK_ERROR;);
- if (status & BLOCK_ERROR)
- DBUG_RETURN((byte *) 0);
+ /* Do not link erroneous blocks into the LRU ring, but free them. */
+ if (!(block->status & BLOCK_ERROR))
+ {
+ /*
+ Link the block into the LRU ring if it's the last submitted
+ request for the block. This enables eviction for the block.
+ */
+ unreg_request(keycache, block, 1);
+ }
+ else
+ {
+ free_block(keycache, block);
+ error= 1;
+ break;
+ }
#ifndef THREAD
/* This is only true if we where able to read everything in one block */
if (return_buffer)
DBUG_RETURN(block->buffer);
#endif
+ next_block:
buff+= read_length;
filepos+= read_length+offset;
offset= 0;
} while ((length-= read_length));
- DBUG_RETURN(start);
+ goto end;
}
+ KEYCACHE_DBUG_PRINT("key_cache_read", ("keycache not initialized"));
-no_key_cache: /* Key cache is not used */
+no_key_cache:
+ /* Key cache is not used */
- /* We can't use mutex here as the key cache may not be initialized */
keycache->global_cache_r_requests++;
keycache->global_cache_read++;
- if (my_pread(file, (byte*) buff, length, filepos+offset, MYF(MY_NABP)))
+
+ if (locked_and_incremented)
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ if (my_pread(file, (byte*) buff, length, filepos, MYF(MY_NABP)))
error= 1;
+ if (locked_and_incremented)
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+
+end:
+ if (locked_and_incremented)
+ {
+ dec_counter_for_resize_op(keycache);
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ }
+ DBUG_PRINT("exit", ("error: %d", error ));
DBUG_RETURN(error ? (byte*) 0 : start);
}
@@ -1933,90 +2770,220 @@ int key_cache_insert(KEY_CACHE *keycache,
File file, my_off_t filepos, int level,
byte *buff, uint length)
{
+ int error= 0;
DBUG_ENTER("key_cache_insert");
DBUG_PRINT("enter", ("fd: %u pos: %lu length: %u",
(uint) file,(ulong) filepos, length));
- if (keycache->can_be_used)
+ if (keycache->key_cache_inited)
{
/* Key cache is used */
reg1 BLOCK_LINK *block;
uint read_length;
- int page_st;
- int error;
uint offset;
+ int page_st;
+ my_bool locked_and_incremented= FALSE;
+ /*
+ When the keycache is once initialized, we use the cache_lock to
+ reliably distinguish the cases of normal operation, resizing, and
+ disabled cache. We always increment and decrement
+ 'cnt_for_resize_op' so that a resizer can wait for pending I/O.
+ */
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+ /*
+ We do not load index data into a disabled cache nor into an
+ ongoing resize.
+ */
+ if (!keycache->can_be_used || keycache->in_resize)
+ goto no_key_cache;
+ /* Register the pseudo I/O for the next resize. */
+ inc_counter_for_resize_op(keycache);
+ locked_and_incremented= TRUE;
+ /* Loaded data may not always be aligned to cache blocks. */
offset= (uint) (filepos % keycache->key_cache_block_size);
+ /* Load data in key_cache_block_size increments. */
do
{
- keycache_pthread_mutex_lock(&keycache->cache_lock);
- if (!keycache->can_be_used)
- {
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
- DBUG_RETURN(0);
- }
- /* Read data into key cache from buff in key_cache_block_size incr. */
+ /* Cache could be disabled or resizing in a later iteration. */
+ if (!keycache->can_be_used || keycache->in_resize)
+ goto no_key_cache;
+ /* Start loading at the beginning of the cache block. */
filepos-= offset;
+ /* Do not load beyond the end of the cache block. */
read_length= length;
set_if_smaller(read_length, keycache->key_cache_block_size-offset);
KEYCACHE_DBUG_ASSERT(read_length > 0);
- inc_counter_for_resize_op(keycache);
+ /* The block has been read by the caller already. */
+ keycache->global_cache_read++;
+ /* Request the cache block that matches file/pos. */
keycache->global_cache_r_requests++;
block= find_key_block(keycache, file, filepos, level, 0, &page_st);
- if (block->status != BLOCK_ERROR && page_st != PAGE_READ)
+ if (!block)
{
- /* The requested page is to be read into the block buffer */
-#if !defined(SERIALIZED_READ_FROM_CACHE)
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
/*
- Here other threads may step in and register as secondary readers.
- They will register in block->wqueue[COND_FOR_REQUESTED].
+ This happens only for requests submitted during key cache
+ resize. The block is not in the cache and shall not go in.
+ Stop loading index data.
*/
+ goto no_key_cache;
+ }
+ if (!(block->status & BLOCK_ERROR))
+ {
+ if ((page_st == PAGE_WAIT_TO_BE_READ) ||
+ ((page_st == PAGE_TO_BE_READ) &&
+ (offset || (read_length < keycache->key_cache_block_size))))
+ {
+ /*
+ Either
+
+ this is a secondary request for a block to be read into the
+ cache. The block is in eviction. It is not yet assigned to
+ the requested file block (It does not point to the right
+ hash_link). So we cannot call remove_reader() on the block.
+ And we cannot access the hash_link directly here. We need to
+ wait until the assignment is complete. read_block() executes
+ the correct wait when called with primary == FALSE.
+
+ Or
+
+ this is a primary request for a block to be read into the
+ cache and the supplied data does not fill the whole block.
+
+ This function is called on behalf of a LOAD INDEX INTO CACHE
+ statement, which is a read-only task and allows other
+ readers. It is possible that a parallel running reader tries
+ to access this block. If it needs more data than has been
+ supplied here, it would report an error. To be sure that we
+ have all data in the block that is available in the file, we
+ read the block ourselves.
+
+ Though reading again what the caller did read already is an
+ expensive operation, we need to do this for correctness.
+ */
+ read_block(keycache, block, keycache->key_cache_block_size,
+ read_length + offset, (page_st == PAGE_TO_BE_READ));
+ /*
+ A secondary request must now have the block assigned to the
+ requested file block. It does not hurt to check it for
+ primary requests too.
+ */
+ DBUG_ASSERT(keycache->can_be_used);
+ DBUG_ASSERT(block->hash_link->file == file);
+ DBUG_ASSERT(block->hash_link->diskpos == filepos);
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ }
+ else if (page_st == PAGE_TO_BE_READ)
+ {
+ /*
+ This is a new block in the cache. If we come here, we have
+ data for the whole block.
+ */
+ DBUG_ASSERT(block->hash_link->requests);
+ DBUG_ASSERT(block->status & BLOCK_IN_USE);
+ DBUG_ASSERT((page_st == PAGE_TO_BE_READ) ||
+ (block->status & BLOCK_READ));
+
+#if !defined(SERIALIZED_READ_FROM_CACHE)
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ /*
+ Here other threads may step in and register as secondary readers.
+ They will register in block->wqueue[COND_FOR_REQUESTED].
+ */
#endif
- /* Copy data from buff */
- if (!(read_length & 511))
- bmove512(block->buffer+offset, buff, read_length);
- else
- memcpy(block->buffer+offset, buff, (size_t) read_length);
+ /* Copy data from buff */
+ if (!(read_length & 511))
+ bmove512(block->buffer+offset, buff, read_length);
+ else
+ memcpy(block->buffer+offset, buff, (size_t) read_length);
#if !defined(SERIALIZED_READ_FROM_CACHE)
- keycache_pthread_mutex_lock(&keycache->cache_lock);
- /* Here we are alone again. */
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+ DBUG_ASSERT(block->status & BLOCK_IN_USE);
+ DBUG_ASSERT((page_st == PAGE_TO_BE_READ) ||
+ (block->status & BLOCK_READ));
#endif
- block->status= BLOCK_READ;
- block->length= read_length+offset;
- KEYCACHE_DBUG_PRINT("key_cache_insert",
- ("primary request: new page in cache"));
- /* Signal that all pending requests for this now can be processed. */
- if (block->wqueue[COND_FOR_REQUESTED].last_thread)
- release_queue(&block->wqueue[COND_FOR_REQUESTED]);
- }
-
- remove_reader(block);
- /*
- Link the block into the LRU chain
- if it's the last submitted request for the block
- */
- unreg_request(keycache, block, 1);
+ /*
+ After the data is in the buffer, we can declare the block
+ valid. Now other threads do not need to register as
+ secondary readers any more. They can immediately access the
+ block.
+ */
+ block->status|= BLOCK_READ;
+ block->length= read_length+offset;
+ /*
+ Do not set block->offset here. If this block is marked
+ BLOCK_CHANGED later, we want to flush only the modified part. So
+ only a writer may set block->offset down from
+ keycache->key_cache_block_size.
+ */
+ KEYCACHE_DBUG_PRINT("key_cache_insert",
+ ("primary request: new page in cache"));
+ /* Signal all pending requests. */
+ release_whole_queue(&block->wqueue[COND_FOR_REQUESTED]);
+ }
+ else
+ {
+ /*
+ page_st == PAGE_READ. The block is in the buffer. All data
+ must already be present. Blocks are always read with all
+ data available on file. Assert that the block does not have
+ less contents than the preloader supplies. If the caller has
+ data beyond block->length, it means that a file write has
+ been done while this block was in cache and not extended
+ with the new data. If the condition is met, we can simply
+ ignore the block.
+ */
+ DBUG_ASSERT((page_st == PAGE_READ) &&
+ (read_length + offset <= block->length));
+ }
- error= (block->status & BLOCK_ERROR);
+ /*
+ A secondary request must now have the block assigned to the
+ requested file block. It does not hurt to check it for primary
+ requests too.
+ */
+ DBUG_ASSERT(block->hash_link->file == file);
+ DBUG_ASSERT(block->hash_link->diskpos == filepos);
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ } /* end of if (!(block->status & BLOCK_ERROR)) */
- dec_counter_for_resize_op(keycache);
+ remove_reader(block);
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ /* Error injection for coverage testing. */
+ DBUG_EXECUTE_IF("key_cache_insert_block_error",
+ block->status|= BLOCK_ERROR; errno=EIO;);
- if (error)
- DBUG_RETURN(1);
+ /* Do not link erroneous blocks into the LRU ring, but free them. */
+ if (!(block->status & BLOCK_ERROR))
+ {
+ /*
+ Link the block into the LRU ring if it's the last submitted
+ request for the block. This enables eviction for the block.
+ */
+ unreg_request(keycache, block, 1);
+ }
+ else
+ {
+ free_block(keycache, block);
+ error= 1;
+ break;
+ }
buff+= read_length;
filepos+= read_length+offset;
offset= 0;
} while ((length-= read_length));
+
+ no_key_cache:
+ if (locked_and_incremented)
+ dec_counter_for_resize_op(keycache);
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
}
- DBUG_RETURN(0);
+ DBUG_RETURN(error);
}
@@ -2045,6 +3012,8 @@ int key_cache_insert(KEY_CACHE *keycache,
It ensures that this data is flushed to the file if dont_write is FALSE.
Filepos must be a multiple of 'block_length', but it doesn't
have to be a multiple of key_cache_block_size;
+
+ dont_write is always TRUE in the server (info->lock_type is never F_UNLCK).
*/
int key_cache_write(KEY_CACHE *keycache,
@@ -2053,20 +3022,25 @@ int key_cache_write(KEY_CACHE *keycache,
uint block_length __attribute__((unused)),
int dont_write)
{
- reg1 BLOCK_LINK *block;
+ my_bool locked_and_incremented= FALSE;
int error=0;
DBUG_ENTER("key_cache_write");
DBUG_PRINT("enter",
- ("fd: %u pos: %lu length: %u block_length: %u key_block_length: %u",
- (uint) file, (ulong) filepos, length, block_length,
- keycache ? keycache->key_cache_block_size : 0));
+ ("fd: %u pos: %lu length: %u block_length: %u"
+ " key_block_length: %u",
+ (uint) file, (ulong) filepos, length, block_length,
+ keycache ? keycache->key_cache_block_size : 0));
if (!dont_write)
{
- /* Force writing from buff into disk */
+ /* purecov: begin inspected */
+ /* Not used in the server. */
+ /* Force writing from buff into disk. */
+ keycache->global_cache_w_requests++;
keycache->global_cache_write++;
if (my_pwrite(file, buff, length, filepos, MYF(MY_NABP | MY_WAIT_IF_FULL)))
DBUG_RETURN(1);
+ /* purecov: end */
}
#if !defined(DBUG_OFF) && defined(EXTRA_DEBUG)
@@ -2074,92 +3048,231 @@ int key_cache_write(KEY_CACHE *keycache,
test_key_cache(keycache, "start of key_cache_write", 1););
#endif
- if (keycache->can_be_used)
+ if (keycache->key_cache_inited)
{
/* Key cache is used */
+ reg1 BLOCK_LINK *block;
uint read_length;
- int page_st;
uint offset;
+ int page_st;
+ /*
+ When the key cache is once initialized, we use the cache_lock to
+ reliably distinguish the cases of normal operation, resizing, and
+ disabled cache. We always increment and decrement
+ 'cnt_for_resize_op' so that a resizer can wait for pending I/O.
+ */
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+ /*
+ Cache resizing has two phases: Flushing and re-initializing. In
+ the flush phase write requests can modify dirty blocks that are
+ not yet in flush. Otherwise they are allowed to bypass the cache.
+ find_key_block() returns NULL in both cases (clean blocks and
+ non-cached blocks).
+
+ After the flush phase new I/O requests must wait until the
+ re-initialization is done. The re-initialization can be done only
+ if no I/O request is in progress. The reason is that
+ key_cache_block_size can change. With enabled cache I/O is done in
+ chunks of key_cache_block_size. Every chunk tries to use a cache
+ block first. If the block size changes in the middle, a block
+ could be missed and data could be written below a cached block.
+ */
+ while (keycache->in_resize && !keycache->resize_in_flush)
+ wait_on_queue(&keycache->resize_queue, &keycache->cache_lock);
+ /* Register the I/O for the next resize. */
+ inc_counter_for_resize_op(keycache);
+ locked_and_incremented= TRUE;
+ /* Requested data may not always be aligned to cache blocks. */
offset= (uint) (filepos % keycache->key_cache_block_size);
+ /* Write data in key_cache_block_size increments. */
do
{
- keycache_pthread_mutex_lock(&keycache->cache_lock);
+ /* Cache could be disabled in a later iteration. */
if (!keycache->can_be_used)
- {
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
goto no_key_cache;
- }
- /* Write data in key_cache_block_size increments */
+ /* Start writing at the beginning of the cache block. */
filepos-= offset;
+ /* Do not write beyond the end of the cache block. */
read_length= length;
set_if_smaller(read_length, keycache->key_cache_block_size-offset);
KEYCACHE_DBUG_ASSERT(read_length > 0);
- inc_counter_for_resize_op(keycache);
+ /* Request the cache block that matches file/pos. */
keycache->global_cache_w_requests++;
block= find_key_block(keycache, file, filepos, level, 1, &page_st);
if (!block)
{
- /* It happens only for requests submitted during resize operation */
- dec_counter_for_resize_op(keycache);
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
- if (dont_write)
+ /*
+ This happens only for requests submitted during key cache
+ resize. The block is not in the cache and shall not go in.
+ Write directly to file.
+ */
+ if (dont_write)
{
- keycache->global_cache_w_requests++;
+ /* Used in the server. */
keycache->global_cache_write++;
- if (my_pwrite(file, (byte*) buff, length, filepos,
- MYF(MY_NABP | MY_WAIT_IF_FULL)))
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ if (my_pwrite(file, (byte*) buff, read_length, filepos + offset,
+ MYF(MY_NABP | MY_WAIT_IF_FULL)))
error=1;
- }
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+ }
goto next_block;
}
-
- if (block->status != BLOCK_ERROR && page_st != PAGE_READ &&
- (offset || read_length < keycache->key_cache_block_size))
+ /*
+ Prevent block from flushing and from being selected for to be
+ freed. This must be set when we release the cache_lock.
+ However, we must not set the status of the block before it is
+ assigned to this file/pos.
+ */
+ if (page_st != PAGE_WAIT_TO_BE_READ)
+ block->status|= BLOCK_FOR_UPDATE;
+ /*
+ We must read the file block first if it is not yet in the cache
+ and we do not replace all of its contents.
+
+ In cases where the cache block is big enough to contain (parts
+ of) index blocks of different indexes, our request can be
+ secondary (PAGE_WAIT_TO_BE_READ). In this case another thread is
+ reading the file block. If the read completes after us, it
+ overwrites our new contents with the old contents. So we have to
+ wait for the other thread to complete the read of this block.
+ read_block() takes care for the wait.
+ */
+ if (!(block->status & BLOCK_ERROR) &&
+ ((page_st == PAGE_TO_BE_READ &&
+ (offset || read_length < keycache->key_cache_block_size)) ||
+ (page_st == PAGE_WAIT_TO_BE_READ)))
+ {
read_block(keycache, block,
offset + read_length >= keycache->key_cache_block_size?
offset : keycache->key_cache_block_size,
- offset,(my_bool)(page_st == PAGE_TO_BE_READ));
+ offset, (page_st == PAGE_TO_BE_READ));
+ DBUG_ASSERT(keycache->can_be_used);
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ /*
+ Prevent block from flushing and from being selected for to be
+ freed. This must be set when we release the cache_lock.
+ Here we set it in case we could not set it above.
+ */
+ block->status|= BLOCK_FOR_UPDATE;
+ }
+ /*
+ The block should always be assigned to the requested file block
+ here. It need not be BLOCK_READ when overwriting the whole block.
+ */
+ DBUG_ASSERT(block->hash_link->file == file);
+ DBUG_ASSERT(block->hash_link->diskpos == filepos);
+ DBUG_ASSERT(block->status & BLOCK_IN_USE);
+ DBUG_ASSERT((page_st == PAGE_TO_BE_READ) || (block->status & BLOCK_READ));
+ /*
+ The block to be written must not be marked BLOCK_REASSIGNED.
+ Otherwise it could be freed in dirty state or reused without
+ another flush during eviction. It must also not be in flush.
+ Otherwise the old contens may have been flushed already and
+ the flusher could clear BLOCK_CHANGED without flushing the
+ new changes again.
+ */
+ DBUG_ASSERT(!(block->status & BLOCK_REASSIGNED));
+
+ while (block->status & BLOCK_IN_FLUSHWRITE)
+ {
+ /*
+ Another thread is flushing the block. It was dirty already.
+ Wait until the block is flushed to file. Otherwise we could
+ modify the buffer contents just while it is written to file.
+ An unpredictable file block contents would be the result.
+ While we wait, several things can happen to the block,
+ including another flush. But the block cannot be reassigned to
+ another hash_link until we release our request on it.
+ */
+ wait_on_queue(&block->wqueue[COND_FOR_SAVED], &keycache->cache_lock);
+ DBUG_ASSERT(keycache->can_be_used);
+ DBUG_ASSERT(block->status & (BLOCK_READ | BLOCK_IN_USE));
+ /* Still must not be marked for free. */
+ DBUG_ASSERT(!(block->status & BLOCK_REASSIGNED));
+ DBUG_ASSERT(block->hash_link && (block->hash_link->block == block));
+ }
+
+ /*
+ We could perhaps release the cache_lock during access of the
+ data like in the other functions. Locks outside of the key cache
+ assure that readers and a writer do not access the same range of
+ data. Parallel accesses should happen only if the cache block
+ contains multiple index block(fragment)s. So different parts of
+ the buffer would be read/written. An attempt to flush during
+ memcpy() is prevented with BLOCK_FOR_UPDATE.
+ */
+ if (!(block->status & BLOCK_ERROR))
+ {
+#if !defined(SERIALIZED_READ_FROM_CACHE)
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+#endif
+ if (!(read_length & 511))
+ bmove512(block->buffer+offset, buff, read_length);
+ else
+ memcpy(block->buffer+offset, buff, (size_t) read_length);
+
+#if !defined(SERIALIZED_READ_FROM_CACHE)
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+#endif
+ }
if (!dont_write)
{
- /* buff has been written to disk at start */
+ /* Not used in the server. buff has been written to disk at start. */
if ((block->status & BLOCK_CHANGED) &&
(!offset && read_length >= keycache->key_cache_block_size))
link_to_file_list(keycache, block, block->hash_link->file, 1);
}
else if (! (block->status & BLOCK_CHANGED))
link_to_changed_list(keycache, block);
-
+ block->status|=BLOCK_READ;
+ /*
+ Allow block to be selected for to be freed. Since it is marked
+ BLOCK_CHANGED too, it won't be selected for to be freed without
+ a flush.
+ */
+ block->status&= ~BLOCK_FOR_UPDATE;
set_if_smaller(block->offset, offset);
set_if_bigger(block->length, read_length+offset);
- if (! (block->status & BLOCK_ERROR))
- {
- if (!(read_length & 511))
- bmove512(block->buffer+offset, buff, read_length);
- else
- memcpy(block->buffer+offset, buff, (size_t) read_length);
- }
+ /* Threads may be waiting for the changes to be complete. */
+ release_whole_queue(&block->wqueue[COND_FOR_REQUESTED]);
- block->status|=BLOCK_READ;
+ /*
+ If only a part of the cache block is to be replaced, and the
+ rest has been read from file, then the cache lock has been
+ released for I/O and it could be possible that another thread
+ wants to evict or free the block and waits for it to be
+ released. So we must not just decrement hash_link->requests, but
+ also wake a waiting thread.
+ */
+ remove_reader(block);
- /* Unregister the request */
- block->hash_link->requests--;
- unreg_request(keycache, block, 1);
+ /* Error injection for coverage testing. */
+ DBUG_EXECUTE_IF("key_cache_write_block_error",
+ block->status|= BLOCK_ERROR;);
- if (block->status & BLOCK_ERROR)
+ /* Do not link erroneous blocks into the LRU ring, but free them. */
+ if (!(block->status & BLOCK_ERROR))
{
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ /*
+ Link the block into the LRU ring if it's the last submitted
+ request for the block. This enables eviction for the block.
+ */
+ unreg_request(keycache, block, 1);
+ }
+ else
+ {
+ /* Pretend a "clean" block to avoid complications. */
+ block->status&= ~(BLOCK_CHANGED);
+ free_block(keycache, block);
error= 1;
break;
}
- dec_counter_for_resize_op(keycache);
-
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
-
next_block:
buff+= read_length;
filepos+= read_length+offset;
@@ -2173,14 +3286,24 @@ no_key_cache:
/* Key cache is not used */
if (dont_write)
{
+ /* Used in the server. */
keycache->global_cache_w_requests++;
keycache->global_cache_write++;
+ if (locked_and_incremented)
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
if (my_pwrite(file, (byte*) buff, length, filepos,
MYF(MY_NABP | MY_WAIT_IF_FULL)))
error=1;
+ if (locked_and_incremented)
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
}
end:
+ if (locked_and_incremented)
+ {
+ dec_counter_for_resize_op(keycache);
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ }
#if !defined(DBUG_OFF) && defined(EXTRA_DEBUG)
DBUG_EXECUTE("exec",
test_key_cache(keycache, "end of key_cache_write", 1););
@@ -2190,17 +3313,64 @@ end:
/*
- Free block: remove reference to it from hash table,
- remove it from the chain file of dirty/clean blocks
- and add it to the free list.
+ Free block.
+
+ SYNOPSIS
+ free_block()
+ keycache Pointer to a key cache data structure
+ block Pointer to the block to free
+
+ DESCRIPTION
+ Remove reference to block from hash table.
+ Remove block from the chain of clean blocks.
+ Add block to the free list.
+
+ NOTE
+ Block must not be free (status == 0).
+ Block must not be in free_block_list.
+ Block must not be in the LRU ring.
+ Block must not be in eviction (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH).
+ Block must not be in free (BLOCK_REASSIGNED).
+ Block must not be in flush (BLOCK_IN_FLUSH).
+ Block must not be dirty (BLOCK_CHANGED).
+ Block must not be in changed_blocks (dirty) hash.
+ Block must be in file_blocks (clean) hash.
+ Block must refer to a hash_link.
+ Block must have a request registered on it.
*/
static void free_block(KEY_CACHE *keycache, BLOCK_LINK *block)
{
KEYCACHE_THREAD_TRACE("free block");
KEYCACHE_DBUG_PRINT("free_block",
- ("block %u to be freed, hash_link %p",
- BLOCK_NUMBER(block), block->hash_link));
+ ("block %u to be freed, hash_link %p status: %u",
+ BLOCK_NUMBER(block), block->hash_link,
+ block->status));
+ /*
+ Assert that the block is not free already. And that it is in a clean
+ state. Note that the block might just be assigned to a hash_link and
+ not yet read (BLOCK_READ may not be set here). In this case a reader
+ is registered in the hash_link and free_block() will wait for it
+ below.
+ */
+ DBUG_ASSERT((block->status & BLOCK_IN_USE) &&
+ !(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH |
+ BLOCK_REASSIGNED | BLOCK_IN_FLUSH |
+ BLOCK_CHANGED | BLOCK_FOR_UPDATE)));
+ /* Assert that the block is in a file_blocks chain. */
+ DBUG_ASSERT(block->prev_changed && *block->prev_changed == block);
+ /* Assert that the block is not in the LRU ring. */
+ DBUG_ASSERT(!block->next_used && !block->prev_used);
+ /*
+ IMHO the below condition (if()) makes no sense. I can't see how it
+ could be possible that free_block() is entered with a NULL hash_link
+ pointer. The only place where it can become NULL is in free_block()
+ (or before its first use ever, but for those blocks free_block() is
+ not called). I don't remove the conditional as it cannot harm, but
+ place an DBUG_ASSERT to confirm my hypothesis. Eventually the
+ condition (if()) can be removed.
+ */
+ DBUG_ASSERT(block->hash_link && block->hash_link->block == block);
if (block->hash_link)
{
/*
@@ -2211,24 +3381,81 @@ static void free_block(KEY_CACHE *keycache, BLOCK_LINK *block)
*/
block->status|= BLOCK_REASSIGNED;
wait_for_readers(keycache, block);
- unlink_hash(keycache, block->hash_link);
+ /*
+ The block must not have been freed by another thread. Repeat some
+ checks. An additional requirement is that it must be read now
+ (BLOCK_READ).
+ */
+ DBUG_ASSERT(block->hash_link && block->hash_link->block == block);
+ DBUG_ASSERT((block->status & (BLOCK_READ | BLOCK_IN_USE |
+ BLOCK_REASSIGNED)) &&
+ !(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH |
+ BLOCK_IN_FLUSH | BLOCK_CHANGED |
+ BLOCK_FOR_UPDATE)));
+ DBUG_ASSERT(block->prev_changed && *block->prev_changed == block);
+ DBUG_ASSERT(!block->prev_used);
+ /*
+ Unset BLOCK_REASSIGNED again. If we hand the block to an evicting
+ thread (through unreg_request() below), other threads must not see
+ this flag. They could become confused.
+ */
+ block->status&= ~BLOCK_REASSIGNED;
+ /*
+ Do not release the hash_link until the block is off all lists.
+ At least not if we hand it over for eviction in unreg_request().
+ */
+ }
+
+ /*
+ Unregister the block request and link the block into the LRU ring.
+ This enables eviction for the block. If the LRU ring was empty and
+ threads are waiting for a block, then the block wil be handed over
+ for eviction immediately. Otherwise we will unlink it from the LRU
+ ring again, without releasing the lock in between. So decrementing
+ the request counter and updating statistics are the only relevant
+ operation in this case. Assert that there are no other requests
+ registered.
+ */
+ DBUG_ASSERT(block->requests == 1);
+ unreg_request(keycache, block, 0);
+ /*
+ Note that even without releasing the cache lock it is possible that
+ the block is immediately selected for eviction by link_block() and
+ thus not added to the LRU ring. In this case we must not touch the
+ block any more.
+ */
+ if (block->status & BLOCK_IN_EVICTION)
+ return;
+
+ /* Error blocks are not put into the LRU ring. */
+ if (!(block->status & BLOCK_ERROR))
+ {
+ /* Here the block must be in the LRU ring. Unlink it again. */
+ DBUG_ASSERT(block->next_used && block->prev_used &&
+ *block->prev_used == block);
+ unlink_block(keycache, block);
}
+ if (block->temperature == BLOCK_WARM)
+ keycache->warm_blocks--;
+ block->temperature= BLOCK_COLD;
+ /* Remove from file_blocks hash. */
unlink_changed(block);
+
+ /* Remove reference to block from hash table. */
+ unlink_hash(keycache, block->hash_link);
+ block->hash_link= NULL;
+
block->status= 0;
block->length= 0;
block->offset= keycache->key_cache_block_size;
KEYCACHE_THREAD_TRACE("free block");
- KEYCACHE_DBUG_PRINT("free_block",
- ("block is freed"));
- unreg_request(keycache, block, 0);
- block->hash_link= NULL;
+ KEYCACHE_DBUG_PRINT("free_block", ("block is freed"));
- /* Remove the free block from the LRU ring. */
- unlink_block(keycache, block);
- if (block->temperature == BLOCK_WARM)
- keycache->warm_blocks--;
- block->temperature= BLOCK_COLD;
+ /* Enforced by unlink_changed(), but just to be sure. */
+ DBUG_ASSERT(!block->next_changed && !block->prev_changed);
+ /* Enforced by unlink_block(): not in LRU ring nor in free_block_list. */
+ DBUG_ASSERT(!block->next_used && !block->prev_used);
/* Insert the free block in the free list. */
block->next_used= keycache->free_block_list;
keycache->free_block_list= block;
@@ -2236,8 +3463,7 @@ static void free_block(KEY_CACHE *keycache, BLOCK_LINK *block)
keycache->blocks_unused++;
/* All pending requests for this page must be resubmitted. */
- if (block->wqueue[COND_FOR_SAVED].last_thread)
- release_queue(&block->wqueue[COND_FOR_SAVED]);
+ release_whole_queue(&block->wqueue[COND_FOR_SAVED]);
}
@@ -2271,54 +3497,97 @@ static int flush_cached_blocks(KEY_CACHE *keycache,
my_qsort((byte*) cache, count, sizeof(*cache), (qsort_cmp) cmp_sec_link);
keycache_pthread_mutex_lock(&keycache->cache_lock);
+ /*
+ Note: Do not break the loop. We have registered a request on every
+ block in 'cache'. These must be unregistered by free_block() or
+ unreg_request().
+ */
for ( ; cache != end ; cache++)
{
BLOCK_LINK *block= *cache;
KEYCACHE_DBUG_PRINT("flush_cached_blocks",
("block %u to be flushed", BLOCK_NUMBER(block)));
- keycache_pthread_mutex_unlock(&keycache->cache_lock);
- error= my_pwrite(file,
- block->buffer+block->offset,
- block->length - block->offset,
- block->hash_link->diskpos+ block->offset,
- MYF(MY_NABP | MY_WAIT_IF_FULL));
- keycache_pthread_mutex_lock(&keycache->cache_lock);
- keycache->global_cache_write++;
- if (error)
+ /*
+ If the block contents is going to be changed, we abandon the flush
+ for this block. flush_key_blocks_int() will restart its search and
+ handle the block properly.
+ */
+ if (!(block->status & BLOCK_FOR_UPDATE))
{
- block->status|= BLOCK_ERROR;
- if (!last_errno)
- last_errno= errno ? errno : -1;
+ /* Blocks coming here must have a certain status. */
+ DBUG_ASSERT(block->hash_link);
+ DBUG_ASSERT(block->hash_link->block == block);
+ DBUG_ASSERT(block->hash_link->file == file);
+ DBUG_ASSERT((block->status & ~BLOCK_IN_EVICTION) ==
+ (BLOCK_READ | BLOCK_IN_FLUSH | BLOCK_CHANGED | BLOCK_IN_USE));
+ block->status|= BLOCK_IN_FLUSHWRITE;
+ keycache_pthread_mutex_unlock(&keycache->cache_lock);
+ error= my_pwrite(file, block->buffer+block->offset,
+ block->length - block->offset,
+ block->hash_link->diskpos+ block->offset,
+ MYF(MY_NABP | MY_WAIT_IF_FULL));
+ keycache_pthread_mutex_lock(&keycache->cache_lock);
+ keycache->global_cache_write++;
+ if (error)
+ {
+ block->status|= BLOCK_ERROR;
+ if (!last_errno)
+ last_errno= errno ? errno : -1;
+ }
+ block->status&= ~BLOCK_IN_FLUSHWRITE;
+ /* Block must not have changed status except BLOCK_FOR_UPDATE. */
+ DBUG_ASSERT(block->hash_link);
+ DBUG_ASSERT(block->hash_link->block == block);
+ DBUG_ASSERT(block->hash_link->file == file);
+ DBUG_ASSERT((block->status & ~(BLOCK_FOR_UPDATE | BLOCK_IN_EVICTION)) ==
+ (BLOCK_READ | BLOCK_IN_FLUSH | BLOCK_CHANGED | BLOCK_IN_USE));
+ /*
+ Set correct status and link in right queue for free or later use.
+ free_block() must not see BLOCK_CHANGED and it may need to wait
+ for readers of the block. These should not see the block in the
+ wrong hash. If not freeing the block, we need to have it in the
+ right queue anyway.
+ */
+ link_to_file_list(keycache, block, file, 1);
}
+ block->status&= ~BLOCK_IN_FLUSH;
/*
Let to proceed for possible waiting requests to write to the block page.
It might happen only during an operation to resize the key cache.
*/
- if (block->wqueue[COND_FOR_SAVED].last_thread)
- release_queue(&block->wqueue[COND_FOR_SAVED]);
+ release_whole_queue(&block->wqueue[COND_FOR_SAVED]);
/* type will never be FLUSH_IGNORE_CHANGED here */
- if (! (type == FLUSH_KEEP || type == FLUSH_FORCE_WRITE))
+ if (!(type == FLUSH_KEEP || type == FLUSH_FORCE_WRITE) &&
+ !(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH |
+ BLOCK_FOR_UPDATE)))
{
- keycache->blocks_changed--;
- keycache->global_blocks_changed--;
+ /*
+ Note that a request has been registered against the block in
+ flush_key_blocks_int().
+ */
free_block(keycache, block);
}
else
{
- block->status&= ~BLOCK_IN_FLUSH;
- link_to_file_list(keycache, block, file, 1);
+ /*
+ Link the block into the LRU ring if it's the last submitted
+ request for the block. This enables eviction for the block.
+ Note that a request has been registered against the block in
+ flush_key_blocks_int().
+ */
unreg_request(keycache, block, 1);
}
- }
+ } /* end of for ( ; cache != end ; cache++) */
return last_errno;
}
/*
- flush all key blocks for a file to disk, but don't do any mutex locks
+ Flush all key blocks for a file to disk, but don't do any mutex locks.
+ SYNOPSIS
flush_key_blocks_int()
keycache pointer to a key cache data structure
file handler for the file to flush to
@@ -2329,6 +3598,10 @@ static int flush_cached_blocks(KEY_CACHE *keycache,
from flush_key_blocks and flush_all_key_blocks (the later one does the
mutex lock in the resize_key_cache() function).
+ We do only care about changed blocks that exist when the function is
+ entered. We do not guarantee that all changed blocks of the file are
+ flushed if more blocks change while this function is running.
+
RETURN
0 ok
1 error
@@ -2339,13 +3612,14 @@ static int flush_key_blocks_int(KEY_CACHE *keycache,
{
BLOCK_LINK *cache_buff[FLUSH_CACHE],**cache;
int last_errno= 0;
+ int last_errcnt= 0;
DBUG_ENTER("flush_key_blocks_int");
DBUG_PRINT("enter",("file: %d blocks_used: %lu blocks_changed: %lu",
file, keycache->blocks_used, keycache->blocks_changed));
#if !defined(DBUG_OFF) && defined(EXTRA_DEBUG)
- DBUG_EXECUTE("check_keycache",
- test_key_cache(keycache, "start of flush_key_blocks", 0););
+ DBUG_EXECUTE("check_keycache",
+ test_key_cache(keycache, "start of flush_key_blocks", 0););
#endif
cache= cache_buff;
@@ -2354,9 +3628,11 @@ static int flush_key_blocks_int(KEY_CACHE *keycache,
{
/* Key cache exists and flush is not disabled */
int error= 0;
- uint count= 0;
+ uint count= FLUSH_CACHE;
BLOCK_LINK **pos,**end;
BLOCK_LINK *first_in_switch= NULL;
+ BLOCK_LINK *last_in_flush;
+ BLOCK_LINK *last_for_update;
BLOCK_LINK *block, *next;
#if defined(KEYCACHE_DEBUG)
uint cnt=0;
@@ -2368,28 +3644,39 @@ static int flush_key_blocks_int(KEY_CACHE *keycache,
Count how many key blocks we have to cache to be able
to flush all dirty pages with minimum seek moves
*/
+ count= 0;
for (block= keycache->changed_blocks[FILE_HASH(file)] ;
block ;
block= block->next_changed)
{
- if (block->hash_link->file == file)
+ if ((block->hash_link->file == file) &&
+ !(block->status & BLOCK_IN_FLUSH))
{
count++;
KEYCACHE_DBUG_ASSERT(count<= keycache->blocks_used);
}
}
- /* Allocate a new buffer only if its bigger than the one we have */
- if (count > FLUSH_CACHE &&
+ /*
+ Allocate a new buffer only if its bigger than the one we have.
+ Assure that we always have some entries for the case that new
+ changed blocks appear while we need to wait for something.
+ */
+ if ((count > FLUSH_CACHE) &&
!(cache= (BLOCK_LINK**) my_malloc(sizeof(BLOCK_LINK*)*count,
MYF(0))))
- {
cache= cache_buff;
+ /*
+ After a restart there could be more changed blocks than now.
+ So we should not let count become smaller than the fixed buffer.
+ */
+ if (cache == cache_buff)
count= FLUSH_CACHE;
- }
}
/* Retrieve the blocks and write them to a buffer to be flushed */
restart:
+ last_in_flush= NULL;
+ last_for_update= NULL;
end= (pos= cache)+count;
for (block= keycache->changed_blocks[FILE_HASH(file)] ;
block ;
@@ -2402,121 +3689,350 @@ restart:
next= block->next_changed;
if (block->hash_link->file == file)
{
- /*
- Mark the block with BLOCK_IN_FLUSH in order not to let
- other threads to use it for new pages and interfere with
- our sequence ot flushing dirty file pages
- */
- block->status|= BLOCK_IN_FLUSH;
-
- if (! (block->status & BLOCK_IN_SWITCH))
+ if (!(block->status & (BLOCK_IN_FLUSH | BLOCK_FOR_UPDATE)))
{
- /*
- We care only for the blocks for which flushing was not
- initiated by other threads as a result of page swapping
+ /*
+ Note: The special handling of BLOCK_IN_SWITCH is obsolete
+ since we set BLOCK_IN_FLUSH if the eviction includes a
+ flush. It can be removed in a later version.
*/
- reg_requests(keycache, block, 1);
- if (type != FLUSH_IGNORE_CHANGED)
+ if (!(block->status & BLOCK_IN_SWITCH))
{
- /* It's not a temporary file */
- if (pos == end)
+ /*
+ We care only for the blocks for which flushing was not
+ initiated by another thread and which are not in eviction.
+ Registering a request on the block unlinks it from the LRU
+ ring and protects against eviction.
+ */
+ reg_requests(keycache, block, 1);
+ if (type != FLUSH_IGNORE_CHANGED)
{
- /*
- This happens only if there is not enough
- memory for the big block
+ /* It's not a temporary file */
+ if (pos == end)
+ {
+ /*
+ This should happen relatively seldom. Remove the
+ request because we won't do anything with the block
+ but restart and pick it again in the next iteration.
+ */
+ unreg_request(keycache, block, 0);
+ /*
+ This happens only if there is not enough
+ memory for the big block
+ */
+ if ((error= flush_cached_blocks(keycache, file, cache,
+ end,type)))
+ {
+ /* Do not loop infinitely trying to flush in vain. */
+ if ((last_errno == error) && (++last_errcnt > 5))
+ goto err;
+ last_errno= error;
+ }
+ /*
+ Restart the scan as some other thread might have changed
+ the changed blocks chain: the blocks that were in switch
+ state before the flush started have to be excluded
+ */
+ goto restart;
+ }
+ /*
+ Mark the block with BLOCK_IN_FLUSH in order not to let
+ other threads to use it for new pages and interfere with
+ our sequence of flushing dirty file pages. We must not
+ set this flag before actually putting the block on the
+ write burst array called 'cache'.
*/
- if ((error= flush_cached_blocks(keycache, file, cache,
- end,type)))
- last_errno=error;
+ block->status|= BLOCK_IN_FLUSH;
+ /* Add block to the array for a write burst. */
+ *pos++= block;
+ }
+ else
+ {
+ /* It's a temporary file */
+ DBUG_ASSERT(!(block->status & BLOCK_REASSIGNED));
/*
- Restart the scan as some other thread might have changed
- the changed blocks chain: the blocks that were in switch
- state before the flush started have to be excluded
+ free_block() must not be called with BLOCK_CHANGED. Note
+ that we must not change the BLOCK_CHANGED flag outside of
+ link_to_file_list() so that it is always in the correct
+ queue and the *blocks_changed counters are correct.
*/
- goto restart;
+ link_to_file_list(keycache, block, file, 1);
+ if (!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH)))
+ {
+ /* A request has been registered against the block above. */
+ free_block(keycache, block);
+ }
+ else
+ {
+ /*
+ Link the block into the LRU ring if it's the last
+ submitted request for the block. This enables eviction
+ for the block. A request has been registered against
+ the block above.
+ */
+ unreg_request(keycache, block, 1);
+ }
}
- *pos++= block;
}
else
{
- /* It's a temporary file */
- keycache->blocks_changed--;
- keycache->global_blocks_changed--;
- free_block(keycache, block);
+ /*
+ Link the block into a list of blocks 'in switch'.
+
+ WARNING: Here we introduce a place where a changed block
+ is not in the changed_blocks hash! This is acceptable for
+ a BLOCK_IN_SWITCH. Never try this for another situation.
+ Other parts of the key cache code rely on changed blocks
+ being in the changed_blocks hash.
+ */
+ unlink_changed(block);
+ link_changed(block, &first_in_switch);
}
}
- else
+ else if (type != FLUSH_KEEP)
{
- /* Link the block into a list of blocks 'in switch' */
- unlink_changed(block);
- link_changed(block, &first_in_switch);
+ /*
+ During the normal flush at end of statement (FLUSH_KEEP) we
+ do not need to ensure that blocks in flush or update by
+ other threads are flushed. They will be flushed by them
+ later. In all other cases we must assure that we do not have
+ any changed block of this file in the cache when this
+ function returns.
+ */
+ if (block->status & BLOCK_IN_FLUSH)
+ {
+ /* Remember the last block found to be in flush. */
+ last_in_flush= block;
+ }
+ else
+ {
+ /* Remember the last block found to be selected for update. */
+ last_for_update= block;
+ }
}
}
}
if (pos != cache)
{
if ((error= flush_cached_blocks(keycache, file, cache, pos, type)))
+ {
+ /* Do not loop inifnitely trying to flush in vain. */
+ if ((last_errno == error) && (++last_errcnt > 5))
+ goto err;
last_errno= error;
+ }
+ /*
+ Do not restart here during the normal flush at end of statement
+ (FLUSH_KEEP). We have now flushed at least all blocks that were
+ changed when entering this function. In all other cases we must
+ assure that we do not have any changed block of this file in the
+ cache when this function returns.
+ */
+ if (type != FLUSH_KEEP)
+ goto restart;
+ }
+ if (last_in_flush)
+ {
+ /*
+ There are no blocks to be flushed by this thread, but blocks in
+ flush by other threads. Wait until one of the blocks is flushed.
+ Re-check the condition for last_in_flush. We may have unlocked
+ the cache_lock in flush_cached_blocks(). The state of the block
+ could have changed.
+ */
+ if (last_in_flush->status & BLOCK_IN_FLUSH)
+ wait_on_queue(&last_in_flush->wqueue[COND_FOR_SAVED],
+ &keycache->cache_lock);
+ /* Be sure not to lose a block. They may be flushed in random order. */
+ goto restart;
+ }
+ if (last_for_update)
+ {
+ /*
+ There are no blocks to be flushed by this thread, but blocks for
+ update by other threads. Wait until one of the blocks is updated.
+ Re-check the condition for last_for_update. We may have unlocked
+ the cache_lock in flush_cached_blocks(). The state of the block
+ could have changed.
+ */
+ if (last_for_update->status & BLOCK_FOR_UPDATE)
+ wait_on_queue(&last_for_update->wqueue[COND_FOR_REQUESTED],
+ &keycache->cache_lock);
+ /* The block is now changed. Flush it. */
+ goto restart;
}
- /* Wait until list of blocks in switch is empty */
+
+ /*
+ Wait until the list of blocks in switch is empty. The threads that
+ are switching these blocks will relink them to clean file chains
+ while we wait and thus empty the 'first_in_switch' chain.
+ */
while (first_in_switch)
{
#if defined(KEYCACHE_DEBUG)
cnt= 0;
#endif
- block= first_in_switch;
- {
-#ifdef THREAD
- struct st_my_thread_var *thread= my_thread_var;
- add_to_queue(&block->wqueue[COND_FOR_SAVED], thread);
- do
- {
- KEYCACHE_DBUG_PRINT("flush_key_blocks_int: wait",
- ("suspend thread %ld", thread->id));
- keycache_pthread_cond_wait(&thread->suspend,
- &keycache->cache_lock);
- }
- while (thread->next);
-#else
- KEYCACHE_DBUG_ASSERT(0);
- /* No parallel requests in single-threaded case */
-#endif
- }
+ wait_on_queue(&first_in_switch->wqueue[COND_FOR_SAVED],
+ &keycache->cache_lock);
#if defined(KEYCACHE_DEBUG)
cnt++;
KEYCACHE_DBUG_ASSERT(cnt <= keycache->blocks_used);
#endif
+ /*
+ Do not restart here. We have flushed all blocks that were
+ changed when entering this function and were not marked for
+ eviction. Other threads have now flushed all remaining blocks in
+ the course of their eviction.
+ */
}
- /* The following happens very seldom */
+
if (! (type == FLUSH_KEEP || type == FLUSH_FORCE_WRITE))
{
-#if defined(KEYCACHE_DEBUG)
- cnt=0;
-#endif
- for (block= keycache->file_blocks[FILE_HASH(file)] ;
- block ;
- block= next)
+ BLOCK_LINK *last_for_update= NULL;
+ BLOCK_LINK *last_in_switch= NULL;
+ uint total_found= 0;
+ uint found;
+
+ /*
+ Finally free all clean blocks for this file.
+ During resize this may be run by two threads in parallel.
+ */
+ do
{
-#if defined(KEYCACHE_DEBUG)
- cnt++;
- KEYCACHE_DBUG_ASSERT(cnt <= keycache->blocks_used);
-#endif
- next= block->next_changed;
- if (block->hash_link->file == file &&
- (! (block->status & BLOCK_CHANGED)
- || type == FLUSH_IGNORE_CHANGED))
+ found= 0;
+ for (block= keycache->file_blocks[FILE_HASH(file)] ;
+ block ;
+ block= next)
{
- reg_requests(keycache, block, 1);
- free_block(keycache, block);
- }
+ /* Remember the next block. After freeing we cannot get at it. */
+ next= block->next_changed;
+
+ /* Changed blocks cannot appear in the file_blocks hash. */
+ DBUG_ASSERT(!(block->status & BLOCK_CHANGED));
+ if (block->hash_link->file == file)
+ {
+ /* We must skip blocks that will be changed. */
+ if (block->status & BLOCK_FOR_UPDATE)
+ {
+ last_for_update= block;
+ continue;
+ }
+
+ /*
+ We must not free blocks in eviction (BLOCK_IN_EVICTION |
+ BLOCK_IN_SWITCH) or blocks intended to be freed
+ (BLOCK_REASSIGNED).
+ */
+ if (!(block->status & (BLOCK_IN_EVICTION | BLOCK_IN_SWITCH |
+ BLOCK_REASSIGNED)))
+ {
+ struct st_hash_link *next_hash_link;
+ my_off_t next_diskpos;
+ File next_file;
+ uint next_status;
+ uint hash_requests;
+
+ total_found++;
+ found++;
+ KEYCACHE_DBUG_ASSERT(found <= keycache->blocks_used);
+
+ /*
+ Register a request. This unlinks the block from the LRU
+ ring and protects it against eviction. This is required
+ by free_block().
+ */
+ reg_requests(keycache, block, 1);
+
+ /*
+ free_block() may need to wait for readers of the block.
+ This is the moment where the other thread can move the
+ 'next' block from the chain. free_block() needs to wait
+ if there are requests for the block pending.
+ */
+ if (next && (hash_requests= block->hash_link->requests))
+ {
+ /* Copy values from the 'next' block and its hash_link. */
+ next_status= next->status;
+ next_hash_link= next->hash_link;
+ next_diskpos= next_hash_link->diskpos;
+ next_file= next_hash_link->file;
+ DBUG_ASSERT(next == next_hash_link->block);
+ }
+
+ free_block(keycache, block);
+ /*
+ If we had to wait and the state of the 'next' block
+ changed, break the inner loop. 'next' may no longer be
+ part of the current chain.
+
+ We do not want to break the loop after every free_block(),
+ not even only after waits. The chain might be quite long
+ and contain blocks for many files. Traversing it again and
+ again to find more blocks for this file could become quite
+ inefficient.
+ */
+ if (next && hash_requests &&
+ ((next_status != next->status) ||
+ (next_hash_link != next->hash_link) ||
+ (next_file != next_hash_link->file) ||
+ (next_diskpos != next_hash_link->diskpos) ||
+ (next != next_hash_link->block)))
+ break;
+ }
+ else
+ {
+ last_in_switch= block;
+ }
+ }
+ } /* end for block in file_blocks */
+ } while (found);
+
+ /*
+ If any clean block has been found, we may have waited for it to
+ become free. In this case it could be possible that another clean
+ block became dirty. This is possible if the write request existed
+ before the flush started (BLOCK_FOR_UPDATE). Re-check the hashes.
+ */
+ if (total_found)
+ goto restart;
+
+ /*
+ To avoid an infinite loop, wait until one of the blocks marked
+ for update is updated.
+ */
+ if (last_for_update)
+ {
+ /* We did not wait. Block must not have changed status. */
+ DBUG_ASSERT(last_for_update->status & BLOCK_FOR_UPDATE);
+ wait_on_queue(&last_for_update->wqueue[COND_FOR_REQUESTED],
+ &keycache->cache_lock);
+ goto restart;
}
- }
- }
+
+ /*
+ To avoid an infinite loop wait until one of the blocks marked
+ for eviction is switched.
+ */
+ if (last_in_switch)
+ {
+ /* We did not wait. Block must not have changed status. */
+ DBUG_ASSERT(last_in_switch->status & (BLOCK_IN_EVICTION |
+ BLOCK_IN_SWITCH |
+ BLOCK_REASSIGNED));
+ wait_on_queue(&last_in_switch->wqueue[COND_FOR_SAVED],
+ &keycache->cache_lock);
+ goto restart;
+ }
+
+ } /* if (! (type == FLUSH_KEEP || type == FLUSH_FORCE_WRITE)) */
+
+ } /* if (keycache->disk_blocks > 0 */
#ifndef DBUG_OFF
DBUG_EXECUTE("check_keycache",
test_key_cache(keycache, "end of flush_key_blocks", 0););
#endif
+err:
if (cache != cache_buff)
my_free((gptr) cache, MYF(0));
if (last_errno)
@@ -2543,51 +4059,157 @@ restart:
int flush_key_blocks(KEY_CACHE *keycache,
File file, enum flush_type type)
{
- int res;
+ int res= 0;
DBUG_ENTER("flush_key_blocks");
DBUG_PRINT("enter", ("keycache: 0x%lx", (long) keycache));
- if (keycache->disk_blocks <= 0)
+ if (!keycache->key_cache_inited)
DBUG_RETURN(0);
+
keycache_pthread_mutex_lock(&keycache->cache_lock);
- inc_counter_for_resize_op(keycache);
- res= flush_key_blocks_int(keycache, file, type);
- dec_counter_for_resize_op(keycache);
+ /* While waiting for lock, keycache could have been ended. */
+ if (keycache->disk_blocks > 0)
+ {
+ inc_counter_for_resize_op(keycache);
+ res= flush_key_blocks_int(keycache, file, type);
+ dec_counter_for_resize_op(keycache);
+ }
keycache_pthread_mutex_unlock(&keycache->cache_lock);
DBUG_RETURN(res);
}
/*
- Flush all blocks in the key cache to disk
+ Flush all blocks in the key cache to disk.
+
+ SYNOPSIS
+ flush_all_key_blocks()
+ keycache pointer to key cache root structure
+
+ DESCRIPTION
+
+ Flushing of the whole key cache is done in two phases.
+
+ 1. Flush all changed blocks, waiting for them if necessary. Loop
+ until there is no changed block left in the cache.
+
+ 2. Free all clean blocks. Normally this means free all blocks. The
+ changed blocks were flushed in phase 1 and became clean. However we
+ may need to wait for blocks that are read by other threads. While we
+ wait, a clean block could become changed if that operation started
+ before the resize operation started. To be safe we must restart at
+ phase 1.
+
+ When we can run through the changed_blocks and file_blocks hashes
+ without finding a block any more, then we are done.
+
+ Note that we hold keycache->cache_lock all the time unless we need
+ to wait for something.
+
+ RETURN
+ 0 OK
+ != 0 Error
*/
static int flush_all_key_blocks(KEY_CACHE *keycache)
{
-#if defined(KEYCACHE_DEBUG)
- uint cnt=0;
-#endif
- while (keycache->blocks_changed > 0)
+ BLOCK_LINK *block;
+ uint total_found;
+ uint found;
+ uint idx;
+ DBUG_ENTER("flush_all_key_blocks");
+
+ do
{
- BLOCK_LINK *block;
- for (block= keycache->used_last->next_used ; ; block=block->next_used)
+ safe_mutex_assert_owner(&keycache->cache_lock);
+ total_found= 0;
+
+ /*
+ Phase1: Flush all changed blocks, waiting for them if necessary.
+ Loop until there is no changed block left in the cache.
+ */
+ do
{
- if (block->hash_link)
+ found= 0;
+ /* Step over the whole changed_blocks hash array. */
+ for (idx= 0; idx < CHANGED_BLOCKS_HASH; idx++)
{
-#if defined(KEYCACHE_DEBUG)
- cnt++;
- KEYCACHE_DBUG_ASSERT(cnt <= keycache->blocks_used);
-#endif
- if (flush_key_blocks_int(keycache, block->hash_link->file,
- FLUSH_RELEASE))
- return 1;
- break;
+ /*
+ If an array element is non-empty, use the first block from its
+ chain to find a file for flush. All changed blocks for this
+ file are flushed. So the same block will not appear at this
+ place again with the next iteration. New writes for blocks are
+ not accepted during the flush. If multiple files share the
+ same hash bucket, one of them will be flushed per iteration
+ of the outer loop of phase 1.
+ */
+ if ((block= keycache->changed_blocks[idx]))
+ {
+ found++;
+ /*
+ Flush dirty blocks but do not free them yet. They can be used
+ for reading until all other blocks are flushed too.
+ */
+ if (flush_key_blocks_int(keycache, block->hash_link->file,
+ FLUSH_FORCE_WRITE))
+ DBUG_RETURN(1);
+ }
}
- if (block == keycache->used_last)
- break;
- }
+
+ } while (found);
+
+ /*
+ Phase 2: Free all clean blocks. Normally this means free all
+ blocks. The changed blocks were flushed in phase 1 and became
+ clean. However we may need to wait for blocks that are read by
+ other threads. While we wait, a clean block could become changed
+ if that operation started before the resize operation started. To
+ be safe we must restart at phase 1.
+ */
+ do
+ {
+ found= 0;
+ /* Step over the whole file_blocks hash array. */
+ for (idx= 0; idx < CHANGED_BLOCKS_HASH; idx++)
+ {
+ /*
+ If an array element is non-empty, use the first block from its
+ chain to find a file for flush. All blocks for this file are
+ freed. So the same block will not appear at this place again
+ with the next iteration. If multiple files share the
+ same hash bucket, one of them will be flushed per iteration
+ of the outer loop of phase 2.
+ */
+ if ((block= keycache->file_blocks[idx]))
+ {
+ total_found++;
+ found++;
+ if (flush_key_blocks_int(keycache, block->hash_link->file,
+ FLUSH_RELEASE))
+ DBUG_RETURN(1);
+ }
+ }
+
+ } while (found);
+
+ /*
+ If any clean block has been found, we may have waited for it to
+ become free. In this case it could be possible that another clean
+ block became dirty. This is possible if the write request existed
+ before the resize started (BLOCK_FOR_UPDATE). Re-check the hashes.
+ */
+ } while (total_found);
+
+#ifndef DBUG_OFF
+ /* Now there should not exist any block any more. */
+ for (idx= 0; idx < CHANGED_BLOCKS_HASH; idx++)
+ {
+ DBUG_ASSERT(!keycache->changed_blocks[idx]);
+ DBUG_ASSERT(!keycache->file_blocks[idx]);
}
- return 0;
+#endif
+
+ DBUG_RETURN(0);
}
@@ -2838,8 +4460,8 @@ static void keycache_debug_print(const char * fmt,...)
va_start(args,fmt);
if (keycache_debug_log)
{
- VOID(vfprintf(keycache_debug_log, fmt, args));
- VOID(fputc('\n',keycache_debug_log));
+ (void) vfprintf(keycache_debug_log, fmt, args);
+ (void) fputc('\n',keycache_debug_log);
}
va_end(args);
}
@@ -2856,3 +4478,70 @@ void keycache_debug_log_close(void)
#endif /* defined(KEYCACHE_DEBUG_LOG) */
#endif /* defined(KEYCACHE_DEBUG) */
+
+#if !defined(DBUG_OFF)
+#define F_B_PRT(_f_, _v_) DBUG_PRINT("assert_fail", (_f_, _v_))
+
+static int fail_block(BLOCK_LINK *block)
+{
+ F_B_PRT("block->next_used: %lx\n", (ulong) block->next_used);
+ F_B_PRT("block->prev_used: %lx\n", (ulong) block->prev_used);
+ F_B_PRT("block->next_changed: %lx\n", (ulong) block->next_changed);
+ F_B_PRT("block->prev_changed: %lx\n", (ulong) block->prev_changed);
+ F_B_PRT("block->hash_link: %lx\n", (ulong) block->hash_link);
+ F_B_PRT("block->status: %u\n", block->status);
+ F_B_PRT("block->length: %u\n", block->length);
+ F_B_PRT("block->offset: %u\n", block->offset);
+ F_B_PRT("block->requests: %u\n", block->requests);
+ F_B_PRT("block->temperature: %u\n", block->temperature);
+ return 0; /* Let the assert fail. */
+}
+
+static int fail_hlink(HASH_LINK *hlink)
+{
+ F_B_PRT("hlink->next: %lx\n", (ulong) hlink->next);
+ F_B_PRT("hlink->prev: %lx\n", (ulong) hlink->prev);
+ F_B_PRT("hlink->block: %lx\n", (ulong) hlink->block);
+ F_B_PRT("hlink->diskpos: %lu\n", (ulong) hlink->diskpos);
+ F_B_PRT("hlink->file: %d\n", hlink->file);
+ return 0; /* Let the assert fail. */
+}
+
+static int cache_empty(KEY_CACHE *keycache)
+{
+ int errcnt= 0;
+ int idx;
+ if (keycache->disk_blocks <= 0)
+ return 1;
+ for (idx= 0; idx < keycache->disk_blocks; idx++)
+ {
+ BLOCK_LINK *block= keycache->block_root + idx;
+ if (block->status || block->requests || block->hash_link)
+ {
+ fprintf(stderr, "block index: %u\n", idx);
+ fail_block(block);
+ errcnt++;
+ }
+ }
+ for (idx= 0; idx < keycache->hash_links; idx++)
+ {
+ HASH_LINK *hash_link= keycache->hash_link_root + idx;
+ if (hash_link->requests || hash_link->block)
+ {
+ fprintf(stderr, "hash_link index: %u\n", idx);
+ fail_hlink(hash_link);
+ errcnt++;
+ }
+ }
+ if (errcnt)
+ {
+ fprintf(stderr, "blocks: %d used: %lu\n",
+ keycache->disk_blocks, keycache->blocks_used);
+ fprintf(stderr, "hash_links: %d used: %d\n",
+ keycache->hash_links, keycache->hash_links_used);
+ fprintf(stderr, "\n");
+ }
+ return !errcnt;
+}
+#endif
+
diff --git a/mysys/my_static.c b/mysys/my_static.c
index 1858d830f41..23e37c53f98 100644
--- a/mysys/my_static.c
+++ b/mysys/my_static.c
@@ -48,9 +48,6 @@ struct st_remember _my_sig_remember[MAX_SIGNALS]={{0,0}};
sigset_t my_signals; /* signals blocked by mf_brkhant */
#endif
- /* from mf_keycache.c */
-my_bool key_cache_inited=0;
-
/* from mf_reccache.c */
ulong my_default_record_cache_size=RECORD_CACHE_SIZE;
diff --git a/mysys/my_thr_init.c b/mysys/my_thr_init.c
index c446808c7da..64fc99952e9 100644
--- a/mysys/my_thr_init.c
+++ b/mysys/my_thr_init.c
@@ -107,10 +107,11 @@ my_bool my_thread_global_init(void)
pthread_attr_t dummy_thread_attr;
pthread_attr_init(&dummy_thread_attr);
- pthread_attr_setdetachstate(&dummy_thread_attr, PTHREAD_CREATE_DETACHED);
+ pthread_attr_setdetachstate(&dummy_thread_attr, PTHREAD_CREATE_JOINABLE);
- pthread_create(&dummy_thread,&dummy_thread_attr,
- nptl_pthread_exit_hack_handler, NULL);
+ if (pthread_create(&dummy_thread,&dummy_thread_attr,
+ nptl_pthread_exit_hack_handler, NULL) == 0)
+ (void)pthread_join(dummy_thread, NULL);
}
#endif /* TARGET_OS_LINUX */
diff --git a/sql-common/my_time.c b/sql-common/my_time.c
index d2ef9da25f5..ed1279f7afb 100644
--- a/sql-common/my_time.c
+++ b/sql-common/my_time.c
@@ -165,7 +165,7 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
uint add_hours= 0, start_loop;
ulong not_zero_date, allow_space;
my_bool is_internal_format;
- const char *pos, *last_field_pos;
+ const char *pos, *UNINIT_VAR(last_field_pos);
const char *end=str+length;
const uchar *format_position;
my_bool found_delimitier= 0, found_space= 0;
@@ -174,7 +174,6 @@ str_to_datetime(const char *str, uint length, MYSQL_TIME *l_time,
DBUG_PRINT("ENTER",("str: %.*s",length,str));
LINT_INIT(field_length);
- LINT_INIT(last_field_pos);
*was_cut= 0;
diff --git a/sql/ha_myisam.cc b/sql/ha_myisam.cc
index dfd739f6db8..a92e7bbb9fd 100644
--- a/sql/ha_myisam.cc
+++ b/sql/ha_myisam.cc
@@ -1189,6 +1189,7 @@ int ha_myisam::preload_keys(THD* thd, HA_CHECK_OPT *check_opt)
ulonglong map= ~(ulonglong) 0;
TABLE_LIST *table_list= table->pos_in_table_list;
my_bool ignore_leaves= table_list->ignore_leaves;
+ char buf[ERRMSGSIZE+20];
DBUG_ENTER("ha_myisam::preload_keys");
@@ -1216,7 +1217,6 @@ int ha_myisam::preload_keys(THD* thd, HA_CHECK_OPT *check_opt)
errmsg= "Failed to allocate buffer";
break;
default:
- char buf[ERRMSGSIZE+20];
my_snprintf(buf, ERRMSGSIZE,
"Failed to read from index file (errno: %d)", my_errno);
errmsg= buf;
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 3c1e2126008..d6f315fda50 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -428,8 +428,7 @@ bool Item_func::eq(const Item *item, bool binary_cmp) const
Field *Item_func::tmp_table_field(TABLE *t_arg)
{
- Field *res;
- LINT_INIT(res);
+ Field *res= NULL;
switch (result_type()) {
case INT_RESULT:
@@ -4202,9 +4201,8 @@ void Item_func_set_user_var::save_item_result(Item *item)
bool
Item_func_set_user_var::update()
{
- bool res;
+ bool res= 0;
DBUG_ENTER("Item_func_set_user_var::update");
- LINT_INIT(res);
switch (cached_result_type) {
case REAL_RESULT:
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index e3fe67f4324..6f697a1665a 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -600,6 +600,7 @@ String *Item_func_concat_ws::val_str(String *str)
String tmp_sep_str(tmp_str_buff, sizeof(tmp_str_buff),default_charset_info),
*sep_str, *res, *res2,*use_as_buff;
uint i;
+ bool is_const= 0;
null_value=0;
if (!(sep_str= args[0]->val_str(&tmp_sep_str)))
@@ -613,7 +614,11 @@ String *Item_func_concat_ws::val_str(String *str)
// If not, return the empty string
for (i=1; i < arg_count; i++)
if ((res= args[i]->val_str(str)))
+ {
+ is_const= args[i]->const_item() || !args[i]->used_tables();
break;
+ }
+
if (i == arg_count)
return &my_empty_string;
@@ -631,7 +636,7 @@ String *Item_func_concat_ws::val_str(String *str)
current_thd->variables.max_allowed_packet);
goto null;
}
- if (res->alloced_length() >=
+ if (!is_const && res->alloced_length() >=
res->length() + sep_str->length() + res2->length())
{ // Use old buffer
res->append(*sep_str); // res->length() > 0 always
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index 39f869106b6..de76f821795 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -271,9 +271,9 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
int strict_week_number_year= -1;
int frac_part;
bool usa_time= 0;
- bool sunday_first_n_first_week_non_iso;
- bool strict_week_number;
- bool strict_week_number_year_type;
+ bool UNINIT_VAR(sunday_first_n_first_week_non_iso);
+ bool UNINIT_VAR(strict_week_number);
+ bool UNINIT_VAR(strict_week_number_year_type);
const char *val_begin= val;
const char *val_end= val + length;
const char *ptr= format->format.str;
@@ -281,11 +281,6 @@ static bool extract_date_time(DATE_TIME_FORMAT *format,
CHARSET_INFO *cs= &my_charset_bin;
DBUG_ENTER("extract_date_time");
- LINT_INIT(strict_week_number);
- /* Remove valgrind varnings when using gcc 3.3 and -O1 */
- PURIFY_OR_LINT_INIT(strict_week_number_year_type);
- PURIFY_OR_LINT_INIT(sunday_first_n_first_week_non_iso);
-
if (!sub_pattern_end)
bzero((char*) l_time, sizeof(*l_time));
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index afbbf753813..ce1d562d0ca 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -4022,7 +4022,7 @@ default_service_handling(char **argv,
if (opt_delim= strchr(extra_opt, '='))
{
size_t length= ++opt_delim - extra_opt;
- strnmov(pos, extra_opt, length);
+ pos= strnmov(pos, extra_opt, length);
}
else
opt_delim= extra_opt;
diff --git a/sql/sql_handler.cc b/sql/sql_handler.cc
index 721b365a7b9..5bd28add428 100644
--- a/sql/sql_handler.cc
+++ b/sql/sql_handler.cc
@@ -385,16 +385,13 @@ bool mysql_ha_read(THD *thd, TABLE_LIST *tables,
String buffer(buff, sizeof(buff), system_charset_info);
int error, keyno= -1;
uint num_rows;
- byte *key;
- uint key_len;
+ byte *UNINIT_VAR(key);
+ uint UNINIT_VAR(key_len);
bool need_reopen;
DBUG_ENTER("mysql_ha_read");
DBUG_PRINT("enter",("'%s'.'%s' as '%s'",
tables->db, tables->table_name, tables->alias));
- LINT_INIT(key);
- LINT_INIT(key_len);
-
thd->lex->select_lex.context.resolve_in_table_list_only(tables);
list.push_front(new Item_field(&thd->lex->select_lex.context,
NULL, NULL, "*"));
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc
index b0b4256184c..17ee53d446b 100644
--- a/sql/sql_lex.cc
+++ b/sql/sql_lex.cc
@@ -530,7 +530,7 @@ static inline uint int_token(const char *str,uint length)
int MYSQLlex(void *arg, void *yythd)
{
- reg1 uchar c;
+ reg1 uchar UNINIT_VAR(c);
bool comment_closed;
int tokval, result_state;
uint length;
@@ -550,7 +550,6 @@ int MYSQLlex(void *arg, void *yythd)
lip->tok_start=lip->tok_end=lip->ptr;
state=lip->next_state;
lip->next_state=MY_LEX_OPERATOR_OR_IDENT;
- LINT_INIT(c);
for (;;)
{
switch (state) {
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index b670e6e3637..76d6833de5c 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -1474,12 +1474,8 @@ JOIN::optimize()
}
}
- /*
- If this join belongs to an uncacheable subquery save
- the original join
- */
- if (select_lex->uncacheable && !is_top_level_join() &&
- init_save_join_tab())
+ /* If this join belongs to an uncacheable query save the original join */
+ if (select_lex->uncacheable && init_save_join_tab())
DBUG_RETURN(-1); /* purecov: inspected */
}
@@ -3220,12 +3216,12 @@ add_key_equal_fields(KEY_FIELD **key_fields, uint and_level,
@retval FALSE it's something else
*/
-inline static bool
+static bool
is_local_field (Item *field)
{
- field= field->real_item();
- return field->type() == Item::FIELD_ITEM &&
- !((Item_field *)field)->depended_from;
+ return field->real_item()->type() == Item::FIELD_ITEM
+ && !(field->used_tables() & OUTER_REF_TABLE_BIT)
+ && !((Item_field *)field->real_item())->depended_from;
}
@@ -10484,9 +10480,8 @@ do_select(JOIN *join,List<Item> *fields,TABLE *table,Procedure *procedure)
{
int rc= 0;
enum_nested_loop_state error= NESTED_LOOP_OK;
- JOIN_TAB *join_tab;
+ JOIN_TAB *UNINIT_VAR(join_tab);
DBUG_ENTER("do_select");
- LINT_INIT(join_tab);
join->procedure=procedure;
join->tmp_table= table; /* Save for easy recursion */
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 5a3100685e0..e32c17bc678 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -2741,8 +2741,13 @@ int reassign_keycache_tables(THD *thd, KEY_CACHE *src_cache,
bool mysql_preload_keys(THD* thd, TABLE_LIST* tables)
{
DBUG_ENTER("mysql_preload_keys");
+ /*
+ We cannot allow concurrent inserts. The storage engine reads
+ directly from the index file, bypassing the cache. It could read
+ outdated information if parallel inserts into cache blocks happen.
+ */
DBUG_RETURN(mysql_admin_table(thd, tables, 0,
- "preload_keys", TL_READ, 0, 0, 0, 0,
+ "preload_keys", TL_READ_NO_INSERT, 0, 0, 0, 0,
&handler::preload_keys, 0));
}
diff --git a/sql/udf_example.c b/sql/udf_example.c
index db48984eed8..019d4d834dd 100644
--- a/sql/udf_example.c
+++ b/sql/udf_example.c
@@ -139,10 +139,10 @@ typedef long long longlong;
#include <mysql.h>
#include <ctype.h>
-static pthread_mutex_t LOCK_hostname;
-
#ifdef HAVE_DLOPEN
+static pthread_mutex_t LOCK_hostname;
+
/* These must be right or mysqld will not find the symbol! */
my_bool metaphon_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
diff --git a/support-files/binary-configure.sh b/support-files/binary-configure.sh
index 884a8363e22..5e6d62f69a0 100644
--- a/support-files/binary-configure.sh
+++ b/support-files/binary-configure.sh
@@ -1,4 +1,28 @@
#!/bin/sh
+
+SCRIPT_NAME="`basename $0`"
+
+usage()
+{
+ echo "Usage: ${SCRIPT_NAME} [--help|-h]"
+ echo ""
+ echo "This script creates the MySQL system tables and starts the server."
+}
+
+for arg do
+ case "$arg" in
+ --help|-h)
+ usage
+ exit 0
+ ;;
+ *)
+ echo "${SCRIPT_NAME}: unknown option $arg"
+ usage
+ exit 2
+ ;;
+ esac
+done
+
if test ! -x ./scripts/mysql_install_db
then
echo "I didn't find the script './scripts/mysql_install_db'."