Loading mysql-test/r/partition.result +70 −0 Original line number Diff line number Diff line Loading @@ -1637,4 +1637,74 @@ select count(*) from t1, t2 where t1.createdDate = t2.createdDate; count(*) 1 drop table t1, t2; create table t1 (s1 int) partition by hash(s1) partitions 2; create index i on t1 (s1); insert into t1 values (1); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; s1 1 1 1 1 1 1 1 1 drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (1); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; s1 1 1 1 1 1 1 1 1 drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (20); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; s1 20 20 20 20 20 20 20 20 drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (1), (2), (3), (4), (5), (6), (7), (8); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; insert into t1 select s1 from t1 where s1=3; select count(*) from t1; count(*) 288 drop table t1; End of 5.1 tests mysql-test/t/partition.test +49 −0 Original line number Diff line number Diff line Loading @@ -1791,4 +1791,53 @@ select count(*) from t1, t2 where t1.createdDate = t2.createdDate; drop table t1, t2; # # Bug #38005 Partitions: error with insert select # create table t1 (s1 int) partition by hash(s1) partitions 2; create index i on t1 (s1); insert into t1 values (1); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (1); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (20); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (1), (2), (3), (4), (5), (6), (7), (8); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; insert into t1 select s1 from t1 where s1=3; select count(*) from t1; drop table t1; --echo End of 5.1 tests sql/ha_partition.cc +33 −0 Original line number Diff line number Diff line Loading @@ -4290,6 +4290,17 @@ int ha_partition::handle_unordered_scan_next_partition(uchar * buf) break; case partition_index_first: DBUG_PRINT("info", ("index_first on partition %d", i)); /* MyISAM engine can fail if we call index_first() when indexes disabled */ /* that happens if the table is empty. */ /* Here we use file->stats.records instead of file->records() because */ /* file->records() is supposed to return an EXACT count, and it can be */ /* possibly slow. We don't need an exact number, an approximate one- from*/ /* the last ::info() call - is sufficient. */ if (file->stats.records == 0) { error= HA_ERR_END_OF_FILE; break; } error= file->index_first(buf); break; case partition_index_first_unordered: Loading Loading @@ -4377,10 +4388,32 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order) m_start_key.flag); break; case partition_index_first: /* MyISAM engine can fail if we call index_first() when indexes disabled */ /* that happens if the table is empty. */ /* Here we use file->stats.records instead of file->records() because */ /* file->records() is supposed to return an EXACT count, and it can be */ /* possibly slow. We don't need an exact number, an approximate one- from*/ /* the last ::info() call - is sufficient. */ if (file->stats.records == 0) { error= HA_ERR_END_OF_FILE; break; } error= file->index_first(rec_buf_ptr); reverse_order= FALSE; break; case partition_index_last: /* MyISAM engine can fail if we call index_last() when indexes disabled */ /* that happens if the table is empty. */ /* Here we use file->stats.records instead of file->records() because */ /* file->records() is supposed to return an EXACT count, and it can be */ /* possibly slow. We don't need an exact number, an approximate one- from*/ /* the last ::info() call - is sufficient. */ if (file->stats.records == 0) { error= HA_ERR_END_OF_FILE; break; } error= file->index_last(rec_buf_ptr); reverse_order= TRUE; break; Loading sql/opt_range.cc +5 −3 Original line number Diff line number Diff line Loading @@ -3145,10 +3145,12 @@ int find_used_partitions(PART_PRUNE_PARAM *ppar, SEL_ARG *key_tree) ppar->subpart_fields);); /* Find the subpartition (it's HASH/KEY so we always have one) */ partition_info *part_info= ppar->part_info; uint32 subpart_id= part_info->get_subpartition_id(part_info); uint32 part_id, subpart_id; if (part_info->get_subpartition_id(part_info, &subpart_id)) return 0; /* Mark this partition as used in each subpartition. */ uint32 part_id; while ((part_id= ppar->part_iter.get_next(&ppar->part_iter)) != NOT_A_PARTITION_ID) { Loading sql/partition_info.h +3 −2 Original line number Diff line number Diff line Loading @@ -25,7 +25,8 @@ class partition_info; typedef int (*get_part_id_func)(partition_info *part_info, uint32 *part_id, longlong *func_value); typedef uint32 (*get_subpart_id_func)(partition_info *part_info); typedef int (*get_subpart_id_func)(partition_info *part_info, uint32 *part_id); struct st_ddl_log_memory_entry; Loading Loading
mysql-test/r/partition.result +70 −0 Original line number Diff line number Diff line Loading @@ -1637,4 +1637,74 @@ select count(*) from t1, t2 where t1.createdDate = t2.createdDate; count(*) 1 drop table t1, t2; create table t1 (s1 int) partition by hash(s1) partitions 2; create index i on t1 (s1); insert into t1 values (1); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; s1 1 1 1 1 1 1 1 1 drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (1); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; s1 1 1 1 1 1 1 1 1 drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (20); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; s1 20 20 20 20 20 20 20 20 drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (1), (2), (3), (4), (5), (6), (7), (8); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; insert into t1 select s1 from t1 where s1=3; select count(*) from t1; count(*) 288 drop table t1; End of 5.1 tests
mysql-test/t/partition.test +49 −0 Original line number Diff line number Diff line Loading @@ -1791,4 +1791,53 @@ select count(*) from t1, t2 where t1.createdDate = t2.createdDate; drop table t1, t2; # # Bug #38005 Partitions: error with insert select # create table t1 (s1 int) partition by hash(s1) partitions 2; create index i on t1 (s1); insert into t1 values (1); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (1); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (20); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; select * from t1; drop table t1; create table t1 (s1 int) partition by range(s1) (partition pa1 values less than (10), partition pa2 values less than MAXVALUE); create index i on t1 (s1); insert into t1 values (1), (2), (3), (4), (5), (6), (7), (8); insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1; insert into t1 select s1 from t1 order by s1 desc; insert into t1 select s1 from t1 where s1=3; select count(*) from t1; drop table t1; --echo End of 5.1 tests
sql/ha_partition.cc +33 −0 Original line number Diff line number Diff line Loading @@ -4290,6 +4290,17 @@ int ha_partition::handle_unordered_scan_next_partition(uchar * buf) break; case partition_index_first: DBUG_PRINT("info", ("index_first on partition %d", i)); /* MyISAM engine can fail if we call index_first() when indexes disabled */ /* that happens if the table is empty. */ /* Here we use file->stats.records instead of file->records() because */ /* file->records() is supposed to return an EXACT count, and it can be */ /* possibly slow. We don't need an exact number, an approximate one- from*/ /* the last ::info() call - is sufficient. */ if (file->stats.records == 0) { error= HA_ERR_END_OF_FILE; break; } error= file->index_first(buf); break; case partition_index_first_unordered: Loading Loading @@ -4377,10 +4388,32 @@ int ha_partition::handle_ordered_index_scan(uchar *buf, bool reverse_order) m_start_key.flag); break; case partition_index_first: /* MyISAM engine can fail if we call index_first() when indexes disabled */ /* that happens if the table is empty. */ /* Here we use file->stats.records instead of file->records() because */ /* file->records() is supposed to return an EXACT count, and it can be */ /* possibly slow. We don't need an exact number, an approximate one- from*/ /* the last ::info() call - is sufficient. */ if (file->stats.records == 0) { error= HA_ERR_END_OF_FILE; break; } error= file->index_first(rec_buf_ptr); reverse_order= FALSE; break; case partition_index_last: /* MyISAM engine can fail if we call index_last() when indexes disabled */ /* that happens if the table is empty. */ /* Here we use file->stats.records instead of file->records() because */ /* file->records() is supposed to return an EXACT count, and it can be */ /* possibly slow. We don't need an exact number, an approximate one- from*/ /* the last ::info() call - is sufficient. */ if (file->stats.records == 0) { error= HA_ERR_END_OF_FILE; break; } error= file->index_last(rec_buf_ptr); reverse_order= TRUE; break; Loading
sql/opt_range.cc +5 −3 Original line number Diff line number Diff line Loading @@ -3145,10 +3145,12 @@ int find_used_partitions(PART_PRUNE_PARAM *ppar, SEL_ARG *key_tree) ppar->subpart_fields);); /* Find the subpartition (it's HASH/KEY so we always have one) */ partition_info *part_info= ppar->part_info; uint32 subpart_id= part_info->get_subpartition_id(part_info); uint32 part_id, subpart_id; if (part_info->get_subpartition_id(part_info, &subpart_id)) return 0; /* Mark this partition as used in each subpartition. */ uint32 part_id; while ((part_id= ppar->part_iter.get_next(&ppar->part_iter)) != NOT_A_PARTITION_ID) { Loading
sql/partition_info.h +3 −2 Original line number Diff line number Diff line Loading @@ -25,7 +25,8 @@ class partition_info; typedef int (*get_part_id_func)(partition_info *part_info, uint32 *part_id, longlong *func_value); typedef uint32 (*get_subpart_id_func)(partition_info *part_info); typedef int (*get_subpart_id_func)(partition_info *part_info, uint32 *part_id); struct st_ddl_log_memory_entry; Loading