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

Fixed bug in datetime range optimization

parent 4a634059
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -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}).
+7 −0
Original line number Diff line number Diff line
@@ -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
+20 −0
Original line number Diff line number Diff line
@@ -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;
+19 −0
Original line number Diff line number Diff line
@@ -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"
+2 −2
Original line number Diff line number Diff line
@@ -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;
    }