Commit a906e3c6 authored by sergefp@mysql.com's avatar sergefp@mysql.com

WL#2985 "Partition pruning", "do pruning for UPDATE/DELETE": Post-merge fixes

parent 60f2321b
...@@ -304,21 +304,56 @@ id select_type table partitions type possible_keys key key_len ref rows Extra ...@@ -304,21 +304,56 @@ id select_type table partitions type possible_keys key key_len ref rows Extra
explain partitions select * from t1 where b > 1 and b < 3 and (a =1 or a =2); explain partitions select * from t1 where b > 1 and b < 3 and (a =1 or a =2);
id select_type table partitions type possible_keys key key_len ref rows Extra id select_type table partitions type possible_keys key key_len ref rows Extra
1 SIMPLE t1 p1_sp2,p2_sp2 system NULL NULL NULL NULL 1 1 SIMPLE t1 p1_sp2,p2_sp2 system NULL NULL NULL NULL 1
DROP TABLE IF EXISTS `t1`; drop table t1;
create table t1 (a int) partition by list(a) (
partition p0 values in (1,2),
partition p1 values in (3,4)
);
insert into t1 values (1),(1),(2),(2),(3),(4),(3),(4);
flush status;
update t1 set a=100 where a=5;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 0
flush status;
update t1 set a=100 where a+1=5+1;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 10
flush status;
delete from t1 where a=5;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 0
flush status;
delete from t1 where a+1=5+1;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 10
create table t2 like t1;
insert into t2 select * from t2;
flush status;
update t1,t2 set t1.a=1000, t2.a=1000 where t1.a=5 and t2.a=5;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 0
flush status;
delete t1,t2 from t1, t2 where t1.a=5 and t2.a=5;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 0
drop table t1,t2;
CREATE TABLE `t1` ( CREATE TABLE `t1` (
`a` int(11) default NULL `a` int(11) default NULL
); );
INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
DROP TABLE IF EXISTS `t2`;
Warnings:
Note 1051 Unknown table 't2'
CREATE TABLE `t2` ( CREATE TABLE `t2` (
`a` int(11) default NULL, `a` int(11) default NULL,
KEY `a` (`a`) KEY `a` (`a`)
) ; ) ;
insert into t2 select A.a + 10*(B.a + 10* C.a) from t1 A, t1 B, t1 C ; insert into t2 select A.a + 10*(B.a + 10* C.a) from t1 A, t1 B, t1 C ;
insert into t1 select a from t2; insert into t1 select a from t2;
DROP TABLE IF EXISTS `t2`; drop table t2;
CREATE TABLE `t2` ( CREATE TABLE `t2` (
`a` int(11) default NULL, `a` int(11) default NULL,
`b` int(11) default NULL `b` int(11) default NULL
...@@ -367,23 +402,23 @@ flush status; ...@@ -367,23 +402,23 @@ flush status;
update t2 set a = 1002 where a = 1001; update t2 set a = 1002 where a = 1001;
show status like 'Handler_read_rnd_next'; show status like 'Handler_read_rnd_next';
Variable_name Value Variable_name Value
Handler_read_rnd_next 1015 Handler_read_rnd_next 0
flush status; flush status;
update t2 set b = 6 where a = 600; update t2 set b = 6 where a = 600;
show status like 'Handler_read_rnd_next'; show status like 'Handler_read_rnd_next';
Variable_name Value Variable_name Value
Handler_read_rnd_next 1015 Handler_read_rnd_next 201
flush status; flush status;
update t2 set b = 6 where a > 600 and a < 800; update t2 set b = 6 where a > 600 and a < 800;
show status like 'Handler_read_rnd_next'; show status like 'Handler_read_rnd_next';
Variable_name Value Variable_name Value
Handler_read_rnd_next 1015 Handler_read_rnd_next 201
flush status; flush status;
delete from t2 where a > 600; delete from t2 where a > 600;
show status like 'Handler_read_rnd_next'; show status like 'Handler_read_rnd_next';
Variable_name Value Variable_name Value
Handler_read_rnd_next 1015 Handler_read_rnd_next 402
DROP TABLE IF EXISTS `t2`; drop table t2;
CREATE TABLE `t2` ( CREATE TABLE `t2` (
`a` int(11) default NULL, `a` int(11) default NULL,
`b` int(11) default NULL, `b` int(11) default NULL,
...@@ -510,42 +545,3 @@ show status like 'Handler_read_next'; ...@@ -510,42 +545,3 @@ show status like 'Handler_read_next';
Variable_name Value Variable_name Value
Handler_read_next 0 Handler_read_next 0
drop table t1, t2; drop table t1, t2;
drop table t1;
create table t1 (a int) partition by list(a) (
partition p0 values in (1,2),
partition p1 values in (3,4)
);
insert into t1 values (1),(1),(2),(2),(3),(4),(3),(4);
flush status;
update t1 set a=100 where a=5;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 0
flush status;
update t1 set a=100 where a+1=5+1;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 10
flush status;
delete from t1 where a=5;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 0
flush status;
delete from t1 where a+1=5+1;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 10
create table t2 like t1;
insert into t2 select * from t2;
flush status;
update t1,t2 set t1.a=1000, t2.a=1000 where t1.a=5 and t2.a=5;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 3
flush status;
delete t1,t2 from t1, t2 where t1.a=5 and t2.a=5;
show status like 'Handler_read_rnd_next';
Variable_name Value
Handler_read_rnd_next 3
drop table t1,t2;
...@@ -316,25 +316,24 @@ delete t1,t2 from t1, t2 where t1.a=5 and t2.a=5; ...@@ -316,25 +316,24 @@ delete t1,t2 from t1, t2 where t1.a=5 and t2.a=5;
show status like 'Handler_read_rnd_next'; show status like 'Handler_read_rnd_next';
drop table t1,t2; drop table t1,t2;
# WL# 2986 #
DROP TABLE IF EXISTS `t1`; # WL#2986 Tests (Checking if partition pruning results are used at query
# execution phase)
#
CREATE TABLE `t1` ( CREATE TABLE `t1` (
`a` int(11) default NULL `a` int(11) default NULL
); );
INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); INSERT INTO t1 VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` ( CREATE TABLE `t2` (
`a` int(11) default NULL, `a` int(11) default NULL,
KEY `a` (`a`) KEY `a` (`a`)
) ; ) ;
insert into t2 select A.a + 10*(B.a + 10* C.a) from t1 A, t1 B, t1 C ; insert into t2 select A.a + 10*(B.a + 10* C.a) from t1 A, t1 B, t1 C ;
insert into t1 select a from t2; insert into t1 select a from t2;
DROP TABLE IF EXISTS `t2`; drop table t2;
CREATE TABLE `t2` ( CREATE TABLE `t2` (
`a` int(11) default NULL, `a` int(11) default NULL,
`b` int(11) default NULL `b` int(11) default NULL
...@@ -377,8 +376,7 @@ flush status; ...@@ -377,8 +376,7 @@ flush status;
delete from t2 where a > 600; delete from t2 where a > 600;
show status like 'Handler_read_rnd_next'; show status like 'Handler_read_rnd_next';
drop table t2;
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` ( CREATE TABLE `t2` (
`a` int(11) default NULL, `a` int(11) default NULL,
`b` int(11) default NULL, `b` int(11) default NULL,
...@@ -448,5 +446,6 @@ show status like 'Handler_read_prev'; ...@@ -448,5 +446,6 @@ show status like 'Handler_read_prev';
show status like 'Handler_read_next'; show status like 'Handler_read_next';
drop table t1, t2; drop table t1, t2;
# No tests for NULLs in RANGE(monotonic_expr()) - they depend on BUG#15447 # No tests for NULLs in RANGE(monotonic_expr()) - they depend on BUG#15447
# being fixed. # being fixed.
...@@ -52,7 +52,6 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ...@@ -52,7 +52,6 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
table_list->view_db.str, table_list->view_name.str); table_list->view_db.str, table_list->view_name.str);
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
thd->proc_info="init"; thd->proc_info="init";
table->map=1; table->map=1;
...@@ -79,6 +78,8 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ...@@ -79,6 +78,8 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
!(specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE)) && !(specialflag & (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE)) &&
!(table->triggers && table->triggers->has_delete_triggers())) !(table->triggers && table->triggers->has_delete_triggers()))
{ {
/* Update the table->file->records number */
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
ha_rows const maybe_deleted= table->file->records; ha_rows const maybe_deleted= table->file->records;
/* /*
If all rows shall be deleted, we always log this statement-based If all rows shall be deleted, we always log this statement-based
...@@ -108,12 +109,9 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, ...@@ -108,12 +109,9 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds,
send_ok(thd); // No matching records send_ok(thd); // No matching records
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/*
Update the table->records number (note: we probably could remove the
previous file->info() call)
*/
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
#endif #endif
/* Update the table->file->records number */
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
table->used_keys.clear_all(); table->used_keys.clear_all();
table->quick_keys.clear_all(); // Can't use 'only index' table->quick_keys.clear_all(); // Can't use 'only index'
......
...@@ -168,7 +168,6 @@ int mysql_update(THD *thd, ...@@ -168,7 +168,6 @@ int mysql_update(THD *thd,
thd->proc_info="init"; thd->proc_info="init";
table= table_list->table; table= table_list->table;
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
/* Calculate "table->used_keys" based on the WHERE */ /* Calculate "table->used_keys" based on the WHERE */
table->used_keys= table->s->keys_in_use; table->used_keys= table->s->keys_in_use;
...@@ -252,12 +251,9 @@ int mysql_update(THD *thd, ...@@ -252,12 +251,9 @@ int mysql_update(THD *thd,
send_ok(thd); // No matching records send_ok(thd); // No matching records
DBUG_RETURN(0); DBUG_RETURN(0);
} }
/*
Update the table->records number (note: we probably could remove the
previous file->info() call)
*/
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
#endif #endif
/* Update the table->file->records number */
table->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK);
select= make_select(table, 0, 0, conds, 0, &error); select= make_select(table, 0, 0, conds, 0, &error);
if (error || !limit || if (error || !limit ||
......
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