Below is the list of changes that have just been committed into a local
5.0 repository of evgen. When evgen does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
ChangeSet
1.1949 05/10/27 17:30:42 evgen@stripped +3 -0
Fix bug #14093 Query takes a lot of time when date format is not valid
Invalid date like 2000-02-32 wasn't converted to int, which lead to not
using index and comparison with field as astring, which results in slow
query execution.
convert_constatn_item() and get_mm_leaf() now forces MODE_INVALID_DATES to
allow such conversion.
sql/item_cmpfunc.cc
1.184 05/10/27 17:24:20 evgen@stripped +5 -0
Fix bug #14093 Query takes a lot of time when date format is not valid
convert_constant_item() now allows conversion of invalid dates like 2000-01-32 to int
to make it possible to use index when comparing fields with such dates.
sql/opt_range.cc
1.194 05/10/27 17:22:00 evgen@stripped +8 -1
Fix bug #14093 Query takes a lot of time when date format is not valid
get_mm_leaf() modified so it allows index usage for comparing fields with invalid
dates like 2000-01-32.
sql/item.h
1.177 05/10/27 17:14:57 evgen@stripped +1 -0
Fix bug #14093 Query takes a lot of time when date format is not valid
To Item_int_with_ref added method real_item() which returns ref.
# This is a BitKeeper patch. What follows are the unified diffs for the
# set of deltas contained in the patch. The rest of the patch, the part
# that BitKeeper cares about, is below these diffs.
# User: evgen
# Host: moonbone.local
# Root: /work/14093-bug-5.0-mysql
--- 1.176/sql/item.h 2005-10-20 10:55:25 +04:00
+++ 1.177/sql/item.h 2005-10-27 17:14:57 +04:00
@@ -1749,6 +1749,7 @@
return ref->save_in_field(field, no_conversions);
}
Item *new_item();
+ virtual Item *real_item() { return ref; }
};
--- 1.183/sql/item_cmpfunc.cc 2005-10-21 05:01:31 +04:00
+++ 1.184/sql/item_cmpfunc.cc 2005-10-27 17:24:20 +04:00
@@ -186,13 +186,18 @@
{
if ((*item)->const_item())
{
+ /* For comparison purposes allow invalid dates like 2000-01-32 */
+ ulong orig_sql_mode= field->table->in_use->variables.sql_mode;
+ field->table->in_use->variables.sql_mode|= MODE_INVALID_DATES;
if (!(*item)->save_in_field(field, 1) && !((*item)->null_value))
{
Item *tmp=new Item_int_with_ref(field->val_int(), *item);
+ field->table->in_use->variables.sql_mode= orig_sql_mode;
if (tmp)
thd->change_item_tree(item, tmp);
return 1; // Item was replaced
}
+ field->table->in_use->variables.sql_mode= orig_sql_mode;
}
return 0;
}
--- 1.193/sql/opt_range.cc 2005-10-19 12:41:23 +04:00
+++ 1.194/sql/opt_range.cc 2005-10-27 17:22:00 +04:00
@@ -3921,13 +3921,20 @@
value->result_type() != STRING_RESULT &&
field->cmp_type() != value->result_type())
goto end;
-
+ /* For comparison purposes allow invalid dates like 2000-01-32 */
+ ulong orig_sql_mode= field->table->in_use->variables.sql_mode;
+ if (value->real_item()->type() == Item::STRING_ITEM &&
+ (field->type() == FIELD_TYPE_DATE ||
+ field->type() == FIELD_TYPE_DATETIME))
+ field->table->in_use->variables.sql_mode|= MODE_INVALID_DATES;
if (value->save_in_field_no_warnings(field, 1) < 0)
{
+ field->table->in_use->variables.sql_mode= orig_sql_mode;
/* This happens when we try to insert a NULL field in a not null column */
tree= &null_element; // cmp with NULL is never TRUE
goto end;
}
+ field->table->in_use->variables.sql_mode= orig_sql_mode;
str= (char*) alloc_root(alloc, key_part->store_length+1);
if (!str)
goto end;
| Thread |
|---|
| • bk commit into 5.0 tree (evgen:1.1949) BUG#14093 | eugene | 27 Oct |