From 2d52be9fdf5a0d48cdc748cc72a044811466584a Mon Sep 17 00:00:00 2001 From: "konstantin@oak.local" <> Date: Mon, 1 Dec 2003 17:46:07 +0300 Subject: [PATCH 1/7] don't delete select_lex->having and select_lex->where as we delete all items in free_prep_stmt(free_items); indentation fix --- sql/sql_prepare.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 9f7c0bc0b0c..790b80eb127 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -671,8 +671,6 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, fix_tables_pointers(thd->lex.all_selects_list); if (!result && !(result= new select_send())) { - delete select_lex->having; - delete select_lex->where; send_error(thd, ER_OUT_OF_RESOURCES); DBUG_RETURN(1); } @@ -680,10 +678,10 @@ static bool mysql_test_select_fields(PREP_STMT *stmt, TABLE_LIST *tables, JOIN *join= new JOIN(thd, fields, select_options, result); thd->used_tables= 0; // Updated by setup_fields - if (join->prepare(&select_lex->ref_pointer_array, tables, - wild_num, conds, og_num, order, group, having, proc, - select_lex, unit)) - DBUG_RETURN(1); + if (join->prepare(&select_lex->ref_pointer_array, tables, + wild_num, conds, og_num, order, group, having, proc, + select_lex, unit)) + DBUG_RETURN(1); if (send_prep_stmt(stmt, fields.elements) || thd->protocol_simple.send_fields(&fields, 0) || #ifndef EMBEDDED_LIBRARY From f35787b62811ebef22878f95146c22a4defa3883 Mon Sep 17 00:00:00 2001 From: "konstantin@oak.local" <> Date: Mon, 1 Dec 2003 20:53:05 +0300 Subject: [PATCH 2/7] cleanup: unused variable removed followup of Bordeaux Optimizer session --- sql/sql_select.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 82ce688495a..69e8ea8ccff 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -1609,10 +1609,6 @@ mysql_select(THD *thd, Item ***rref_pointer_array, err: if (free_join) { - JOIN *curr_join= (join->need_tmp&&join->tmp_join? - (join->tmp_join->error=join->error,join->tmp_join): - join); - thd->proc_info="end"; err= join->cleanup(); if (thd->net.report_error) From dcbbbe6b947752a6b15f0fbec1bdaa4821a99f62 Mon Sep 17 00:00:00 2001 From: "igor@rurik.mysql.com" <> Date: Mon, 1 Dec 2003 13:59:09 -0800 Subject: [PATCH 3/7] join_outer.result, null.result, null.test, item_cmpfunc.h: Fixed inconsistency of values of used_tables_cache and const_item_cache for Item_func_isnull objects (bug #1990). --- mysql-test/r/join_outer.result | 2 +- mysql-test/r/null.result | 11 +++++++++++ mysql-test/t/null.test | 11 +++++++++++ sql/item_cmpfunc.h | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/mysql-test/r/join_outer.result b/mysql-test/r/join_outer.result index 3a1f68fb6c1..165f1522378 100644 --- a/mysql-test/r/join_outer.result +++ b/mysql-test/r/join_outer.result @@ -91,7 +91,7 @@ grp a c id a c d NULL NULL NULL NULL NULL NULL explain select t1.*,t2.* from t1,t2 where t1.a=t2.a and isnull(t2.a)=1; id select_type table type possible_keys key key_len ref rows Extra -1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables +1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE explain select t1.*,t2.* from t1 left join t2 on t1.a=t2.a where isnull(t2.a)=1; id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE t1 ALL NULL NULL NULL NULL 7 diff --git a/mysql-test/r/null.result b/mysql-test/r/null.result index 9de9fdce2db..f4decd3b79e 100644 --- a/mysql-test/r/null.result +++ b/mysql-test/r/null.result @@ -142,3 +142,14 @@ a b c d 0 0000-00-00 00:00:00 0 0 0000-00-00 00:00:00 0 drop table t1; +create table t1 (a int not null, b int not null, index idx(a)); +insert into t1 values +(1,1), (2,2), (3,3), (4,4), (5,5), (6,6), +(7,7), (8,8), (9,9), (10,10), (11,11), (12,12); +explain select * from t1 where a between 2 and 3; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range idx idx 4 NULL 2 Using where +explain select * from t1 where a between 2 and 3 or b is null; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range idx idx 4 NULL 2 Using where +drop table t1; diff --git a/mysql-test/t/null.test b/mysql-test/t/null.test index 0be755ba7ad..5fa8f8a7651 100644 --- a/mysql-test/t/null.test +++ b/mysql-test/t/null.test @@ -86,3 +86,14 @@ INSERT INTO t1 (d) values (null),(null); select * from t1; drop table t1; +# +# Test to check elimination of IS NULL predicate for a non-nullable attribute +# (bug #1990) +# +create table t1 (a int not null, b int not null, index idx(a)); +insert into t1 values + (1,1), (2,2), (3,3), (4,4), (5,5), (6,6), + (7,7), (8,8), (9,9), (10,10), (11,11), (12,12); +explain select * from t1 where a between 2 and 3; +explain select * from t1 where a between 2 and 3 or b is null; +drop table t1; diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index dc017cef73c..541bc47557d 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -746,6 +746,7 @@ public: if (!args[0]->maybe_null) { used_tables_cache= 0; /* is always false */ + const_item_cache= 1; cached_value= (longlong) 0; } else From 05e4d9031bace425b4b4747ffe1e8b2114b2a625 Mon Sep 17 00:00:00 2001 From: "monty@mysql.com" <> Date: Tue, 2 Dec 2003 13:32:05 +0200 Subject: [PATCH 4/7] Ensure that innodb is created for the first replication test as the slave-timeout is lower for future tests and this failed on some slower machines --- mysql-test/t/rpl000001-slave.opt | 1 + 1 file changed, 1 insertion(+) create mode 100644 mysql-test/t/rpl000001-slave.opt diff --git a/mysql-test/t/rpl000001-slave.opt b/mysql-test/t/rpl000001-slave.opt new file mode 100644 index 00000000000..627becdbfb5 --- /dev/null +++ b/mysql-test/t/rpl000001-slave.opt @@ -0,0 +1 @@ +--innodb From c10413abdab41532ba82a8d7763a36d8ed47ccf7 Mon Sep 17 00:00:00 2001 From: "konstantin@oak.local" <> Date: Tue, 2 Dec 2003 15:09:35 +0300 Subject: [PATCH 5/7] Item_param::save_in_field(): thd->command can be anything except COM_EXECUTE in no cases except programming error. --- sql/item.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sql/item.cc b/sql/item.cc index 1d49671ff4c..9af2c300202 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -580,8 +580,7 @@ int Item_param::save_in_field(Field *field, bool no_conversions) { THD *thd= current_thd; - if (thd->command == COM_PREPARE) - return -1; + DBUG_ASSERT(thd->command == COM_EXECUTE); if (null_value) return (int) set_field_to_null(field); From 02f382ecaa7b60c4da4a25434cdf80f2631e0b80 Mon Sep 17 00:00:00 2001 From: "hf@deer.(none)" <> Date: Tue, 2 Dec 2003 19:06:24 +0400 Subject: [PATCH 6/7] Fix for #1189 (Mess with names about CONSTRAINT) Second edition: error message was deleted as Segey suggested Now name of the constraint will be used as the name of the key if the last not specified --- mysql-test/r/constraints.result | 13 +++++++++++++ mysql-test/t/constraints.test | 6 ++++++ sql/sql_yacc.yy | 27 ++++++++++++++++++--------- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/mysql-test/r/constraints.result b/mysql-test/r/constraints.result index 3b41e291e0f..7cd8053c21b 100644 --- a/mysql-test/r/constraints.result +++ b/mysql-test/r/constraints.result @@ -14,3 +14,16 @@ drop table t1; create table t1 (a int null); insert into t1 values (1),(NULL); drop table t1; +create table t1 (a int null); +alter table t1 add constraint constraint_1 unique (a); +alter table t1 add constraint unique key_1(a); +alter table t1 add constraint constraint_2 unique key_2(a); +show create table t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) default NULL, + UNIQUE KEY `constraint_1` (`a`), + UNIQUE KEY `key_1` (`a`), + UNIQUE KEY `key_2` (`a`) +) TYPE=MyISAM DEFAULT CHARSET=latin1 +drop table t1; diff --git a/mysql-test/t/constraints.test b/mysql-test/t/constraints.test index cc796e0abd2..dbc34a0dff1 100644 --- a/mysql-test/t/constraints.test +++ b/mysql-test/t/constraints.test @@ -21,3 +21,9 @@ drop table t1; create table t1 (a int null); insert into t1 values (1),(NULL); drop table t1; +create table t1 (a int null); +alter table t1 add constraint constraint_1 unique (a); +alter table t1 add constraint unique key_1(a); +alter table t1 add constraint constraint_2 unique key_2(a); +show create table t1; +drop table t1; diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 805dc9f1932..8fe69ad6ae3 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -598,7 +598,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %type remember_name remember_end opt_ident opt_db text_or_password - opt_escape + opt_escape opt_constraint %type text_string opt_gconcat_separator @@ -631,7 +631,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); expr_list udf_expr_list when_list ident_list ident_list_arg %type - key_type opt_unique_or_fulltext + key_type opt_unique_or_fulltext constraint_key_type %type key_alg opt_btree_or_rtree @@ -1189,6 +1189,13 @@ key_def: lex->key_list.push_back(new Key($1,$2, $3, lex->col_list)); lex->col_list.empty(); /* Alloced by sql_alloc */ } + | opt_constraint constraint_key_type opt_ident key_alg '(' key_list ')' + { + LEX *lex=Lex; + const char *key_name= $3 ? $3:$1; + lex->key_list.push_back(new Key($2, key_name, $4, lex->col_list)); + lex->col_list.empty(); /* Alloced by sql_alloc */ + } | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references { LEX *lex=Lex; @@ -1212,8 +1219,8 @@ check_constraint: ; opt_constraint: - /* empty */ - | CONSTRAINT opt_ident; + /* empty */ { $$=(char*) 0; } + | CONSTRAINT opt_ident { $$=$2; }; field_spec: field_ident @@ -1575,14 +1582,16 @@ delete_option: | SET DEFAULT { $$= (int) foreign_key::FK_OPTION_DEFAULT; }; key_type: - opt_constraint PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; } - | key_or_index { $$= Key::MULTIPLE; } + key_or_index { $$= Key::MULTIPLE; } | FULLTEXT_SYM { $$= Key::FULLTEXT; } | FULLTEXT_SYM key_or_index { $$= Key::FULLTEXT; } | SPATIAL_SYM { $$= Key::SPATIAL; } - | SPATIAL_SYM key_or_index { $$= Key::SPATIAL; } - | opt_constraint UNIQUE_SYM { $$= Key::UNIQUE; } - | opt_constraint UNIQUE_SYM key_or_index { $$= Key::UNIQUE; }; + | SPATIAL_SYM key_or_index { $$= Key::SPATIAL; }; + +constraint_key_type: + PRIMARY_SYM KEY_SYM { $$= Key::PRIMARY; } + | UNIQUE_SYM { $$= Key::UNIQUE; } + | UNIQUE_SYM key_or_index { $$= Key::UNIQUE; }; key_or_index: KEY_SYM {} From 43221ad9e1c12b41405ff51f6dd61617fd12198c Mon Sep 17 00:00:00 2001 From: "sergefp@mysql.com" <> Date: Tue, 2 Dec 2003 21:20:51 +0300 Subject: [PATCH 7/7] Fix for bug #1980 --- mysql-test/r/multi_update.result | 27 ++++++++++++++++++ mysql-test/t/multi_update.test | 48 +++++++++++++++++++++++++++++++- sql/uniques.cc | 14 +++++++--- 3 files changed, 84 insertions(+), 5 deletions(-) diff --git a/mysql-test/r/multi_update.result b/mysql-test/r/multi_update.result index b0d597f238a..f6a96eb94a0 100644 --- a/mysql-test/r/multi_update.result +++ b/mysql-test/r/multi_update.result @@ -363,3 +363,30 @@ t2 rows after big delete 1900001 select 't1 rows after big delete', count(*) from t1; t1 rows after big delete count(*) t1 rows after big delete 1900001 +drop table t1,t2; +set @ttype_save=@@table_type; +set @@table_type=innodb; +create table t1 ( c char(8) not null ); +insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'); +insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F'); +alter table t1 add b char(8) not null; +alter table t1 add a char(8) not null; +alter table t1 add primary key (a,b,c); +update t1 set a=c, b=c; +create table t2 like t1; +insert into t2 select * from t1; +delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b; +drop table t1,t2; +set @@table_type=bdb; +create table t1 ( c char(8) not null ); +insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'); +insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F'); +alter table t1 add b char(8) not null; +alter table t1 add a char(8) not null; +alter table t1 add primary key (a,b,c); +update t1 set a=c, b=c; +create table t2 like t1; +insert into t2 select * from t1; +delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b; +set @@table_type=@ttype_save; +drop table t1,t2; diff --git a/mysql-test/t/multi_update.test b/mysql-test/t/multi_update.test index b3c742e0b30..0886b957ca7 100644 --- a/mysql-test/t/multi_update.test +++ b/mysql-test/t/multi_update.test @@ -309,4 +309,50 @@ delete t1,t2 from t1,t2 where t1.b=t2.a and t1.a < 100*1000; select 't2 rows after big delete', count(*) from t2; select 't1 rows after big delete', count(*) from t1; -#drop table t1,t2; +drop table t1,t2; + +# +# Test for bug #1980. +# +set @ttype_save=@@table_type; + +--disable_warnings +set @@table_type=innodb; +create table t1 ( c char(8) not null ); +--enable_warnings + +insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'); +insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F'); + +alter table t1 add b char(8) not null; +alter table t1 add a char(8) not null; +alter table t1 add primary key (a,b,c); +update t1 set a=c, b=c; + +create table t2 like t1; +insert into t2 select * from t1; + +delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b; + +drop table t1,t2; + +--disable_warnings +set @@table_type=bdb; +create table t1 ( c char(8) not null ); +--enable_warnings + +insert into t1 values ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9'); +insert into t1 values ('A'),('B'),('C'),('D'),('E'),('F'); + +alter table t1 add b char(8) not null; +alter table t1 add a char(8) not null; +alter table t1 add primary key (a,b,c); +update t1 set a=c, b=c; + +create table t2 like t1; +insert into t2 select * from t1; + +delete t1,t2 from t2,t1 where t1.a<'B' and t2.b=t1.b; + +set @@table_type=@ttype_save; +drop table t1,t2; diff --git a/sql/uniques.cc b/sql/uniques.cc index f289fd11f5b..02146426782 100644 --- a/sql/uniques.cc +++ b/sql/uniques.cc @@ -37,14 +37,20 @@ int unique_write_to_file(gptr key, element_count count, Unique *unique) { + /* + Use unique->size (size of element stored in the tree) and not + unique->tree.size_of_element. The latter is different from unique->size + when tree implementation chooses to store pointer to key in TREE_ELEMENT + (instead of storing the element itself there) + */ return my_b_write(&unique->file, (byte*) key, - unique->tree.size_of_element) ? 1 : 0; + unique->size) ? 1 : 0; } int unique_write_to_ptrs(gptr key, element_count count, Unique *unique) { - memcpy(unique->record_pointers, key, unique->tree.size_of_element); - unique->record_pointers+=unique->tree.size_of_element; + memcpy(unique->record_pointers, key, unique->size); + unique->record_pointers+=unique->size; return 0; } @@ -133,7 +139,7 @@ bool Unique::get(TABLE *table) sort_param.max_rows= elements; sort_param.sort_form=table; sort_param.rec_length= sort_param.sort_length=sort_param.ref_length= - tree.size_of_element; + size; sort_param.keys= max_in_memory_size / sort_param.sort_length; sort_param.not_killable=1;