Commit eba5ec8b authored by unknown's avatar unknown

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
parent 3051d8bb
......@@ -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}).
......@@ -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
......@@ -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;
......@@ -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"
......
......@@ -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;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment