Loading mysql-test/r/update.result +8 −0 Original line number Diff line number Diff line Loading @@ -337,3 +337,11 @@ a b 22 3 23 3 drop table t1; create table t1 (f1 date not null); insert into t1 values('2000-01-01'),('0000-00-00'); update t1 set f1='2002-02-02' where f1 is null; select * from t1; f1 2000-01-01 2002-02-02 drop table t1; mysql-test/t/update.test +9 −0 Original line number Diff line number Diff line Loading @@ -260,5 +260,14 @@ update t1 set a=a+11,b=2 order by a limit 3; update t1 set a=a+12,b=3 order by a limit 3; select * from t1 order by a; drop table t1; # # Bug#14186 select datefield is null not updated # create table t1 (f1 date not null); insert into t1 values('2000-01-01'),('0000-00-00'); update t1 set f1='2002-02-02' where f1 is null; select * from t1; drop table t1; # End of 4.1 tests sql/sql_select.cc +1 −3 Original line number Diff line number Diff line Loading @@ -69,8 +69,6 @@ static int return_zero_rows(JOIN *join, select_result *res,TABLE_LIST *tables, SELECT_LEX_UNIT *unit); static COND *optimize_cond(THD *thd, COND *conds, Item::cond_result *cond_value); static COND *remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value); static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); static bool open_tmp_table(TABLE *table); static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, Loading Loading @@ -4615,7 +4613,7 @@ optimize_cond(THD *thd, COND *conds, Item::cond_result *cond_value) COND_FALSE always false ( 1 = 2 ) */ static COND * COND * remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value) { if (cond->type() == Item::COND_ITEM) Loading sql/sql_select.h +1 −0 Original line number Diff line number Diff line Loading @@ -457,3 +457,4 @@ bool cp_buffer_from_ref(THD *thd, TABLE_REF *ref); bool error_if_full_join(JOIN *join); int report_error(TABLE *table, int error); int safe_index_read(JOIN_TAB *tab); COND *remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value); sql/sql_update.cc +12 −4 Original line number Diff line number Diff line Loading @@ -70,7 +70,7 @@ int mysql_update(THD *thd, ha_rows updated, found; key_map old_used_keys; TABLE *table; SQL_SELECT *select; SQL_SELECT *select= 0; READ_RECORD info; TABLE_LIST *update_table_list= ((TABLE_LIST*) thd->lex->select_lex.table_list.first); Loading Loading @@ -131,11 +131,19 @@ int mysql_update(THD *thd, DBUG_RETURN(-1); /* purecov: inspected */ } if (conds) { Item::cond_result cond_value; conds= remove_eq_conds(thd, conds, &cond_value); if (cond_value == Item::COND_FALSE) limit= 0; // Impossible WHERE } // Don't count on usage of 'only index' when calculating which key to use table->used_keys.clear_all(); if (limit) select=make_select(table,0,0,conds,&error); if (error || (select && select->check_quick(thd, safe_update, limit)) || !limit) if (error || !limit || (select && select->check_quick(thd, safe_update, limit))) { delete select; free_underlaid_joins(thd, &thd->lex->select_lex); Loading Loading
mysql-test/r/update.result +8 −0 Original line number Diff line number Diff line Loading @@ -337,3 +337,11 @@ a b 22 3 23 3 drop table t1; create table t1 (f1 date not null); insert into t1 values('2000-01-01'),('0000-00-00'); update t1 set f1='2002-02-02' where f1 is null; select * from t1; f1 2000-01-01 2002-02-02 drop table t1;
mysql-test/t/update.test +9 −0 Original line number Diff line number Diff line Loading @@ -260,5 +260,14 @@ update t1 set a=a+11,b=2 order by a limit 3; update t1 set a=a+12,b=3 order by a limit 3; select * from t1 order by a; drop table t1; # # Bug#14186 select datefield is null not updated # create table t1 (f1 date not null); insert into t1 values('2000-01-01'),('0000-00-00'); update t1 set f1='2002-02-02' where f1 is null; select * from t1; drop table t1; # End of 4.1 tests
sql/sql_select.cc +1 −3 Original line number Diff line number Diff line Loading @@ -69,8 +69,6 @@ static int return_zero_rows(JOIN *join, select_result *res,TABLE_LIST *tables, SELECT_LEX_UNIT *unit); static COND *optimize_cond(THD *thd, COND *conds, Item::cond_result *cond_value); static COND *remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value); static bool const_expression_in_where(COND *conds,Item *item, Item **comp_item); static bool open_tmp_table(TABLE *table); static bool create_myisam_tmp_table(TABLE *table,TMP_TABLE_PARAM *param, Loading Loading @@ -4615,7 +4613,7 @@ optimize_cond(THD *thd, COND *conds, Item::cond_result *cond_value) COND_FALSE always false ( 1 = 2 ) */ static COND * COND * remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value) { if (cond->type() == Item::COND_ITEM) Loading
sql/sql_select.h +1 −0 Original line number Diff line number Diff line Loading @@ -457,3 +457,4 @@ bool cp_buffer_from_ref(THD *thd, TABLE_REF *ref); bool error_if_full_join(JOIN *join); int report_error(TABLE *table, int error); int safe_index_read(JOIN_TAB *tab); COND *remove_eq_conds(THD *thd, COND *cond, Item::cond_result *cond_value);
sql/sql_update.cc +12 −4 Original line number Diff line number Diff line Loading @@ -70,7 +70,7 @@ int mysql_update(THD *thd, ha_rows updated, found; key_map old_used_keys; TABLE *table; SQL_SELECT *select; SQL_SELECT *select= 0; READ_RECORD info; TABLE_LIST *update_table_list= ((TABLE_LIST*) thd->lex->select_lex.table_list.first); Loading Loading @@ -131,11 +131,19 @@ int mysql_update(THD *thd, DBUG_RETURN(-1); /* purecov: inspected */ } if (conds) { Item::cond_result cond_value; conds= remove_eq_conds(thd, conds, &cond_value); if (cond_value == Item::COND_FALSE) limit= 0; // Impossible WHERE } // Don't count on usage of 'only index' when calculating which key to use table->used_keys.clear_all(); if (limit) select=make_select(table,0,0,conds,&error); if (error || (select && select->check_quick(thd, safe_update, limit)) || !limit) if (error || !limit || (select && select->check_quick(thd, safe_update, limit))) { delete select; free_underlaid_joins(thd, &thd->lex->select_lex); Loading