mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge bk-internal.mysql.com:/home/bk/mysql-4.1
into neptunus.(none):/home/msvensson/mysql/mysql-4.1
This commit is contained in:
@@ -274,10 +274,8 @@ C_MODE_START int __cxa_pure_virtual() {\
|
|||||||
#include <alloca.h>
|
#include <alloca.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_ATOMIC_ADD
|
#ifdef HAVE_ATOMIC_ADD
|
||||||
#if defined(__ia64__)
|
|
||||||
#define new my_arg_new
|
#define new my_arg_new
|
||||||
#define need_to_restore_new 1
|
#define need_to_restore_new 1
|
||||||
#endif
|
|
||||||
C_MODE_START
|
C_MODE_START
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
C_MODE_END
|
C_MODE_END
|
||||||
|
@@ -303,7 +303,7 @@ sub mysqld_arguments ($$$$$);
|
|||||||
sub stop_masters_slaves ();
|
sub stop_masters_slaves ();
|
||||||
sub stop_masters ();
|
sub stop_masters ();
|
||||||
sub stop_slaves ();
|
sub stop_slaves ();
|
||||||
sub run_mysqltest ($$);
|
sub run_mysqltest ($);
|
||||||
sub usage ($);
|
sub usage ($);
|
||||||
|
|
||||||
######################################################################
|
######################################################################
|
||||||
@@ -1345,10 +1345,11 @@ sub run_testcase ($) {
|
|||||||
|
|
||||||
if ( ! $glob_use_running_server and ! $glob_use_embedded_server )
|
if ( ! $glob_use_running_server and ! $glob_use_embedded_server )
|
||||||
{
|
{
|
||||||
if ( $tinfo->{'master_restart'} or $master->[0]->{'uses_special_flags'} )
|
if ( $tinfo->{'master_restart'} or
|
||||||
|
$master->[0]->{'running_master_is_special'} )
|
||||||
{
|
{
|
||||||
stop_masters();
|
stop_masters();
|
||||||
$master->[0]->{'uses_special_flags'}= 0; # Forget about why we stopped
|
$master->[0]->{'running_master_is_special'}= 0; # Forget why we stopped
|
||||||
}
|
}
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
# ----------------------------------------------------------------------
|
||||||
@@ -1426,9 +1427,9 @@ sub run_testcase ($) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( @{$tinfo->{'master_opt'}} )
|
if ( $tinfo->{'master_restart'} )
|
||||||
{
|
{
|
||||||
$master->[0]->{'uses_special_flags'}= 1;
|
$master->[0]->{'running_master_is_special'}= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1475,7 +1476,7 @@ sub run_testcase ($) {
|
|||||||
}
|
}
|
||||||
unlink($path_timefile);
|
unlink($path_timefile);
|
||||||
|
|
||||||
my $res= run_mysqltest($tinfo, $tinfo->{'master_opt'});
|
my $res= run_mysqltest($tinfo);
|
||||||
|
|
||||||
if ( $res == 0 )
|
if ( $res == 0 )
|
||||||
{
|
{
|
||||||
@@ -1975,9 +1976,8 @@ sub stop_slaves () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sub run_mysqltest ($$) {
|
sub run_mysqltest ($) {
|
||||||
my $tinfo= shift;
|
my $tinfo= shift;
|
||||||
my $master_opts= shift;
|
|
||||||
|
|
||||||
my $cmdline_mysqldump= "$exe_mysqldump --no-defaults -uroot " .
|
my $cmdline_mysqldump= "$exe_mysqldump --no-defaults -uroot " .
|
||||||
"--socket=$master->[0]->{'path_mysock'} --password=";
|
"--socket=$master->[0]->{'path_mysock'} --password=";
|
||||||
|
@@ -611,3 +611,18 @@ SELECT count(*) FROM t1 WHERE d>FROM_DAYS(TO_DAYS(@TMP)) AND d<=FROM_DAYS(TO_DAY
|
|||||||
count(*)
|
count(*)
|
||||||
3
|
3
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
select last_day('2005-00-00');
|
||||||
|
last_day('2005-00-00')
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect datetime value: '2005-00-00'
|
||||||
|
select last_day('2005-00-01');
|
||||||
|
last_day('2005-00-01')
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect datetime value: '2005-00-01'
|
||||||
|
select last_day('2005-01-00');
|
||||||
|
last_day('2005-01-00')
|
||||||
|
NULL
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect datetime value: '2005-01-00'
|
||||||
|
@@ -231,18 +231,19 @@ explain select * from t1 where a='aaad';
|
|||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 1 Using where
|
||||||
insert into t1 select * from t1;
|
insert into t1 select * from t1;
|
||||||
|
flush tables;
|
||||||
explain select * from t1 where a='aaaa';
|
explain select * from t1 where a='aaaa';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaab';
|
explain select * from t1 where a='aaab';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaac';
|
explain select * from t1 where a='aaac';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaad';
|
explain select * from t1 where a='aaad';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
flush tables;
|
flush tables;
|
||||||
explain select * from t1 where a='aaaa';
|
explain select * from t1 where a='aaaa';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
@@ -261,16 +262,16 @@ delete from t1;
|
|||||||
insert into t1 select * from t2;
|
insert into t1 select * from t2;
|
||||||
explain select * from t1 where a='aaaa';
|
explain select * from t1 where a='aaaa';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaab';
|
explain select * from t1 where a='aaab';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaac';
|
explain select * from t1 where a='aaac';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
explain select * from t1 where a='aaad';
|
explain select * from t1 where a='aaad';
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref a a 8 const 1 Using where
|
1 SIMPLE t1 ref a a 8 const 2 Using where
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
create table t1 (
|
create table t1 (
|
||||||
id int unsigned not null primary key auto_increment,
|
id int unsigned not null primary key auto_increment,
|
||||||
@@ -345,15 +346,15 @@ insert into t3 select name, name from t1;
|
|||||||
show index from t3;
|
show index from t3;
|
||||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
t3 1 a 1 a NULL NULL NULL NULL HASH
|
t3 1 a 1 a NULL NULL NULL NULL HASH
|
||||||
t3 1 a 2 b NULL 15 NULL NULL HASH
|
t3 1 a 2 b NULL 13 NULL NULL HASH
|
||||||
show index from t3;
|
show index from t3;
|
||||||
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment
|
||||||
t3 1 a 1 a NULL NULL NULL NULL HASH
|
t3 1 a 1 a NULL NULL NULL NULL HASH
|
||||||
t3 1 a 2 b NULL 15 NULL NULL HASH
|
t3 1 a 2 b NULL 13 NULL NULL HASH
|
||||||
explain select * from t1 ignore key(btree_idx), t3 where t1.name='matt' and t3.a = concat('',t1.name) and t3.b=t1.name;
|
explain select * from t1 ignore key(btree_idx), t3 where t1.name='matt' and t3.a = concat('',t1.name) and t3.b=t1.name;
|
||||||
id select_type table type possible_keys key key_len ref rows Extra
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
1 SIMPLE t1 ref heap_idx heap_idx 20 const 7 Using where
|
1 SIMPLE t1 ref heap_idx heap_idx 20 const 7 Using where
|
||||||
1 SIMPLE t3 ref a a 40 func,const 6 Using where
|
1 SIMPLE t3 ref a a 40 func,const 7 Using where
|
||||||
drop table t1, t2, t3;
|
drop table t1, t2, t3;
|
||||||
create temporary table t1 ( a int, index (a) ) engine=memory;
|
create temporary table t1 ( a int, index (a) ) engine=memory;
|
||||||
insert into t1 values (1),(2),(3),(4),(5);
|
insert into t1 values (1),(2),(3),(4),(5);
|
||||||
|
@@ -556,11 +556,42 @@ count(*)
|
|||||||
0
|
0
|
||||||
select count(*) from t1 where x > -16;
|
select count(*) from t1 where x > -16;
|
||||||
count(*)
|
count(*)
|
||||||
1
|
2
|
||||||
select count(*) from t1 where x = 18446744073709551601;
|
select count(*) from t1 where x = 18446744073709551601;
|
||||||
count(*)
|
count(*)
|
||||||
1
|
1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
create table t1 (a bigint unsigned);
|
||||||
|
create index t1i on t1(a);
|
||||||
|
insert into t1 select 18446744073709551615;
|
||||||
|
insert into t1 select 18446744073709551614;
|
||||||
|
explain select * from t1 where a <> -1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index t1i t1i 9 NULL 2 Using where; Using index
|
||||||
|
select * from t1 where a <> -1;
|
||||||
|
a
|
||||||
|
18446744073709551614
|
||||||
|
18446744073709551615
|
||||||
|
explain select * from t1 where a > -1 or a < -1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index t1i t1i 9 NULL 2 Using where; Using index
|
||||||
|
select * from t1 where a > -1 or a < -1;
|
||||||
|
a
|
||||||
|
18446744073709551614
|
||||||
|
18446744073709551615
|
||||||
|
explain select * from t1 where a > -1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE t1 index t1i t1i 9 NULL 2 Using where; Using index
|
||||||
|
select * from t1 where a > -1;
|
||||||
|
a
|
||||||
|
18446744073709551614
|
||||||
|
18446744073709551615
|
||||||
|
explain select * from t1 where a < -1;
|
||||||
|
id select_type table type possible_keys key key_len ref rows Extra
|
||||||
|
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Impossible WHERE noticed after reading const tables
|
||||||
|
select * from t1 where a < -1;
|
||||||
|
a
|
||||||
|
drop table t1;
|
||||||
set names latin1;
|
set names latin1;
|
||||||
create table t1 (a char(10), b text, key (a)) character set latin1;
|
create table t1 (a char(10), b text, key (a)) character set latin1;
|
||||||
INSERT INTO t1 (a) VALUES
|
INSERT INTO t1 (a) VALUES
|
||||||
|
@@ -307,3 +307,10 @@ INSERT INTO t1 VALUES (NOW());
|
|||||||
SELECT count(*) FROM t1 WHERE d>FROM_DAYS(TO_DAYS(@TMP)) AND d<=FROM_DAYS(TO_DAYS(@TMP)+1);
|
SELECT count(*) FROM t1 WHERE d>FROM_DAYS(TO_DAYS(@TMP)) AND d<=FROM_DAYS(TO_DAYS(@TMP)+1);
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #10568
|
||||||
|
#
|
||||||
|
|
||||||
|
select last_day('2005-00-00');
|
||||||
|
select last_day('2005-00-01');
|
||||||
|
select last_day('2005-01-00');
|
||||||
|
@@ -169,6 +169,8 @@ explain select * from t1 where a='aaac';
|
|||||||
explain select * from t1 where a='aaad';
|
explain select * from t1 where a='aaad';
|
||||||
insert into t1 select * from t1;
|
insert into t1 select * from t1;
|
||||||
|
|
||||||
|
# avoid statistics differences between normal and ps-protocol tests
|
||||||
|
flush tables;
|
||||||
explain select * from t1 where a='aaaa';
|
explain select * from t1 where a='aaaa';
|
||||||
explain select * from t1 where a='aaab';
|
explain select * from t1 where a='aaab';
|
||||||
explain select * from t1 where a='aaac';
|
explain select * from t1 where a='aaac';
|
||||||
|
@@ -423,14 +423,30 @@ select count(*) from t1 where x=0;
|
|||||||
select count(*) from t1 where x<0;
|
select count(*) from t1 where x<0;
|
||||||
select count(*) from t1 where x < -16;
|
select count(*) from t1 where x < -16;
|
||||||
select count(*) from t1 where x = -16;
|
select count(*) from t1 where x = -16;
|
||||||
# The following query returns wrong value because the range optimizer can't
|
|
||||||
# handle search on a signed value for an unsigned parameter. This will be fixed in
|
|
||||||
# 5.0
|
|
||||||
select count(*) from t1 where x > -16;
|
select count(*) from t1 where x > -16;
|
||||||
select count(*) from t1 where x = 18446744073709551601;
|
select count(*) from t1 where x = 18446744073709551601;
|
||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug #11185 incorrect comparison of unsigned int to signed constant
|
||||||
|
#
|
||||||
|
create table t1 (a bigint unsigned);
|
||||||
|
create index t1i on t1(a);
|
||||||
|
insert into t1 select 18446744073709551615;
|
||||||
|
insert into t1 select 18446744073709551614;
|
||||||
|
|
||||||
|
explain select * from t1 where a <> -1;
|
||||||
|
select * from t1 where a <> -1;
|
||||||
|
explain select * from t1 where a > -1 or a < -1;
|
||||||
|
select * from t1 where a > -1 or a < -1;
|
||||||
|
explain select * from t1 where a > -1;
|
||||||
|
select * from t1 where a > -1;
|
||||||
|
explain select * from t1 where a < -1;
|
||||||
|
select * from t1 where a < -1;
|
||||||
|
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #6045: Binary Comparison regression in MySQL 4.1
|
# Bug #6045: Binary Comparison regression in MySQL 4.1
|
||||||
# Binary searches didn't use a case insensitive index.
|
# Binary searches didn't use a case insensitive index.
|
||||||
|
@@ -60,7 +60,15 @@ int ha_heap::open(const char *name, int mode, uint test_if_locked)
|
|||||||
{
|
{
|
||||||
/* Initialize variables for the opened table */
|
/* Initialize variables for the opened table */
|
||||||
set_keys_for_scanning();
|
set_keys_for_scanning();
|
||||||
update_key_stats();
|
/*
|
||||||
|
We cannot run update_key_stats() here because we do not have a
|
||||||
|
lock on the table. The 'records' count might just be changed
|
||||||
|
temporarily at this moment and we might get wrong statistics (Bug
|
||||||
|
#10178). Instead we request for update. This will be done in
|
||||||
|
ha_heap::info(), which is always called before key statistics are
|
||||||
|
used.
|
||||||
|
*/
|
||||||
|
key_stats_ok= FALSE;
|
||||||
}
|
}
|
||||||
return (file ? 0 : 1);
|
return (file ? 0 : 1);
|
||||||
}
|
}
|
||||||
@@ -112,6 +120,8 @@ void ha_heap::update_key_stats()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
records_changed= 0;
|
records_changed= 0;
|
||||||
|
/* At the end of update_key_stats() we can proudly claim they are OK. */
|
||||||
|
key_stats_ok= TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ha_heap::write_row(byte * buf)
|
int ha_heap::write_row(byte * buf)
|
||||||
@@ -125,7 +135,7 @@ int ha_heap::write_row(byte * buf)
|
|||||||
res= heap_write(file,buf);
|
res= heap_write(file,buf);
|
||||||
if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
||||||
file->s->records)
|
file->s->records)
|
||||||
update_key_stats();
|
key_stats_ok= FALSE;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,7 +148,7 @@ int ha_heap::update_row(const byte * old_data, byte * new_data)
|
|||||||
res= heap_update(file,old_data,new_data);
|
res= heap_update(file,old_data,new_data);
|
||||||
if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
if (!res && ++records_changed*HEAP_STATS_UPDATE_THRESHOLD >
|
||||||
file->s->records)
|
file->s->records)
|
||||||
update_key_stats();
|
key_stats_ok= FALSE;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,7 +159,7 @@ int ha_heap::delete_row(const byte * buf)
|
|||||||
res= heap_delete(file,buf);
|
res= heap_delete(file,buf);
|
||||||
if (!res && table->tmp_table == NO_TMP_TABLE &&
|
if (!res && table->tmp_table == NO_TMP_TABLE &&
|
||||||
++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records)
|
++records_changed*HEAP_STATS_UPDATE_THRESHOLD > file->s->records)
|
||||||
update_key_stats();
|
key_stats_ok= FALSE;
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,6 +272,13 @@ void ha_heap::info(uint flag)
|
|||||||
delete_length= info.deleted * info.reclength;
|
delete_length= info.deleted * info.reclength;
|
||||||
if (flag & HA_STATUS_AUTO)
|
if (flag & HA_STATUS_AUTO)
|
||||||
auto_increment_value= info.auto_increment;
|
auto_increment_value= info.auto_increment;
|
||||||
|
/*
|
||||||
|
If info() is called for the first time after open(), we will still
|
||||||
|
have to update the key statistics. Hoping that a table lock is now
|
||||||
|
in place.
|
||||||
|
*/
|
||||||
|
if (! key_stats_ok)
|
||||||
|
update_key_stats();
|
||||||
}
|
}
|
||||||
|
|
||||||
int ha_heap::extra(enum ha_extra_function operation)
|
int ha_heap::extra(enum ha_extra_function operation)
|
||||||
@@ -273,7 +290,7 @@ int ha_heap::delete_all_rows()
|
|||||||
{
|
{
|
||||||
heap_clear(file);
|
heap_clear(file);
|
||||||
if (table->tmp_table == NO_TMP_TABLE)
|
if (table->tmp_table == NO_TMP_TABLE)
|
||||||
update_key_stats();
|
key_stats_ok= FALSE;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -433,7 +450,11 @@ ha_rows ha_heap::records_in_range(uint inx, key_range *min_key,
|
|||||||
max_key->flag != HA_READ_AFTER_KEY)
|
max_key->flag != HA_READ_AFTER_KEY)
|
||||||
return HA_POS_ERROR; // Can only use exact keys
|
return HA_POS_ERROR; // Can only use exact keys
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
/* Assert that info() did run. We need current statistics here. */
|
||||||
|
DBUG_ASSERT(key_stats_ok);
|
||||||
return key->rec_per_key[key->key_parts-1];
|
return key->rec_per_key[key->key_parts-1];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -29,8 +29,10 @@ class ha_heap: public handler
|
|||||||
key_map btree_keys;
|
key_map btree_keys;
|
||||||
/* number of records changed since last statistics update */
|
/* number of records changed since last statistics update */
|
||||||
uint records_changed;
|
uint records_changed;
|
||||||
|
bool key_stats_ok;
|
||||||
public:
|
public:
|
||||||
ha_heap(TABLE *table): handler(table), file(0), records_changed(0) {}
|
ha_heap(TABLE *table): handler(table), file(0), records_changed(0),
|
||||||
|
key_stats_ok(0) {}
|
||||||
~ha_heap() {}
|
~ha_heap() {}
|
||||||
const char *table_type() const { return "HEAP"; }
|
const char *table_type() const { return "HEAP"; }
|
||||||
const char *index_type(uint inx)
|
const char *index_type(uint inx)
|
||||||
|
@@ -2817,7 +2817,7 @@ String *Item_func_str_to_date::val_str(String *str)
|
|||||||
|
|
||||||
bool Item_func_last_day::get_date(TIME *ltime, uint fuzzy_date)
|
bool Item_func_last_day::get_date(TIME *ltime, uint fuzzy_date)
|
||||||
{
|
{
|
||||||
if (get_arg0_date(ltime,fuzzy_date))
|
if (get_arg0_date(ltime, fuzzy_date & ~TIME_FUZZY_DATE))
|
||||||
return 1;
|
return 1;
|
||||||
uint month_idx= ltime->month-1;
|
uint month_idx= ltime->month-1;
|
||||||
ltime->day= days_in_month[month_idx];
|
ltime->day= days_in_month[month_idx];
|
||||||
|
@@ -960,7 +960,9 @@ get_mm_parts(PARAM *param, COND *cond_func, Field *field,
|
|||||||
if (sel_arg->type == SEL_ARG::IMPOSSIBLE)
|
if (sel_arg->type == SEL_ARG::IMPOSSIBLE)
|
||||||
{
|
{
|
||||||
tree->type=SEL_TREE::IMPOSSIBLE;
|
tree->type=SEL_TREE::IMPOSSIBLE;
|
||||||
DBUG_RETURN(tree);
|
/* If this is an NE_FUNC, we still need to check GT_FUNC. */
|
||||||
|
if (!ne_func)
|
||||||
|
DBUG_RETURN(tree);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -979,8 +981,9 @@ get_mm_parts(PARAM *param, COND *cond_func, Field *field,
|
|||||||
SEL_TREE *tree2= get_mm_parts(param, cond_func,
|
SEL_TREE *tree2= get_mm_parts(param, cond_func,
|
||||||
field, Item_func::GT_FUNC,
|
field, Item_func::GT_FUNC,
|
||||||
value, cmp_type);
|
value, cmp_type);
|
||||||
if (tree2)
|
if (!tree2)
|
||||||
tree= tree_or(param,tree,tree2);
|
DBUG_RETURN(0)
|
||||||
|
tree= tree_or(param,tree,tree2);
|
||||||
}
|
}
|
||||||
DBUG_RETURN(tree);
|
DBUG_RETURN(tree);
|
||||||
}
|
}
|
||||||
@@ -1159,6 +1162,35 @@ get_mm_leaf(PARAM *param, COND *conf_func, Field *field, KEY_PART *key_part,
|
|||||||
if (!(tree=new SEL_ARG(field,str,str2)))
|
if (!(tree=new SEL_ARG(field,str,str2)))
|
||||||
DBUG_RETURN(0); // out of memory
|
DBUG_RETURN(0); // out of memory
|
||||||
|
|
||||||
|
/*
|
||||||
|
Check if we are comparing an UNSIGNED integer with a negative constant.
|
||||||
|
In this case we know that:
|
||||||
|
(a) (unsigned_int [< | <=] negative_constant) == FALSE
|
||||||
|
(b) (unsigned_int [> | >=] negative_constant) == TRUE
|
||||||
|
In case (a) the condition is false for all values, and in case (b) it
|
||||||
|
is true for all values, so we can avoid unnecessary retrieval and condition
|
||||||
|
testing, and we also get correct comparison of unsinged integers with
|
||||||
|
negative integers (which otherwise fails because at query execution time
|
||||||
|
negative integers are cast to unsigned if compared with unsigned).
|
||||||
|
*/
|
||||||
|
Item_result field_result_type= field->result_type();
|
||||||
|
Item_result value_result_type= value->result_type();
|
||||||
|
if (field_result_type == INT_RESULT && value_result_type == INT_RESULT &&
|
||||||
|
((Field_num*)field)->unsigned_flag && !((Item_int*)value)->unsigned_flag)
|
||||||
|
{
|
||||||
|
longlong item_val= value->val_int();
|
||||||
|
if (item_val < 0)
|
||||||
|
{
|
||||||
|
if (type == Item_func::LT_FUNC || type == Item_func::LE_FUNC)
|
||||||
|
{
|
||||||
|
tree->type= SEL_ARG::IMPOSSIBLE;
|
||||||
|
DBUG_RETURN(tree);
|
||||||
|
}
|
||||||
|
if (type == Item_func::GT_FUNC || type == Item_func::GE_FUNC)
|
||||||
|
DBUG_RETURN(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case Item_func::LT_FUNC:
|
case Item_func::LT_FUNC:
|
||||||
if (field_is_equal_to_item(field,value))
|
if (field_is_equal_to_item(field,value))
|
||||||
|
Reference in New Issue
Block a user