From: Date: October 27 2005 3:30pm Subject: bk commit into 5.0 tree (evgen:1.1949) BUG#14093 List-Archive: http://lists.mysql.com/internals/31561 X-Bug: 14093 Message-Id: <20051027133047.2BB0222D8BC@localhost.moonbone.local> 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;