Commit 14b55bcc authored by monty@hundin.mysql.fi's avatar monty@hundin.mysql.fi

Fixed bug in datetime range optimization

parent 4a634059
......@@ -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 @@ class Item_ref :public Item_ident
};
/*
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