From 37ddcebad2df1bad985a07274f20e1a878dbacbf Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 28 Jul 2003 18:28:44 +0300 Subject: [PATCH 01/15] tabe & query hashes made case insensitive (BUG#933) mysql-test/r/query_cache.result: fixed charecter sets new case sensetive test mysql-test/t/query_cache.test: fixed charecter sets new case sensetive test sql/sql_cache.cc: query & table comparision should be case insensitive --- mysql-test/r/query_cache.result | 34 +++++++++++++++++++++------------ mysql-test/t/query_cache.test | 14 ++++++++++++-- sql/sql_cache.cc | 4 ++-- 3 files changed, 36 insertions(+), 16 deletions(-) diff --git a/mysql-test/r/query_cache.result b/mysql-test/r/query_cache.result index 3b3e52d8240..68ddb5a377b 100644 --- a/mysql-test/r/query_cache.result +++ b/mysql-test/r/query_cache.result @@ -374,22 +374,23 @@ drop database mysqltest; show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 0 -create table t1 (a char(1) not null); -insert into t1 values("á"); +create table t1 (a char(1) not null collate koi8r_general_ci); +insert into t1 values(_koi8r"á"); +set CHARACTER SET koi8r; select * from t1; a á set CHARACTER SET cp1251_koi8; select * from t1; a -á +À set CHARACTER SET DEFAULT; show status like "Qcache_queries_in_cache"; Variable_name Value -Qcache_queries_in_cache 1 +Qcache_queries_in_cache 2 show status like "Qcache_hits"; Variable_name Value -Qcache_hits 5 +Qcache_hits 4 drop table t1; create database if not exists mysqltest; create table mysqltest.t1 (i int not null); @@ -415,7 +416,7 @@ Variable_name Value Qcache_queries_in_cache 2 show status like "Qcache_hits"; Variable_name Value -Qcache_hits 7 +Qcache_hits 6 drop database mysqltest; drop table t1; create table t1 (i int not null); @@ -429,7 +430,7 @@ FOUND_ROWS() 4 show status like "Qcache_hits"; Variable_name Value -Qcache_hits 7 +Qcache_hits 6 show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 1 @@ -441,7 +442,7 @@ FOUND_ROWS() 1 show status like "Qcache_hits"; Variable_name Value -Qcache_hits 7 +Qcache_hits 6 show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 2 @@ -454,7 +455,7 @@ FOUND_ROWS() 4 show status like "Qcache_hits"; Variable_name Value -Qcache_hits 8 +Qcache_hits 7 show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 2 @@ -466,7 +467,7 @@ FOUND_ROWS() 1 show status like "Qcache_hits"; Variable_name Value -Qcache_hits 9 +Qcache_hits 8 show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 2 @@ -535,7 +536,7 @@ a 3 show status like "Qcache_hits"; Variable_name Value -Qcache_hits 12 +Qcache_hits 11 show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 2 @@ -552,7 +553,7 @@ a 3 show status like "Qcache_hits"; Variable_name Value -Qcache_hits 13 +Qcache_hits 12 show status like "Qcache_queries_in_cache"; Variable_name Value Qcache_queries_in_cache 2 @@ -561,6 +562,15 @@ set GLOBAL query_cache_min_res_unit=default; show global variables like "query_cache_min_res_unit"; Variable_name Value query_cache_min_res_unit 4096 +create table t1 (a int not null); +insert into t1 values (1); +select "aaa" from t1; +aaa +aaa +select "AAA" from t1; +AAA +AAA +drop table t1; create table t1 (a int); set GLOBAL query_cache_size=1000; show global variables like "query_cache_size"; diff --git a/mysql-test/t/query_cache.test b/mysql-test/t/query_cache.test index 929146ba97a..6261260115c 100644 --- a/mysql-test/t/query_cache.test +++ b/mysql-test/t/query_cache.test @@ -260,8 +260,9 @@ show status like "Qcache_queries_in_cache"; # # Charset convertion (cp1251_koi8 always present) # -create table t1 (a char(1) not null); -insert into t1 values("á"); +create table t1 (a char(1) not null collate koi8r_general_ci); +insert into t1 values(_koi8r"á"); +set CHARACTER SET koi8r; select * from t1; set CHARACTER SET cp1251_koi8; select * from t1; @@ -368,6 +369,15 @@ drop table t2; set GLOBAL query_cache_min_res_unit=default; show global variables like "query_cache_min_res_unit"; +# +# Case sensitive test +# +create table t1 (a int not null); +insert into t1 values (1); +select "aaa" from t1; +select "AAA" from t1; +drop table t1; + # # Test of query cache resizing # diff --git a/sql/sql_cache.cc b/sql/sql_cache.cc index ac6471e794c..767a1a46dcc 100644 --- a/sql/sql_cache.cc +++ b/sql/sql_cache.cc @@ -1422,10 +1422,10 @@ ulong Query_cache::init_cache() DUMP(this); - VOID(hash_init(&queries,system_charset_info,def_query_hash_size, 0, 0, + VOID(hash_init(&queries, &my_charset_bin, def_query_hash_size, 0, 0, query_cache_query_get_key, 0, 0)); #ifndef FN_NO_CASE_SENCE - VOID(hash_init(&tables,system_charset_info,def_table_hash_size, 0, 0, + VOID(hash_init(&tables, &my_charset_bin, def_table_hash_size, 0, 0, query_cache_table_get_key, 0, 0)); #else // windows, OS/2 or other case insensitive file names work around From 0792c1c8243d8b340a343586d0ea6bb8427691f6 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 29 Jul 2003 13:00:32 +0300 Subject: [PATCH 02/15] count HAVING clause elements with select list elements, because agregate function can be present in it (BUG#922) removerd unused loop_id mysql-test/r/subselect.result: test of BUG#922 mysql-test/t/subselect.test: test of BUG#922 sql/item.cc: removerd unused loop_id we need count HAVING clause elements, because agregate function can be present in it sql/item.h: removerd unused loop_id sql/item_subselect.cc: new name of field sql/sql_derived.cc: new name of field sql/sql_lex.cc: new name of field sql/sql_lex.h: new name of field sql/sql_select.cc: new name of field sql/sql_union.cc: new name of field --- mysql-test/r/subselect.result | 7 +++++++ mysql-test/t/subselect.test | 13 ++++++++++++- sql/item.cc | 13 ++++++++----- sql/item.h | 1 - sql/item_subselect.cc | 2 +- sql/sql_derived.cc | 3 ++- sql/sql_lex.cc | 2 +- sql/sql_lex.h | 8 ++++++-- sql/sql_select.cc | 3 ++- sql/sql_union.cc | 3 ++- 10 files changed, 41 insertions(+), 14 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index bba86ff8891..f0cf2fa6be2 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1225,3 +1225,10 @@ a (select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 an 2 2 1 2 drop table t1,t2,t3; +create table t1 (s1 int); +create table t2 (s1 int); +insert into t1 values (1); +insert into t2 values (1); +select * from t1 where exists (select s1 from t2 having max(t2.s1)=t1.s1); +s1 +drop table t1,t2; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 66d8dd2bc32..f4b0cd5ca23 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -807,6 +807,7 @@ INSERT INTO t1 VALUES("2f6161e879db43c1a5b82c21ddc49089", "Default", "System", " INSERT INTO t1 VALUES("c373e9f5ad0791724315444553544200", "AddDocumentTest", "admin", "2003-06-09 10:51:25", "Movie Reviews", "0", "2003-06-09 10:51:25", "admin", "0", "2f6161e879db43c1a5b82c21ddc49089", "03eea05112b845949f3fd03278b5fe43", NULL); SELECT 'c373e9f5ad0791a0dab5444553544200' IN(SELECT t1.FOLDERID FROM t1 WHERE t1.PARENTID='2f6161e879db43c1a5b82c21ddc49089' AND t1.FOLDERNAME = 'Level1'); drop table t1; + # # alloc_group_fields() working # @@ -817,4 +818,14 @@ insert into t1 values (0,100),(1,2), (1,3), (2,2), (2,7), (2,-1), (3,10); insert into t2 values (0,0), (1,1), (2,1), (3,1), (4,1); insert into t3 values (3,3), (2,2), (1,1); select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3; -drop table t1,t2,t3;s +drop table t1,t2,t3; + +# +# aggregate functions in HAVING test +# +create table t1 (s1 int); +create table t2 (s1 int); +insert into t1 values (1); +insert into t2 values (1); +select * from t1 where exists (select s1 from t2 having max(t2.s1)=t1.s1); +drop table t1,t2; diff --git a/sql/item.cc b/sql/item.cc index 072dec4e6a6..74c64dffe98 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -49,15 +49,19 @@ Item::Item(): THD *thd= current_thd; next= thd->free_list; // Put in free list thd->free_list= this; - loop_id= 0; /* Item constructor can be called during execution other tnen SQL_COM command => we should check thd->lex.current_select on zero (thd->lex can be uninitialised) */ - if (thd->lex.current_select && - thd->lex.current_select->parsing_place == SELECT_LEX_NODE::SELECT_LIST) - thd->lex.current_select->select_items++; + if (thd->lex.current_select) + { + SELECT_LEX_NODE::enum_parsing_place place= + thd->lex.current_select->parsing_place; + if (place == SELECT_LEX_NODE::SELECT_LIST || + place == SELECT_LEX_NODE::IN_HAVING) + thd->lex.current_select->select_n_having_items++; + } } /* @@ -66,7 +70,6 @@ Item::Item(): tables */ Item::Item(THD *thd, Item &item): - loop_id(0), str_value(item.str_value), name(item.name), max_length(item.max_length), diff --git a/sql/item.h b/sql/item.h index 450cb396787..9df6532a637 100644 --- a/sql/item.h +++ b/sql/item.h @@ -83,7 +83,6 @@ public: }; class Item { - uint loop_id; /* Used to find selfrefering loops */ Item(const Item &); /* Prevent use of these */ void operator=(Item &); public: diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index cd78edfee7b..15ad64e44be 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -508,7 +508,7 @@ void Item_in_subselect::single_value_transformer(THD *thd, { sl->item_list.push_back(item); setup_ref_array(thd, &sl->ref_pointer_array, - 1 + sl->select_items + + 1 + sl->select_n_having_items + sl->order_list.elements + sl->group_list.elements); // To prevent crash on Item_ref_null_helper destruction in case of error sl->ref_pointer_array[0]= 0; diff --git a/sql/sql_derived.cc b/sql/sql_derived.cc index c61e8f42343..9ed26bc4062 100644 --- a/sql/sql_derived.cc +++ b/sql/sql_derived.cc @@ -126,7 +126,8 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, item_list= select_cursor->item_list; select_cursor->with_wild= 0; if (setup_ref_array(thd, &select_cursor->ref_pointer_array, - (item_list.elements + select_cursor->select_items + + (item_list.elements + + select_cursor->select_n_having_items + select_cursor->order_list.elements + select_cursor->group_list.elements)) || setup_fields(thd, select_cursor->ref_pointer_array, first_table, diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 16ebd758639..cc163dc3757 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -959,7 +959,7 @@ void st_select_lex_node::init_select() order_list.next= (byte**) &order_list.first; select_limit= HA_POS_ERROR; offset_limit= 0; - select_items= 0; + select_n_having_items= 0; with_sum_func= 0; parsing_place= SELECT_LEX_NODE::NO_MATTER; } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index faf7e16e54a..3b9f5906c21 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -205,8 +205,12 @@ public: ha_rows select_limit, offset_limit; /* LIMIT clause parameters */ // Arrays of pointers to top elements of all_fields list Item **ref_pointer_array; - - uint select_items; /* number of items in select_list */ + /* + number of items in select_list and HAVING clause used to get number + bigger then can be number of entries that will be added to all item + list during split_sum_func + */ + uint select_n_having_items; uint cond_count; /* number of arguments of and/or/xor in where/having */ enum_parsing_place parsing_place; /* where we are parsing expression */ bool with_sum_func; /* sum function indicator */ diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 0aa7e67a12b..7803e87572d 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -294,7 +294,8 @@ JOIN::prepare(Item ***rref_pointer_array, fields_list, &all_fields, wild_num))) || setup_ref_array(thd, rref_pointer_array, (fields_list.elements + - select_lex->select_items + + select_lex-> + select_n_having_items + og_num)) || setup_fields(thd, (*rref_pointer_array), tables_list, fields_list, 1, &all_fields, 1) || diff --git a/sql/sql_union.cc b/sql/sql_union.cc index 724cc658b15..5f3fbadc99a 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -159,7 +159,8 @@ int st_select_lex_unit::prepare(THD *thd, select_result *sel_result, item_list= select_cursor->item_list; select_cursor->with_wild= 0; if (setup_ref_array(thd, &select_cursor->ref_pointer_array, - (item_list.elements + select_cursor->select_items + + (item_list.elements + + select_cursor->select_n_having_items + select_cursor->order_list.elements + select_cursor->group_list.elements)) || setup_fields(thd, select_cursor->ref_pointer_array, first_table, From 668cd9729f8f1a35ebd6eb95bec9b612b7596f16 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 29 Jul 2003 16:59:46 +0300 Subject: [PATCH 03/15] prevented finding references in item_list for non-SELECT st_select_lex (fixed BUG#943) mysql-test/r/subselect.result: test for bug 943 mysql-test/t/subselect.test: test for bug 943 sql/item.cc: bool field changed with enum prevented finding references in item_list for non-SELECT st_select_lex sql/sql_lex.cc: bool field changed with enum sql/sql_lex.h: bool field changed with enum sql/sql_parse.cc: all subqueries and UNION parts marked as SELECT sql/sql_yacc.yy: bool field changed with enum PRIMARY SELECT command st_select_lex marked as SELECT --- mysql-test/r/subselect.result | 7 +++++++ mysql-test/t/subselect.test | 15 ++++++++++++++- sql/item.cc | 11 +++++++---- sql/sql_lex.cc | 3 ++- sql/sql_lex.h | 17 +++++++++++++++-- sql/sql_parse.cc | 2 ++ sql/sql_yacc.yy | 13 +++++++++---- 7 files changed, 56 insertions(+), 12 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index bba86ff8891..7e07371c103 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1225,3 +1225,10 @@ a (select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 an 2 2 1 2 drop table t1,t2,t3; +create table t1 (s1 int); +create table t2 (s1 int); +insert into t1 values (1); +insert into t2 values (1); +update t1 set s1 = s1 + 1 where 1 = (select x.s1 as A from t2 WHERE t2.s1 > t1.s1 order by A); +ERROR 42S02: Unknown table 'x' in field list +DROP TABLE t1, t2; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 66d8dd2bc32..874bd008f94 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -817,4 +817,17 @@ insert into t1 values (0,100),(1,2), (1,3), (2,2), (2,7), (2,-1), (3,10); insert into t2 values (0,0), (1,1), (2,1), (3,1), (4,1); insert into t3 values (3,3), (2,2), (1,1); select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3; -drop table t1,t2,t3;s +drop table t1,t2,t3; + +# +# update subquery with wrong field (to force name resolving +# in UPDATE name space) +# +create table t1 (s1 int); +create table t2 (s1 int); +insert into t1 values (1); +insert into t2 values (1); +-- error 1109 +update t1 set s1 = s1 + 1 where 1 = (select x.s1 as A from t2 WHERE t2.s1 > t1.s1 order by A); +DROP TABLE t1, t2; + diff --git a/sql/item.cc b/sql/item.cc index 072dec4e6a6..db9708c9f21 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -862,7 +862,7 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) sl= sl->outer_select()) { table_list= (last= sl)->get_table_list(); - if (sl->insert_select && table_list) + if (sl->resolve_mode == SELECT_LEX::INSERT_MODE && table_list) { // it is primary INSERT st_select_lex => skip first table resolving table_list= table_list->next; @@ -871,7 +871,8 @@ bool Item_field::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) table_list, &where, 0)) != not_found_field) break; - if ((refer= find_item_in_list(this, sl->item_list, &counter, + if (sl->resolve_mode == SELECT_LEX::SELECT_MODE && + (refer= find_item_in_list(this, sl->item_list, &counter, REPORT_EXCEPT_NOT_FOUND)) != (Item **) not_found_item) break; @@ -1348,13 +1349,15 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) SELECT_LEX *last=0; for ( ; sl ; sl= sl->outer_select()) { - if ((ref= find_item_in_list(this, (last= sl)->item_list, + last= sl; + if (sl->resolve_mode == SELECT_LEX::SELECT_MODE && + (ref= find_item_in_list(this, sl->item_list, &counter, REPORT_EXCEPT_NOT_FOUND)) != (Item **)not_found_item) break; table_list= sl->get_table_list(); - if (sl->insert_select && table_list) + if (sl->resolve_mode == SELECT_LEX::INSERT_MODE && table_list) { // it is primary INSERT st_select_lex => skip first table resolving table_list= table_list->next; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 16ebd758639..65469800a54 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -986,7 +986,8 @@ void st_select_lex::init_query() join= 0; where= 0; olap= UNSPECIFIED_OLAP_TYPE; - insert_select= having_fix_field= 0; + having_fix_field= 0; + resolve_mode= NOMATTER_MODE; with_wild= 0; } diff --git a/sql/sql_lex.h b/sql/sql_lex.h index faf7e16e54a..f9c0aec2fbc 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -360,14 +360,27 @@ public: bool braces; /* SELECT ... UNION (SELECT ... ) <- this braces */ /* TRUE when having fix field called in processing of this SELECT */ bool having_fix_field; + /* - TRUE for primary st_select_lex structure of simple INSERT/REPLACE + SELECT for SELECT command st_select_lex. Used to privent scaning + item_list of non-SELECT st_select_lex (no sense find to finding + reference in it (all should be in tables, it is dangerouse due + to order of fix_fields calling for non-SELECTs commands (item list + can be not fix_fieldsd)). This value will be assigned for + primary select (sql_yac.yy) and for any subquery and + UNION SELECT (sql_parse.cc mysql_new_select()) + + + INSERT for primary st_select_lex structure of simple INSERT/REPLACE (used for name resolution, see Item_fiels & Item_ref fix_fields, FALSE for INSERT/REPLACE ... SELECT, because it's st_select_lex->table_list will be preprocessed (first table removed) before passing to handle_select) + + NOMATTER for other */ - bool insert_select; + enum {NOMATTER_MODE, SELECT_MODE, INSERT_MODE} resolve_mode; + void init_query(); void init_select(); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 820bf3d73cc..9a62607bf93 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3550,6 +3550,7 @@ mysql_new_select(LEX *lex, bool move_down) unit->link_prev= 0; unit->return_to= lex->current_select; select_lex->include_down(unit); + // TODO: assign resolve_mode for fake subquery after merging with new tree } else select_lex->include_neighbour(lex->current_select); @@ -3557,6 +3558,7 @@ mysql_new_select(LEX *lex, bool move_down) select_lex->master_unit()->global_parameters= select_lex; select_lex->include_global((st_select_lex_node**)&lex->all_selects_list); lex->current_select= select_lex; + select_lex->resolve_mode= SELECT_LEX::SELECT_MODE; return 0; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index a5ac04dc775..38df3bf3a06 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -1910,7 +1910,12 @@ opt_ignore_leaves: select: - select_init { Lex->sql_command=SQLCOM_SELECT; }; + select_init + { + LEX *lex= Lex; + lex->sql_command= SQLCOM_SELECT; + lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE; + }; /* Need select_init2 for subselects. */ select_init: @@ -3401,7 +3406,7 @@ insert: lex->sql_command = SQLCOM_INSERT; /* for subselects */ lex->lock_option= (using_update_log) ? TL_READ_NO_INSERT : TL_READ; - lex->select_lex.insert_select= 1; + lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE; } insert_lock_option opt_ignore insert2 { @@ -3417,7 +3422,7 @@ replace: LEX *lex=Lex; lex->sql_command = SQLCOM_REPLACE; lex->duplicates= DUP_REPLACE; - lex->select_lex.insert_select= 1; + lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE; } replace_lock_option insert2 { @@ -3486,7 +3491,7 @@ insert_values: it is not simple select => table list will be preprocessed before passing to handle_select */ - lex->select_lex.insert_select= 0; + lex->select_lex.resolve_mode= SELECT_LEX::NOMATTER_MODE; lex->current_select->parsing_place= SELECT_LEX_NODE::SELECT_LIST; } select_options select_item_list From 9149ca11e6179987fd29a34629d2f0f5eef58340 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 29 Jul 2003 12:51:24 -0500 Subject: [PATCH 04/15] README.1st: Revise 4.1 Windows-install instructions. Docs/README.1st: Revise 4.1 Windows-install instructions. --- Docs/README.1st | 62 ++++++++++++++++++++++++++++++------------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/Docs/README.1st b/Docs/README.1st index a6da0680924..980c043224a 100755 --- a/Docs/README.1st +++ b/Docs/README.1st @@ -1,6 +1,6 @@ -This ALPHA build of MySQL 4.1 for the Windows platform does not come with -an installer. A full-featured installer is being developed for -the 4.1 series, and it is scheduled to be released with MySQL 4.1 BETA. +This ALPHA build of MySQL 4.1 for the Windows platform does not come +with an installer. A full-featured installer is being developed for the +4.1 series, and it is scheduled to be released with MySQL 4.1 BETA. ** FRESH INSTALL ** @@ -14,49 +14,63 @@ in the user manual for starting/stopping MySQL: ** UPGRADE INSTALL ** -To install MySQL 4.1 as an upgrade to your current MySQL version, you need +To install MySQL 4.1 as an upgrade to your current version of MySQL, you need to perform the following steps: -* Backup your original install (always a good idea!) -* Unzip this archive to a separate directory from your currently - installed MySQL database (or don't unpack the 'Data' subdirectory - when unzipping this archive, otherwise your databases will be over- - written). +* Back up your original installation (always a good idea!) + +* Unzip the 4.1 archive to a directory that is different than where your + current MySQL installation is located. (Or, if you do unzip this + archive into the same location as your existing installation, do NOT + unpack the 'data' subdirectory. If you unpack the 'data' directory, + your existing databases will be overwritten.) -* Shutdown all mysql server processes/services -* Remove the Win32 Service (if appropriate for your OS): +* Shut down all MySQL server processes/services. + +* Remove the Win32 MySQL service (if appropriate for your OS): c:\mysql\bin\mysqld-nt --remove * Exit 'WinMySQLAdmin' (if it is running). -* If you unzipped this archive into a separate directory, copy all of the - directories and their contents from the location where you unzipped this - archive, excluding the 'data' directory, to the location - where your current MySQL server is installed. -* Start the MySQL server with the '--skip-grant-tables' option (assuming - your MySQL server is installed in 'c:\mysql'): + +* If you unzipped this archive into a directory different than that + of your existing MySQL installation, copy from the archive all its + directories and their contents EXCEPT the 'data' directory into the + existing installation. + +* Start the MySQL server with the '--skip-grant-tables' option. Assuming + your MySQL installation is located at 'c:\mysql', the command looks like + this: c:\mysql\bin\mysqld-opt --skip-grant-tables + + If your installation is located in some other directory, adjust the + pathname in that command (and in the following commands). -* Execute the 'mysql_fix_privilege_tables.sql' script in the 'scripts - directory: +* Execute the 'mysql_fix_privilege_tables.sql' script that is located in + the 'scripts' directory: - c:\mysql\bin\mysql < c:\mysql\scripts\mysql_fix_privilege_tables.sql + c:\mysql\bin\mysql -f mysql < c:\mysql\scripts\mysql_fix_privilege_tables.sql + + This script performs any actions necessary to convert your grant tables + to the current format. You may see some "duplicate column" warnings as + it runs; these can be ignored. -* Stop the server +* Stop the server: c:\mysql\bin\mysqladmin -u root shutdown -* Re-install the Win32 service (if required): +* Re-install the Win32 MySQL service (if required): c:\mysql\bin\mysqld-nt --install -* Re-start the server or service as normal. +* Re-start the server or service using your normal startup procedure. ** Further Questions ** You can find further information about running MySQL on Windows in the -manual that ships in the 'Doc' subdirectory, or at: +manual that ships in the 'Doc' subdirectory, or online at the MySQL AB +web site: http://www.mysql.com/doc/en/Windows.html From 0e3524dd887fd4e5091aeefbfe127abffc8cdeba Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 30 Jul 2003 02:01:53 -0700 Subject: [PATCH 05/15] Fix for timestamp issue (BR #819) tests/client_test.c: Updated test_ts() test (For BR# 819) --- sql/item.cc | 5 +++ tests/client_test.c | 78 ++++++++++++++++++++++++++++++--------------- 2 files changed, 58 insertions(+), 25 deletions(-) diff --git a/sql/item.cc b/sql/item.cc index 072dec4e6a6..de7bb2703ca 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -530,6 +530,11 @@ void Item_param::set_longdata(const char *str, ulong length) int Item_param::save_in_field(Field *field, bool no_conversions) { + THD *thd= current_thd; + + if (thd->command == COM_PREPARE) + return -1; + if (null_value) return (int) set_field_to_null(field); diff --git a/tests/client_test.c b/tests/client_test.c index 6ee7487ac45..6aeb865aa20 100644 --- a/tests/client_test.c +++ b/tests/client_test.c @@ -7467,24 +7467,26 @@ static void test_sqlmode() static void test_ts() { MYSQL_STMT *stmt; - MYSQL_BIND bind[2]; + MYSQL_BIND bind[6]; MYSQL_TIME ts; + MYSQL_RES *prep_res; char strts[30]; long length; - int rc; + int rc, field_count; + char name; myheader("test_ts"); rc = mysql_query(mysql,"DROP TABLE IF EXISTS test_ts"); myquery(rc); - rc= mysql_query(mysql,"CREATE TABLE test_ts(a TIMESTAMP)"); + rc= mysql_query(mysql,"CREATE TABLE test_ts(a DATE, b TIME, c TIMESTAMP)"); myquery(rc); rc = mysql_commit(mysql); myquery(rc); - stmt = mysql_prepare(mysql,"INSERT INTO test_ts VALUES(?),(?)",40); + stmt = mysql_prepare(mysql,"INSERT INTO test_ts VALUES(?,?,?),(?,?,?)",50); mystmt_init(stmt); ts.year= 2003; @@ -7495,17 +7497,21 @@ static void test_ts() ts.second= 46; length= (long)(strmov(strts,"2003-07-12 21:07:46") - strts); - bind[0].buffer_type= MYSQL_TYPE_STRING; - bind[0].buffer= (char *)strts; - bind[0].buffer_length= sizeof(strts); + bind[0].buffer_type= MYSQL_TYPE_TIMESTAMP; + bind[0].buffer= (char *)&ts; + bind[0].buffer_length= sizeof(ts); bind[0].is_null= 0; - bind[0].length= &length; + bind[0].length= 0; - bind[1].buffer_type= MYSQL_TYPE_TIMESTAMP; - bind[1].buffer= (char *)&ts; - bind[1].buffer_length= sizeof(ts); - bind[1].is_null= 0; - bind[1].length= 0; + bind[2]= bind[1]= bind[0]; + + bind[3].buffer_type= MYSQL_TYPE_STRING; + bind[3].buffer= (char *)strts; + bind[3].buffer_length= sizeof(strts); + bind[3].is_null= 0; + bind[3].length= &length; + + bind[5]= bind[4]= bind[3]; rc = mysql_bind_param(stmt, bind); mystmt(stmt,rc); @@ -7515,27 +7521,49 @@ static void test_ts() mysql_stmt_close(stmt); - verify_col_data("test_ts","a","2003-07-12 21:07:46"); + verify_col_data("test_ts","a","2003-07-12"); + verify_col_data("test_ts","b","21:07:46"); + verify_col_data("test_ts","c","2003-07-12 21:07:46"); - stmt = mysql_prepare(mysql,"SELECT a FROM test_ts WHERE a >= ?",50); + stmt = mysql_prepare(mysql,"SELECT * FROM test_ts",50); mystmt_init(stmt); - rc = mysql_bind_param(stmt, bind); - mystmt(stmt,rc); + prep_res = mysql_prepare_result(stmt); + mytest(prep_res); rc = mysql_execute(stmt); mystmt(stmt,rc); - rc = mysql_fetch(stmt); - mystmt(stmt,rc); - - rc = mysql_fetch(stmt); - mystmt(stmt,rc); - - rc = mysql_fetch(stmt); - myassert(rc == MYSQL_NO_DATA); + myassert( 2== my_process_stmt_result(stmt)); + field_count= mysql_num_fields(prep_res); + mysql_free_result(prep_res); mysql_stmt_close(stmt); + + for (name= 'a'; field_count--; name++) + { + int row_count= 0; + + sprintf(query,"SELECT a,b,c FROM test_ts WHERE %c=?",name); + length= (long)(strmov(query,query)- query); + + fprintf(stdout,"\n %s", query); + stmt = mysql_prepare(mysql, query, length); + mystmt_init(stmt); + + rc = mysql_bind_param(stmt, bind); + mystmt(stmt,rc); + + rc = mysql_execute(stmt); + mystmt(stmt,rc); + + while (mysql_fetch(stmt) == 0) + row_count++; + + fprintf(stdout, "\n returned '%d' rows", row_count); + myassert(row_count == 2); + mysql_stmt_close(stmt); + } } From 53e4153de12d9288d55294826dbf30e4ce508224 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 30 Jul 2003 14:15:25 +0500 Subject: [PATCH 06/15] Derivation attribute was not processed correctly by MAX/MIN in some cases: SELECT coercibility(max(s1)) from t1; Subselect collation and derivation was not processed correctly: create table a select (select s1 from t1); select * from t1 where s1 = (select s2 from t1); --- mysql-test/r/func_group.result | 6 ++++++ mysql-test/r/subselect.result | 13 +++++++++++++ mysql-test/t/func_group.test | 5 +++++ mysql-test/t/subselect.test | 13 ++++++++++++- sql/item.cc | 2 +- sql/item_subselect.cc | 2 ++ sql/item_sum.cc | 2 +- 7 files changed, 40 insertions(+), 3 deletions(-) diff --git a/mysql-test/r/func_group.result b/mysql-test/r/func_group.result index 26ef391024e..8fad9d16dc2 100644 --- a/mysql-test/r/func_group.result +++ b/mysql-test/r/func_group.result @@ -612,3 +612,9 @@ select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = Case When Count(*) < MAX_REQ Then 1 Else 0 End 1 drop table t1; +create table t1 (a char(10)); +insert into t1 values ('a'),('b'),('c'); +select coercibility(max(a)) from t1; +coercibility(max(a)) +3 +drop table t1; diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index bba86ff8891..7f2cb29dd4c 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1225,3 +1225,16 @@ a (select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 an 2 2 1 2 drop table t1,t2,t3; +create table t1 (a char(10) character set koi8r collate koi8r_bin); +create table t2 select (select a from t1); +show create table t2; +Table Create Table +t2 CREATE TABLE `t2` ( + `(select a from t1)` char(10) character set koi8r collate koi8r_bin default NULL +) TYPE=MyISAM CHARSET=latin1 +drop table t1,t2; +CREATE TABLE t1 +(s1 CHAR(5) COLLATE latin1_german1_ci, +s2 CHAR(5) COLLATE latin1_swedish_ci); +SELECT * FROM t1 WHERE s1 = (SELECT s2 FROM t1); +ERROR HY000: Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '=' diff --git a/mysql-test/t/func_group.test b/mysql-test/t/func_group.test index fed19cbe07c..8a43716d854 100644 --- a/mysql-test/t/func_group.test +++ b/mysql-test/t/func_group.test @@ -355,3 +355,8 @@ insert into t1 values (1, 3); select count(*) + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ + MAX_REQ - MAX_REQ from t1 group by MAX_REQ; select Case When Count(*) < MAX_REQ Then 1 Else 0 End from t1 where t1.USR_ID = 1 group by MAX_REQ; drop table t1; + +create table t1 (a char(10)); +insert into t1 values ('a'),('b'),('c'); +select coercibility(max(a)) from t1; +drop table t1; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index 66d8dd2bc32..e7c63098cab 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -817,4 +817,15 @@ insert into t1 values (0,100),(1,2), (1,3), (2,2), (2,7), (2,-1), (3,10); insert into t2 values (0,0), (1,1), (2,1), (3,1), (4,1); insert into t3 values (3,3), (2,2), (1,1); select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3; -drop table t1,t2,t3;s +drop table t1,t2,t3; + +create table t1 (a char(10) character set koi8r collate koi8r_bin); +create table t2 select (select a from t1); +show create table t2; +drop table t1,t2; + +CREATE TABLE t1 +(s1 CHAR(5) COLLATE latin1_german1_ci, + s2 CHAR(5) COLLATE latin1_swedish_ci); +--error 1265 +SELECT * FROM t1 WHERE s1 = (SELECT s2 FROM t1); diff --git a/sql/item.cc b/sql/item.cc index 072dec4e6a6..ee8b77881cb 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -1442,7 +1442,7 @@ bool Item_ref::fix_fields(THD *thd,TABLE_LIST *tables, Item **reference) max_length= (*ref)->max_length; maybe_null= (*ref)->maybe_null; decimals= (*ref)->decimals; - set_charset((*ref)->charset()); + collation.set((*ref)->collation); with_sum_func= (*ref)->with_sum_func; fixed= 1; diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index cd78edfee7b..26f8313159f 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -759,6 +759,7 @@ static Item_result set_row(SELECT_LEX *select_lex, Item * item, if (!(row[i]= Item_cache::get_cache(res_type))) return STRING_RESULT; // we should return something row[i]->set_len_n_dec(sel_item->max_length, sel_item->decimals); + row[i]->collation.set(sel_item->collation); } } if (select_lex->item_list.elements > 1) @@ -770,6 +771,7 @@ void subselect_single_select_engine::fix_length_and_dec(Item_cache **row) { DBUG_ASSERT(row || select_lex->item_list.elements==1); res_type= set_row(select_lex, item, row, &maybe_null); + item->collation.set(row[0]->collation); if (cols() != 1) maybe_null= 0; } diff --git a/sql/item_sum.cc b/sql/item_sum.cc index 8d3d0de466a..aa146926eb5 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -199,7 +199,7 @@ Item_sum_hybrid::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) decimals=item->decimals; maybe_null=item->maybe_null; unsigned_flag=item->unsigned_flag; - set_charset(item->charset()); + collation.set(item->collation); result_field=0; null_value=1; fix_length_and_dec(); From 4ee94d21f35ef40a3d950f5970190b7ffe12d8be Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 30 Jul 2003 17:51:42 +0500 Subject: [PATCH 07/15] Database name and national characters fixes. --- mysql-test/r/ctype_recoding.result | 14 ++++++++++++++ mysql-test/t/ctype_recoding.test | 11 +++++++++++ sql/sql_parse.cc | 19 +++++++++++++++---- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/ctype_recoding.result b/mysql-test/r/ctype_recoding.result index 23a90be1306..b89a90cc6ba 100644 --- a/mysql-test/r/ctype_recoding.result +++ b/mysql-test/r/ctype_recoding.result @@ -42,3 +42,17 @@ Field Type Null Key Default Extra SET CHARACTER SET koi8r; DROP TABLE ÔÁÂÌÉÃÁ; SET CHARACTER SET default; +SET CHARACTER SET koi8r; +CREATE DATABASE ÔÅÓÔ; +USE ÔÅÓÔ; +SHOW TABLES; +Tables_in_ÔÅÓÔ +SHOW TABLES IN ÔÅÓÔ; +Tables_in_ÔÅÓÔ +SET CHARACTER SET cp1251; +SHOW TABLES; +Tables_in_òåñò +SHOW TABLES IN òåñò; +Tables_in_òåñò +SET CHARACTER SET koi8r; +DROP DATABASE ÔÅÓÔ; diff --git a/mysql-test/t/ctype_recoding.test b/mysql-test/t/ctype_recoding.test index 68526806166..8fa31b1f17b 100644 --- a/mysql-test/t/ctype_recoding.test +++ b/mysql-test/t/ctype_recoding.test @@ -27,3 +27,14 @@ SHOW FIELDS FROM таблица; SET CHARACTER SET koi8r; DROP TABLE ÔÁÂÌÉÃÁ; SET CHARACTER SET default; + +SET CHARACTER SET koi8r; +CREATE DATABASE ÔÅÓÔ; +USE ÔÅÓÔ; +SHOW TABLES; +SHOW TABLES IN ÔÅÓÔ; +SET CHARACTER SET cp1251; +SHOW TABLES; +SHOW TABLES IN òåñò; +SET CHARACTER SET koi8r; +DROP DATABASE ÔÅÓÔ; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 820bf3d73cc..720017f399f 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -549,6 +549,7 @@ check_connections(THD *thd) char *end, *user, *passwd, *db; char prepared_scramble[SCRAMBLE41_LENGTH+4]; /* Buffer for scramble&hash */ ACL_USER* cached_user=NULL; /* Initialise to NULL for first stage */ + String convdb; DBUG_PRINT("info",("New connection received on %s", vio_description(net->vio))); @@ -724,7 +725,12 @@ check_connections(THD *thd) db=0; using_password= test(passwd[0]); if (thd->client_capabilities & CLIENT_CONNECT_WITH_DB) + { db=strend(passwd)+1; + convdb.copy(db, strlen(db), + thd->variables.character_set_client, system_charset_info); + db= convdb.c_ptr(); + } /* We can get only old hash at this point */ if (using_password && strlen(passwd) != SCRAMBLE_LENGTH) @@ -1125,10 +1131,15 @@ bool dispatch_command(enum enum_server_command command, THD *thd, thd->lex.select_lex.options=0; // We store status here switch (command) { case COM_INIT_DB: - statistic_increment(com_stat[SQLCOM_CHANGE_DB],&LOCK_status); - if (!mysql_change_db(thd,packet)) - mysql_log.write(thd,command,"%s",thd->db); - break; + { + String convname; + statistic_increment(com_stat[SQLCOM_CHANGE_DB],&LOCK_status); + convname.copy(packet, strlen(packet), + thd->variables.character_set_client, system_charset_info); + if (!mysql_change_db(thd,convname.c_ptr())) + mysql_log.write(thd,command,"%s",thd->db); + break; + } #ifndef EMBEDDED_LIBRARY case COM_REGISTER_SLAVE: { From 79fea68bd7da9735fdbb9d6e4c40879d0e72ff70 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 31 Jul 2003 08:33:59 +0500 Subject: [PATCH 08/15] cp1251.xml: Upper/lower case translation bug for letter 't' fix. sql/share/charsets/cp1251.xml: Upper/lower case translation bug for letter 't' fix. --- sql/share/charsets/cp1251.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sql/share/charsets/cp1251.xml b/sql/share/charsets/cp1251.xml index 795022cc179..94774cca0f1 100644 --- a/sql/share/charsets/cp1251.xml +++ b/sql/share/charsets/cp1251.xml @@ -34,9 +34,9 @@ 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F - 70 71 72 73 54 75 76 77 78 79 7A 5B 5C 5D 5E 5F + 70 71 72 73 74 75 76 77 78 79 7A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F - 70 71 72 73 54 75 76 77 78 79 7A 7B 7C 7D 7E 7F + 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 90 83 82 83 84 85 86 87 88 89 9A 8B 9C 9D 9E 9F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A2 A2 BC A4 B4 A6 A7 B8 A9 BA AB AC AD AE BF @@ -56,9 +56,9 @@ 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F - 50 51 52 53 74 55 56 57 58 59 5A 5B 5C 5D 5E 5F + 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F - 50 51 52 53 74 55 56 57 58 59 5A 7B 7C 7D 7E 7F + 50 51 52 53 54 55 56 57 58 59 5A 7B 7C 7D 7E 7F 80 81 82 81 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 80 91 92 93 94 95 96 97 98 99 8A 9B 8C 9D 8E 8F A0 A1 A1 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF From cce9e51a708f46fa1915208762864d83df6e5a8c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 31 Jul 2003 09:00:22 +0500 Subject: [PATCH 09/15] mysqldump.c: Use the default character set instead of binary. This is to make "mysqlshow" -> "cat'n'paste database name" -> "mysqldump dbname" circle working. client/mysqldump.c: Use the default character set instead of binary. This is to make "mysqlshow" -> "cat'n'paste database name" -> "mysqldump dbname" circle working. --- client/mysqldump.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/mysqldump.c b/client/mysqldump.c index 4eb6d74cdf1..2c8628d10a8 100644 --- a/client/mysqldump.c +++ b/client/mysqldump.c @@ -86,9 +86,10 @@ static MYSQL mysql_connection,*sock=0; static char insert_pat[12 * 1024],*opt_password=0,*current_user=0, *current_host=0,*path=0,*fields_terminated=0, *lines_terminated=0, *enclosed=0, *opt_enclosed=0, *escaped=0, - *where=0, *default_charset= (char *) "binary", + *where=0, *opt_compatible_mode_str= 0, *err_ptr= 0; +static char *default_charset= (char*) MYSQL_DEFAULT_CHARSET_NAME; static ulong opt_compatible_mode= 0; static uint opt_mysql_port= 0, err_len= 0; static my_string opt_mysql_unix_port=0; From 7fc417047d6165bcd93dfcd88554bb4d068a7320 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 1 Aug 2003 18:49:30 +0400 Subject: [PATCH 10/15] added disable_query_log to fulltext2.test mysql-test/r/fulltext2.result: result updated mysql-test/t/fulltext2.test: test is now more silent BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted --- BitKeeper/etc/logging_ok | 1 + mysql-test/r/fulltext2.result | 765 ---------------------------------- mysql-test/t/fulltext2.test | 2 + 3 files changed, 3 insertions(+), 765 deletions(-) diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index bc24761c7f9..c8d953324f0 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -53,6 +53,7 @@ jcole@sarvik.tfr.cafe.ee jcole@tetra.spaceapes.com jorge@linux.jorge.mysql.com kaj@work.mysql.com +kostja@oak.local lenz@kallisto.mysql.com lenz@mysql.com miguel@hegel.(none) diff --git a/mysql-test/r/fulltext2.result b/mysql-test/r/fulltext2.result index 8086faadba4..a35be210ece 100644 --- a/mysql-test/r/fulltext2.result +++ b/mysql-test/r/fulltext2.result @@ -4,771 +4,6 @@ i int(10) unsigned not null auto_increment primary key, a varchar(255) not null, FULLTEXT KEY (a) ) TYPE=MyISAM; -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaaxxx'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaazzz'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); -insert t1 (a) values ('aaayyy'); repair table t1 quick; Table Op Msg_type Msg_text test.t1 repair status OK diff --git a/mysql-test/t/fulltext2.test b/mysql-test/t/fulltext2.test index 2c0d352a870..b739d60e3b3 100644 --- a/mysql-test/t/fulltext2.test +++ b/mysql-test/t/fulltext2.test @@ -17,6 +17,7 @@ CREATE TABLE t1 ( ) TYPE=MyISAM; # two-level entry, second-level tree with depth 2 +--disable_query_log let $1=260; while ($1) { @@ -39,6 +40,7 @@ while ($1) eval insert t1 (a) values ('aaayyy'); dec $1; } +--enable_query_log # converting to two-level repair table t1 quick; From e56fcb4221b85930f118ea43962972352777bdfd Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 1 Aug 2003 19:04:35 +0300 Subject: [PATCH 11/15] merge fix --- mysql-test/t/subselect.test | 2 -- 1 file changed, 2 deletions(-) diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index c6cc82e5f92..1d7da94d455 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -820,8 +820,6 @@ insert into t3 values (3,3), (2,2), (1,1); select a,(select count(distinct t1.b) as sum from t1,t2 where t1.a=t2.a and t2.b > 0 and t1.a <= t3.b group by t1.a order by sum limit 1) from t3; drop table t1,t2,t3; -drop table t1; - # # aggregate functions in HAVING test # From a7eb7a78ddc49c32f0d651eb83d1d34a0e8b6756 Mon Sep 17 00:00:00 2001 From: unknown Date: Sat, 2 Aug 2003 17:23:39 +0200 Subject: [PATCH 12/15] There were two wrong calls to tables_ok() in MySQL 4.0 (BUG#980), which are fixed now. In 4.1 there are 3 calls; 2 of them will be fixed when there is a merge; here I fix the 3rd, new one. --- sql/sql_acl.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 51c05ccbf33..f89341a18dd 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -3221,8 +3221,17 @@ int open_grant_tables(THD *thd, TABLE_LIST *tables) GRANT and REVOKE are applied the slave in/exclusion rules as they are some kind of updates to the mysql.% tables. */ - if (thd->slave_thread && table_rules_on && !tables_ok(0, tables)) - DBUG_RETURN(1); + if (thd->slave_thread && table_rules_on) + { + /* + The tables must be marked "updating" so that tables_ok() takes them into + account in tests. + */ + tables[0].updating=tables[1].updating=tables[2].updating=tables[3].updating=1; + if (!tables_ok(0, tables)) + DBUG_RETURN(1); + tables[0].updating=tables[1].updating=tables[2].updating=tables[3].updating=0; + } #endif if (open_and_lock_tables(thd, tables)) From 691b7584fb3bc42b70fe470ba5fa812d28190141 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 5 Aug 2003 10:08:16 +0500 Subject: [PATCH 13/15] fix_fields recoursion didn't stop when some level's fix_length_and_dec produced an error. This led to server crash in some cases, e.g.: create table t7 (s1 char); select * from t7 where concat(s1 collate latin1_general_ci,s1 collate latin1_swedish_ci) = 'AA'; --- mysql-test/r/func_str.result | 5 +++++ mysql-test/t/func_str.test | 10 ++++++++++ sql/item_func.cc | 2 ++ 3 files changed, 17 insertions(+) diff --git a/mysql-test/r/func_str.result b/mysql-test/r/func_str.result index 37694ad2f0a..929ab0535d8 100644 --- a/mysql-test/r/func_str.result +++ b/mysql-test/r/func_str.result @@ -553,3 +553,8 @@ SUBSTR('abcdefg',-1,-1) select SUBSTR('abcdefg',1,-1) FROM DUAL; SUBSTR('abcdefg',1,-1) +create table t7 (s1 char); +select * from t7 +where concat(s1 collate latin1_general_ci,s1 collate latin1_swedish_ci) = 'AA'; +ERROR HY000: Illegal mix of collations (latin1_general_ci,EXPLICIT) and (latin1_swedish_ci,EXPLICIT) for operation 'concat' +drop table t7; diff --git a/mysql-test/t/func_str.test b/mysql-test/t/func_str.test index f158eaa3764..4c996121446 100644 --- a/mysql-test/t/func_str.test +++ b/mysql-test/t/func_str.test @@ -305,3 +305,13 @@ select SUBSTR('abcdefg',-1,5) FROM DUAL; select SUBSTR('abcdefg',0,0) FROM DUAL; select SUBSTR('abcdefg',-1,-1) FROM DUAL; select SUBSTR('abcdefg',1,-1) FROM DUAL; + +# +# Test that fix_fields doesn't follow to upper level (to comparison) +# when an error on a lower level (in concat) has accured: +# +create table t7 (s1 char); +--error 1265 +select * from t7 +where concat(s1 collate latin1_general_ci,s1 collate latin1_swedish_ci) = 'AA'; +drop table t7; diff --git a/sql/item_func.cc b/sql/item_func.cc index 9ecc062d645..e1092dda857 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -192,6 +192,8 @@ Item_func::fix_fields(THD *thd, TABLE_LIST *tables, Item **ref) } } fix_length_and_dec(); + if (thd && thd->net.last_errno) // An error inside fix_length_and_dec accured + return 1; fixed= 1; return 0; } From fc8b138544c6edb34a1bc26b8cc8b69630bb81b5 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 5 Aug 2003 11:03:05 +0500 Subject: [PATCH 14/15] Fix: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CREATE TABLE t1 (s1 CHAR(5) CHARACTER SET latin1 COLLATE latin1_german2_ci); INSERT INTO t1 VALUES ('Ü'); INSERT INTO t1 VALUES ('ue'); SELECT DISTINCT s1 FROM t1; The above returned two rows in error. Now it returns one row, in latin1_german2_ci: Ü == ue --- heap/hp_hash.c | 10 ++++++---- mysql-test/r/ctype_latin1_de.result | 15 +++++++++++++++ mysql-test/t/ctype_latin1_de.test | 10 ++++++++++ sql/item_sum.cc | 4 +++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/heap/hp_hash.c b/heap/hp_hash.c index 2a946dcd7b9..2843407f3fe 100644 --- a/heap/hp_hash.c +++ b/heap/hp_hash.c @@ -371,8 +371,9 @@ int hp_rec_key_cmp(HP_KEYDEF *keydef, const byte *rec1, const byte *rec2) } if (seg->type == HA_KEYTYPE_TEXT) { - if (my_strnncoll(seg->charset,(uchar*) rec1+seg->start,seg->length, - (uchar*) rec2+seg->start,seg->length)) + if (seg->charset->coll->strnncollsp(seg->charset, + (uchar*) rec1+seg->start,seg->length, + (uchar*) rec2+seg->start,seg->length)) return 1; } else @@ -404,8 +405,9 @@ int hp_key_cmp(HP_KEYDEF *keydef, const byte *rec, const byte *key) } if (seg->type == HA_KEYTYPE_TEXT) { - if (my_strnncoll(seg->charset,(uchar*) rec+seg->start, seg->length, - (uchar*) key, seg->length)) + if (seg->charset->coll->strnncollsp(seg->charset, + (uchar*) rec+seg->start, seg->length, + (uchar*) key, seg->length)) return 1; } else diff --git a/mysql-test/r/ctype_latin1_de.result b/mysql-test/r/ctype_latin1_de.result index e0cb7008899..418bd65e0dc 100644 --- a/mysql-test/r/ctype_latin1_de.result +++ b/mysql-test/r/ctype_latin1_de.result @@ -264,3 +264,18 @@ select * from t1 where word like CAST(0xDF as CHAR); word word2 ß ß drop table t1; +CREATE TABLE t1 ( +s1 CHAR(5) CHARACTER SET latin1 COLLATE latin1_german2_ci +); +INSERT INTO t1 VALUES ('Ü'); +INSERT INTO t1 VALUES ('ue'); +SELECT DISTINCT s1 FROM t1; +s1 +Ü +SELECT s1,COUNT(*) FROM t1 GROUP BY s1; +s1 COUNT(*) +Ü 2 +SELECT COUNT(DISTINCT s1) FROM t1; +COUNT(DISTINCT s1) +1 +DROP TABLE t1; diff --git a/mysql-test/t/ctype_latin1_de.test b/mysql-test/t/ctype_latin1_de.test index 22a4e14158d..0bbd9fa95e4 100644 --- a/mysql-test/t/ctype_latin1_de.test +++ b/mysql-test/t/ctype_latin1_de.test @@ -73,3 +73,13 @@ select * from t1 where word like 'AE'; select * from t1 where word like binary 0xDF; select * from t1 where word like CAST(0xDF as CHAR); drop table t1; + +CREATE TABLE t1 ( +s1 CHAR(5) CHARACTER SET latin1 COLLATE latin1_german2_ci +); +INSERT INTO t1 VALUES ('Ü'); +INSERT INTO t1 VALUES ('ue'); +SELECT DISTINCT s1 FROM t1; +SELECT s1,COUNT(*) FROM t1 GROUP BY s1; +SELECT COUNT(DISTINCT s1) FROM t1; +DROP TABLE t1; diff --git a/sql/item_sum.cc b/sql/item_sum.cc index aa146926eb5..3bd131c0e60 100644 --- a/sql/item_sum.cc +++ b/sql/item_sum.cc @@ -1023,7 +1023,9 @@ int simple_str_key_cmp(void* arg, byte* key1, byte* key2) Item_sum_count_distinct* item = (Item_sum_count_distinct*)arg; CHARSET_INFO *cs=item->key_charset; uint len=item->key_length; - return my_strnncoll(cs, (const uchar*) key1, len, (const uchar*) key2, len); + return cs->coll->strnncollsp(cs, + (const uchar*) key1, len, + (const uchar*) key2, len); } /* From 970f910d757f5a5a8ce0ff31a8d7321da71995e8 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 5 Aug 2003 11:26:31 +0500 Subject: [PATCH 15/15] =?UTF-8?q?Fix:=20CREATE=20TABLE=20t1=20(s1=20CHAR(5?= =?UTF-8?q?)=20COLLATE=20latin1=5Fgerman2=5Fci);=20INSERT=20INTO=20t1=20VA?= =?UTF-8?q?LUES=20('=C3=9C');=20SELECT=20FIELD('ue',s1)=20FROM=20t1;=20The?= =?UTF-8?q?=20above=20returned=200=20in=20error.=20Now=201=20is=20returned?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql-test/r/ctype_latin1_de.result | 4 ++++ mysql-test/t/ctype_latin1_de.test | 1 + sql/item_func.cc | 3 +-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/mysql-test/r/ctype_latin1_de.result b/mysql-test/r/ctype_latin1_de.result index 418bd65e0dc..7503c16a85e 100644 --- a/mysql-test/r/ctype_latin1_de.result +++ b/mysql-test/r/ctype_latin1_de.result @@ -278,4 +278,8 @@ s1 COUNT(*) SELECT COUNT(DISTINCT s1) FROM t1; COUNT(DISTINCT s1) 1 +SELECT FIELD('ue',s1), FIELD('Ü',s1), s1='ue', s1='Ü' FROM t1; +FIELD('ue',s1) FIELD('Ü',s1) s1='ue' s1='Ü' +1 1 1 1 +1 1 1 1 DROP TABLE t1; diff --git a/mysql-test/t/ctype_latin1_de.test b/mysql-test/t/ctype_latin1_de.test index 0bbd9fa95e4..00ac128a478 100644 --- a/mysql-test/t/ctype_latin1_de.test +++ b/mysql-test/t/ctype_latin1_de.test @@ -82,4 +82,5 @@ INSERT INTO t1 VALUES ('ue'); SELECT DISTINCT s1 FROM t1; SELECT s1,COUNT(*) FROM t1 GROUP BY s1; SELECT COUNT(DISTINCT s1) FROM t1; +SELECT FIELD('ue',s1), FIELD('Ü',s1), s1='ue', s1='Ü' FROM t1; DROP TABLE t1; diff --git a/sql/item_func.cc b/sql/item_func.cc index e1092dda857..843fe6cd350 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -1183,8 +1183,7 @@ longlong Item_func_field::val_int() for (uint i=1 ; i < arg_count ; i++) { String *tmp_value=args[i]->val_str(&tmp); - if (tmp_value && field->length() == tmp_value->length() && - !sortcmp(field,tmp_value,cmp_collation.collation)) + if (tmp_value && !sortcmp(field,tmp_value,cmp_collation.collation)) return (longlong) (i); } }