Commit 3e59235e authored by unknown's avatar unknown
Browse files

Fix Bug #9517 Condition pushdown to storage engine does not work for update/delete

parent d17aebaa
Loading
Loading
Loading
Loading
+57 −1
Original line number Diff line number Diff line
@@ -1023,6 +1023,62 @@ auto
1
3
4
update t1
set medium = 17
where 
string = "aaaa" and 
vstring = "aaaa" and 
bin = 0xAAAA and 
vbin = 0xAAAA and
tiny = -1 and 
short = -1 and 
medium = -1 and 
long_int = -1 and 
longlong = -1 and 
real_float > 1.0 and real_float < 2.0 and 
real_double > 1.0 and real_double < 2.0 and
real_decimal > 1.0 and real_decimal < 2.0 and
utiny = 1 and 
ushort = 1 and 
umedium = 1 and 
ulong = 1 and 
ulonglong = 1 and 
/* bits = b'001' and */
options = 'one' and 
flags = 'one' and 
date_field = '1901-01-01' and
year_field = '1901' and
time_field = '01:01:01' and 
date_time = '1901-01-01 01:01:01';
delete from t1 
where
string = "aaaa" and 
vstring = "aaaa" and 
bin = 0xAAAA and 
vbin = 0xAAAA and
tiny = -1 and 
short = -1 and 
medium = 17 and 
long_int = -1 and 
longlong = -1 and 
real_float > 1.0 and real_float < 2.0 and 
real_double > 1.0 and real_double < 2.0 and
real_decimal > 1.0 and real_decimal < 2.0 and
utiny = 1 and 
ushort = 1 and 
umedium = 1 and 
ulong = 1 and 
ulonglong = 1 and 
/* bits = b'001' and */
options = 'one' and 
flags = 'one' and 
date_field = '1901-01-01' and
year_field = '1901' and
time_field = '01:01:01' and 
date_time = '1901-01-01 01:01:01';
select count(*) from t1;
count(*)
3
explain 
select * from t2 where attr3 is null or attr1 > 2 and pk1= 3 order by pk1;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
@@ -1078,7 +1134,7 @@ pk1 attr1 attr2 attr3 attr4 pk1 attr1 attr2 attr3 attr4
explain
select auto from t1 where string = "aaaa" collate latin1_general_ci order by auto;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	4	Using where; Using filesort
1	SIMPLE	t1	ALL	NULL	NULL	NULL	NULL	3	Using where; Using filesort
explain
select * from t2 where (attr1 < 2) = (attr2 < 2) order by pk1;
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
+59 −0
Original line number Diff line number Diff line
@@ -954,6 +954,65 @@ bin not like concat(0xBB, '%') and
vbin not like concat(0xBB, '%')
order by auto;

# Update test
update t1
set medium = 17
where 
string = "aaaa" and 
vstring = "aaaa" and 
bin = 0xAAAA and 
vbin = 0xAAAA and
tiny = -1 and 
short = -1 and 
medium = -1 and 
long_int = -1 and 
longlong = -1 and 
real_float > 1.0 and real_float < 2.0 and 
real_double > 1.0 and real_double < 2.0 and
real_decimal > 1.0 and real_decimal < 2.0 and
utiny = 1 and 
ushort = 1 and 
umedium = 1 and 
ulong = 1 and 
ulonglong = 1 and 
/* bits = b'001' and */
options = 'one' and 
flags = 'one' and 
date_field = '1901-01-01' and
year_field = '1901' and
time_field = '01:01:01' and 
date_time = '1901-01-01 01:01:01';

# Delete test
delete from t1 
where
string = "aaaa" and 
vstring = "aaaa" and 
bin = 0xAAAA and 
vbin = 0xAAAA and
tiny = -1 and 
short = -1 and 
medium = 17 and 
long_int = -1 and 
longlong = -1 and 
real_float > 1.0 and real_float < 2.0 and 
real_double > 1.0 and real_double < 2.0 and
real_decimal > 1.0 and real_decimal < 2.0 and
utiny = 1 and 
ushort = 1 and 
umedium = 1 and 
ulong = 1 and 
ulonglong = 1 and 
/* bits = b'001' and */
options = 'one' and 
flags = 'one' and 
date_field = '1901-01-01' and
year_field = '1901' and
time_field = '01:01:01' and 
date_time = '1901-01-01 01:01:01';

select count(*) from t1;

# Various tests 
explain 
select * from t2 where attr3 is null or attr1 > 2 and pk1= 3 order by pk1;
+7 −0
Original line number Diff line number Diff line
@@ -128,6 +128,13 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table,
      VOID(table->file->extra_opt(HA_EXTRA_CACHE,
				  thd->variables.read_buff_size));
  }
  /* Condition pushdown to storage engine */
  if (thd->variables.engine_condition_pushdown && 
      select && select->cond && 
      select->cond->used_tables() & table->map &&
      !(select->quick || table->file->pushed_cond))
    table->file->cond_push(select->cond);

  DBUG_VOID_RETURN;
} /* init_read_record */