diff options
author | unknown <monty@hundin.mysql.fi> | 2002-05-15 01:01:26 +0300 |
---|---|---|
committer | unknown <monty@hundin.mysql.fi> | 2002-05-15 01:01:26 +0300 |
commit | eba5ec8b4bceabab302462db850882f715a7b040 (patch) | |
tree | 3dc97e13fe4695f7d461248693b9267cf1bcc638 | |
parent | 3051d8bbc15ef775dcb549fd00be596d61131fcf (diff) | |
download | mariadb-git-eba5ec8b4bceabab302462db850882f715a7b040.tar.gz |
Fixed bug in datetime range optimization
Docs/manual.texi:
Changelog
mysql-test/r/type_datetime.result:
Test of datetime optimization
mysql-test/t/type_datetime.test:
Test of datetime optimization
-rw-r--r-- | Docs/manual.texi | 7 | ||||
-rw-r--r-- | mysql-test/r/type_datetime.result | 7 | ||||
-rw-r--r-- | mysql-test/t/type_datetime.test | 20 | ||||
-rw-r--r-- | sql/item.h | 19 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 4 |
5 files changed, 53 insertions, 4 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index 34f22d2e587..0c5c9d57b19 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -46771,8 +46771,6 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. @itemize @bullet @item -Fixed bug in DROP DATABASE with symlink -@item Multi-table @code{DELETE}. @item Don't support old client protocols prior to MySQL 3.21 any more. @@ -46918,6 +46916,11 @@ not yet 100% confident in this code. @appendixsubsec Changes in release 3.23.51 @itemize @bullet @item +Fixed bug in @code{DROP DATABASE} with symlinked directory. +@item +Fixed optimization problem with @code{DATETIME} and value outside +@code{DATETIME} range. +@item Removed BDB documentation. @item Fixed mit-pthreads to compile with glibc 2.2 (needed for @code{make dist}). diff --git a/mysql-test/r/type_datetime.result b/mysql-test/r/type_datetime.result index 7028b5ffe33..dd34bc1cf86 100644 --- a/mysql-test/r/type_datetime.result +++ b/mysql-test/r/type_datetime.result @@ -33,3 +33,10 @@ date_format(a,"%Y-%m-%d")=b right(a,6)=c+0 a=d+0 1 1 1 a 0000-00-00 00:00:00 +date numfacture expedition +0000-00-00 00:00:00 0 0001-00-00 00:00:00 +date numfacture expedition +0000-00-00 00:00:00 0 0001-00-00 00:00:00 +0000-00-00 00:00:00 1212 0001-00-00 00:00:00 +table type possible_keys key key_len ref rows Extra +t1 ref expedition expedition 8 const 1 where used diff --git a/mysql-test/t/type_datetime.test b/mysql-test/t/type_datetime.test index 1e7bd11bab1..626dedad547 100644 --- a/mysql-test/t/type_datetime.test +++ b/mysql-test/t/type_datetime.test @@ -30,3 +30,23 @@ CREATE TABLE t1 (a datetime not null); insert into t1 values (0); select * from t1 where a is null; drop table t1; + +# +# Test of datetime optimization +# + +CREATE TABLE `t1` ( + `date` datetime NOT NULL default '0000-00-00 00:00:00', + `numfacture` int(6) unsigned NOT NULL default '0', + `expedition` datetime NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`numfacture`), + KEY `date` (`date`), + KEY `expedition` (`expedition`) +) TYPE=MyISAM; + +INSERT INTO t1 (expedition) VALUES ('0001-00-00 00:00:00'); +SELECT * FROM t1 WHERE expedition='0001-00-00 00:00:00'; +INSERT INTO t1 (numfacture,expedition) VALUES ('1212','0001-00-00 00:00:00'); +SELECT * FROM t1 WHERE expedition='0001-00-00 00:00:00'; +EXPLAIN SELECT * FROM t1 WHERE expedition='0001-00-00 00:00:00'; +drop table t1; diff --git a/sql/item.h b/sql/item.h index 41b897956db..b8903756027 100644 --- a/sql/item.h +++ b/sql/item.h @@ -342,6 +342,25 @@ public: }; +/* + The following class is used to optimize comparing of date columns + We need to save the original item, to be able to set the field to the + original value in 'opt_range'. +*/ + +class Item_int_with_ref :public Item_int +{ + Item *ref; +public: + Item_int_with_ref(longlong i, Item *ref_arg) :Item_int(i), ref(ref_arg) + {} + bool save_in_field(Field *field) + { + return ref->save_in_field(field); + } +}; + + #include "item_sum.h" #include "item_func.h" #include "item_cmpfunc.h" diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 73821f8d826..ae50090fea1 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -45,8 +45,8 @@ static bool convert_constant_item(Field *field, Item **item) (*item)->save_in_field(field); if (!((*item)->null_value)) { - Item *tmp=new Item_int(field->val_int()); - if ((tmp)) + Item *tmp=new Item_int_with_ref(field->val_int(), *item); + if (tmp) *item=tmp; return 1; } |