From 777316c3e1913ff669fea74c9a1380ba09a80ad1 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Sun, 2 Nov 2003 17:27:35 +0200 Subject: [PATCH] fixed BUG#1645 all calls of fix_fields() are inspected (copy of cset which I lost in accidatly tree delete) --- mysql-test/r/subselect.result | 7 +++++++ mysql-test/t/subselect.test | 10 ++++++++++ sql/item_subselect.cc | 12 +++++------- sql/item_subselect.h | 4 +--- sql/set_var.cc | 6 +++++- sql/sql_select.cc | 6 +----- 6 files changed, 29 insertions(+), 16 deletions(-) diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 26a802af478..9721785a97c 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1477,3 +1477,10 @@ phone code 89356874041 NULL 95895001874 NULL drop table t1, t2; +CREATE TABLE t1(COLA FLOAT NOT NULL,COLB FLOAT NOT NULL,COLC VARCHAR(20) DEFAULT NULL,PRIMARY KEY (COLA, COLB)); +CREATE TABLE t2(COLA FLOAT NOT NULL,COLB FLOAT NOT NULL,COLC CHAR(1) NOT NULL,PRIMARY KEY (COLA)); +INSERT INTO t1 VALUES (1,1,'1A3240'), (1,2,'4W2365'); +INSERT INTO t2 VALUES (100, 200, 'C'); +SELECT DISTINCT COLC FROM t1 WHERE COLA = (SELECT COLA FROM t2 WHERE COLB = 200 AND COLC ='C' LIMIT 1); +COLC +DROP TABLE t1, t2; diff --git a/mysql-test/t/subselect.test b/mysql-test/t/subselect.test index b601838c378..6ac2dbbff12 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -986,3 +986,13 @@ CREATE TABLE t2 (code char(5) NOT NULL default '',UNIQUE KEY code (code)) TYPE=M INSERT INTO t2 VALUES ('1'),('1226'),('1245'),('1862'),('18623'),('1874'),('1967'),('6'); select c.number as phone,(select p.code from t2 p where c.number like concat(p.code, '%') order by length(p.code) desc limit 1) as code from t1 c; drop table t1, t2; + +# +# fix_fields() in add_ref_to_table_cond() +# +CREATE TABLE t1(COLA FLOAT NOT NULL,COLB FLOAT NOT NULL,COLC VARCHAR(20) DEFAULT NULL,PRIMARY KEY (COLA, COLB)); +CREATE TABLE t2(COLA FLOAT NOT NULL,COLB FLOAT NOT NULL,COLC CHAR(1) NOT NULL,PRIMARY KEY (COLA)); +INSERT INTO t1 VALUES (1,1,'1A3240'), (1,2,'4W2365'); +INSERT INTO t2 VALUES (100, 200, 'C'); +SELECT DISTINCT COLC FROM t1 WHERE COLA = (SELECT COLA FROM t2 WHERE COLB = 200 AND COLC ='C' LIMIT 1); +DROP TABLE t1, t2; \ No newline at end of file diff --git a/sql/item_subselect.cc b/sql/item_subselect.cc index 0483722b990..062a7c2ee2b 100644 --- a/sql/item_subselect.cc +++ b/sql/item_subselect.cc @@ -512,7 +512,6 @@ String *Item_in_subselect::val_str(String *str) Item_subselect::trans_res Item_in_subselect::single_value_transformer(JOIN *join, - Item *left_expr, compare_func_creator func) { DBUG_ENTER("Item_in_subselect::single_value_transformer"); @@ -587,7 +586,7 @@ Item_in_subselect::single_value_transformer(JOIN *join, // left expression belong to outer select SELECT_LEX *current= thd->lex.current_select, *up; thd->lex.current_select= up= current->return_after_parsing(); - if (left_expr->fix_fields(thd, up->get_table_list(), 0)) + if (left_expr->fix_fields(thd, up->get_table_list(), &left_expr)) { thd->lex.current_select= current; DBUG_RETURN(RES_ERROR); @@ -716,8 +715,7 @@ Item_in_subselect::single_value_transformer(JOIN *join, } Item_subselect::trans_res -Item_in_subselect::row_value_transformer(JOIN *join, - Item *left_expr) +Item_in_subselect::row_value_transformer(JOIN *join) { DBUG_ENTER("Item_in_subselect::row_value_transformer"); @@ -800,16 +798,16 @@ Item_subselect::trans_res Item_in_subselect::select_transformer(JOIN *join) { if (left_expr->cols() == 1) - return single_value_transformer(join, left_expr, + return single_value_transformer(join, &Item_bool_func2::eq_creator); - return row_value_transformer(join, left_expr); + return row_value_transformer(join); } Item_subselect::trans_res Item_allany_subselect::select_transformer(JOIN *join) { - return single_value_transformer(join, left_expr, func); + return single_value_transformer(join, func); } subselect_single_select_engine:: diff --git a/sql/item_subselect.h b/sql/item_subselect.h index 7e735165c02..2a7f7b3f441 100644 --- a/sql/item_subselect.h +++ b/sql/item_subselect.h @@ -210,10 +210,8 @@ public: } trans_res select_transformer(JOIN *join); trans_res single_value_transformer(JOIN *join, - Item *left_expr, compare_func_creator func); - trans_res row_value_transformer(JOIN * join, - Item *left_expr); + trans_res row_value_transformer(JOIN * join); longlong val_int(); double val(); String *val_str(String*); diff --git a/sql/set_var.cc b/sql/set_var.cc index 57076bec603..66c8ef87d5a 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -2279,7 +2279,11 @@ int set_var::update(THD *thd) int set_var_user::check(THD *thd) { - return (user_var_item->fix_fields(thd,0, (Item**) 0) || + /* + Item_func_set_user_var can't substitute something else on its place => + 0 can be passed as last argument + */ + return (user_var_item->fix_fields(thd, 0, (Item**) 0) || user_var_item->check()) ? -1 : 0; } diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 34b55367163..f209bf886ff 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -8525,11 +8525,7 @@ static bool add_ref_to_table_cond(THD *thd, JOIN_TAB *join_tab) if (thd->is_fatal_error) DBUG_RETURN(TRUE); - /* - Here we pass 0 as the first argument to fix_fields that don't need - to do any stack checking (This is already done in the initial fix_fields). - */ - cond->fix_fields((THD *) 0,(TABLE_LIST *) 0, (Item**)&cond); + cond->fix_fields(thd,(TABLE_LIST *) 0, (Item**)&cond); if (join_tab->select) { error=(int) cond->add(join_tab->select->cond);