diff --git a/mysql-test/r/subselect.result b/mysql-test/r/subselect.result index 5d462ec2961..29bba54b55a 100644 --- a/mysql-test/r/subselect.result +++ b/mysql-test/r/subselect.result @@ -1486,3 +1486,10 @@ ERROR 42S22: Unknown column 't1.s2' in 'group statement' select count(*) from t2 group by t1.s2; ERROR 42S02: Unknown table 't1' in group statement 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 bb8b4db2b62..0b8d862a1fe 100644 --- a/mysql-test/t/subselect.test +++ b/mysql-test/t/subselect.test @@ -999,3 +999,13 @@ select * from t1 where (select count(*) from t2 group by t1.s2) = 1; -- error 1109 select count(*) from t2 group by t1.s2; 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;s 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);