summaryrefslogtreecommitdiff
path: root/sql/sql_update.cc
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2005-10-28 01:24:11 +0400
committerunknown <evgen@moonbone.local>2005-10-28 01:24:11 +0400
commit6020281e9511f96cb99cf7d55643d75fa1a4a4a4 (patch)
tree1c104e30ad0a076a4b630b5718784f64bd29484b /sql/sql_update.cc
parentfe90e5677c702b65b4f246d8a7a1af0d41284e91 (diff)
downloadmariadb-git-6020281e9511f96cb99cf7d55643d75fa1a4a4a4.tar.gz
Fix bug#14186 select datefield is null not updated
Date field was declared as not null, thus expression 'datefield is null' was always false. For SELECT special handling of such cases is used. There 'datefield is null' converted to 'datefield eq "0000-00-00"'. In mysql_update() before creation of select added remove_eq_conds() call. It makes some optimization of conds and in particular performs conversion from 'is null' to 'eq'. Also remove_eq_conds() makes some evaluation of conds and if it founds that conds is always false then update statement is not processed further. All this allows to perform some update statements process faster due to optimized conds, and not wasting resources if conds known to be false. sql/sql_select.cc: Fix bug#14186 select datefield is null not updated Remove static from remove_eq_conds() sql/sql_select.h: Fix bug#14186 select datefield is null not updated Added remove_eq_conds() prototype. mysql-test/r/update.result: Test case for bug#14186 select datefield is null not updated mysql-test/t/update.test: Test case for bug#14186 select datefield is null not updated sql/sql_update.cc: Fix bug#14186 select datefield is null not updated To mysql_update() added call to remove_eq_conds() to optimize conds and convert 'datefield is null' to 'datefield eq 0000-00-00'
Diffstat (limited to 'sql/sql_update.cc')
-rw-r--r--sql/sql_update.cc16
1 files changed, 12 insertions, 4 deletions
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index b6bce800b0e..cb8064bef87 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -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);
@@ -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();
- select=make_select(table,0,0,conds,&error);
- if (error ||
- (select && select->check_quick(thd, safe_update, limit)) || !limit)
+ if (limit)
+ select=make_select(table,0,0,conds,&error);
+ if (error || !limit ||
+ (select && select->check_quick(thd, safe_update, limit)))
{
delete select;
free_underlaid_joins(thd, &thd->lex->select_lex);