mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 12:02:42 +01:00
MDEV-7990: ERROR 1526 when procedure executed for second time ALTER TABLE partition ... pMAX values less than MAXVALUE
Made dipper copy of the lists, so now one execution has no influence on the other.
This commit is contained in:
parent
39e8dc9d28
commit
abd31ca2b6
3 changed files with 154 additions and 0 deletions
53
mysql-test/r/partition_alter.result
Normal file
53
mysql-test/r/partition_alter.result
Normal file
|
@ -0,0 +1,53 @@
|
|||
CREATE TABLE `test_data` (
|
||||
`hid` bigint(20) unsigned NOT NULL,
|
||||
`itid` bigint(20) unsigned NOT NULL,
|
||||
`clocktime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`values` double(16,4) NOT NULL,
|
||||
PRIMARY KEY (`hid`,`itid`,`clocktime`)
|
||||
) ;
|
||||
INSERT INTO `test_data` (`hid`, `itid`, `clocktime`, `values`) VALUES
|
||||
(1, 1, '2015-03-10 06:25:16', 0.0000),
|
||||
(1, 1, '2015-03-10 06:26:24', 0.0000),
|
||||
(1, 1, '2015-03-10 06:27:32', 0.0000),
|
||||
(1, 1, '2015-03-10 06:28:40', 0.0000),
|
||||
(1, 1, '2015-03-10 06:29:49', 0.0000),
|
||||
(1, 1, '2015-03-10 06:30:57', 0.0000),
|
||||
(1, 1, '2015-03-10 06:32:05', 0.0000),
|
||||
(1, 1, '2015-03-10 06:33:14', 0.0000),
|
||||
(1, 1, '2015-03-10 06:34:22', 0.0000),
|
||||
(1, 1, '2015-03-10 06:35:30', 0.0000),
|
||||
(1, 1, '2015-03-10 06:36:39', 0.0000),
|
||||
(1, 1, '2015-03-10 06:37:47', 0.0000),
|
||||
(1, 1, '2015-03-10 06:38:55', 0.0000),
|
||||
(1, 1, '2015-03-10 06:40:03', 0.0000),
|
||||
(1, 1, '2015-03-10 06:41:09', 0.0000),
|
||||
(1, 1, '2015-03-10 06:42:21', 0.0000),
|
||||
(1, 1, '2015-03-10 06:43:29', 0.0000),
|
||||
(1, 1, '2015-03-10 06:44:37', 0.0000),
|
||||
(1, 1, '2015-03-10 06:45:46', 0.0000),
|
||||
(1, 1, '2015-03-10 06:47:05', 0.0000),
|
||||
(1, 1, '2015-03-10 06:48:21', 0.0000),
|
||||
(1, 1, '2015-03-10 06:49:41', 0.0000),
|
||||
(1, 1, '2015-03-10 06:50:58', 0.0000),
|
||||
(1, 1, '2015-03-10 06:52:08', 0.0000),
|
||||
(1, 1, '2015-03-10 06:53:17', 0.0000),
|
||||
(1, 1, '2015-03-10 06:54:25', 0.0000),
|
||||
(563, 1, '2015-03-17 14:28:28', 0.3125),
|
||||
(563, 1, '2015-03-17 14:29:39', 0.2775),
|
||||
(563, 1, '2015-03-17 14:30:49', 0.2675);
|
||||
CREATE PROCEDURE `create_part_max`()
|
||||
alter table `test_data`
|
||||
partition by range(unix_timestamp(clocktime)) (
|
||||
partition partMAX values less than MAXVALUE
|
||||
);
|
||||
call create_part_max();
|
||||
call create_part_max();
|
||||
drop procedure create_part_max;
|
||||
prepare stmt from "alter table `test_data`
|
||||
partition by range(unix_timestamp(clocktime)) (
|
||||
partition partMAX values less than MAXVALUE
|
||||
)";
|
||||
execute stmt;
|
||||
execute stmt;
|
||||
deallocate prepare stmt;
|
||||
drop table test_data;
|
66
mysql-test/t/partition_alter.test
Normal file
66
mysql-test/t/partition_alter.test
Normal file
|
@ -0,0 +1,66 @@
|
|||
--source include/have_partition.inc
|
||||
|
||||
CREATE TABLE `test_data` (
|
||||
`hid` bigint(20) unsigned NOT NULL,
|
||||
`itid` bigint(20) unsigned NOT NULL,
|
||||
`clocktime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`values` double(16,4) NOT NULL,
|
||||
PRIMARY KEY (`hid`,`itid`,`clocktime`)
|
||||
) ;
|
||||
|
||||
INSERT INTO `test_data` (`hid`, `itid`, `clocktime`, `values`) VALUES
|
||||
(1, 1, '2015-03-10 06:25:16', 0.0000),
|
||||
(1, 1, '2015-03-10 06:26:24', 0.0000),
|
||||
(1, 1, '2015-03-10 06:27:32', 0.0000),
|
||||
(1, 1, '2015-03-10 06:28:40', 0.0000),
|
||||
(1, 1, '2015-03-10 06:29:49', 0.0000),
|
||||
(1, 1, '2015-03-10 06:30:57', 0.0000),
|
||||
(1, 1, '2015-03-10 06:32:05', 0.0000),
|
||||
(1, 1, '2015-03-10 06:33:14', 0.0000),
|
||||
(1, 1, '2015-03-10 06:34:22', 0.0000),
|
||||
(1, 1, '2015-03-10 06:35:30', 0.0000),
|
||||
(1, 1, '2015-03-10 06:36:39', 0.0000),
|
||||
(1, 1, '2015-03-10 06:37:47', 0.0000),
|
||||
(1, 1, '2015-03-10 06:38:55', 0.0000),
|
||||
(1, 1, '2015-03-10 06:40:03', 0.0000),
|
||||
(1, 1, '2015-03-10 06:41:09', 0.0000),
|
||||
(1, 1, '2015-03-10 06:42:21', 0.0000),
|
||||
(1, 1, '2015-03-10 06:43:29', 0.0000),
|
||||
(1, 1, '2015-03-10 06:44:37', 0.0000),
|
||||
(1, 1, '2015-03-10 06:45:46', 0.0000),
|
||||
(1, 1, '2015-03-10 06:47:05', 0.0000),
|
||||
(1, 1, '2015-03-10 06:48:21', 0.0000),
|
||||
(1, 1, '2015-03-10 06:49:41', 0.0000),
|
||||
(1, 1, '2015-03-10 06:50:58', 0.0000),
|
||||
(1, 1, '2015-03-10 06:52:08', 0.0000),
|
||||
(1, 1, '2015-03-10 06:53:17', 0.0000),
|
||||
(1, 1, '2015-03-10 06:54:25', 0.0000),
|
||||
(563, 1, '2015-03-17 14:28:28', 0.3125),
|
||||
(563, 1, '2015-03-17 14:29:39', 0.2775),
|
||||
(563, 1, '2015-03-17 14:30:49', 0.2675);
|
||||
|
||||
|
||||
CREATE PROCEDURE `create_part_max`()
|
||||
alter table `test_data`
|
||||
partition by range(unix_timestamp(clocktime)) (
|
||||
partition partMAX values less than MAXVALUE
|
||||
);
|
||||
|
||||
call create_part_max();
|
||||
|
||||
call create_part_max();
|
||||
|
||||
drop procedure create_part_max;
|
||||
|
||||
prepare stmt from "alter table `test_data`
|
||||
partition by range(unix_timestamp(clocktime)) (
|
||||
partition partMAX values less than MAXVALUE
|
||||
)";
|
||||
|
||||
execute stmt;
|
||||
execute stmt;
|
||||
|
||||
deallocate prepare stmt;
|
||||
|
||||
drop table test_data;
|
||||
|
|
@ -77,6 +77,41 @@ partition_info *partition_info::get_clone()
|
|||
part_clone->subpartitions.push_back(subpart_clone);
|
||||
}
|
||||
clone->partitions.push_back(part_clone);
|
||||
part_clone->list_val_list.empty();
|
||||
List_iterator<part_elem_value> list_val_it(part->list_val_list);
|
||||
part_elem_value *new_val_arr=
|
||||
(part_elem_value *)sql_alloc(sizeof(part_elem_value) *
|
||||
part->list_val_list.elements);
|
||||
if (!new_val_arr)
|
||||
{
|
||||
mem_alloc_error(sizeof(part_elem_value) * part->list_val_list.elements);
|
||||
DBUG_RETURN(NULL);
|
||||
}
|
||||
p_column_list_val *new_colval_arr=
|
||||
(p_column_list_val*)sql_alloc(sizeof(p_column_list_val) *
|
||||
num_columns *
|
||||
part->list_val_list.elements);
|
||||
if (!new_colval_arr)
|
||||
{
|
||||
mem_alloc_error(sizeof(p_column_list_val) * num_columns *
|
||||
part->list_val_list.elements);
|
||||
DBUG_RETURN(NULL);
|
||||
}
|
||||
part_elem_value *val;
|
||||
while ((val= list_val_it++))
|
||||
{
|
||||
part_elem_value *new_val= new_val_arr++;
|
||||
memcpy(new_val, val, sizeof(part_elem_value));
|
||||
if (!val->null_value)
|
||||
{
|
||||
p_column_list_val *new_colval= new_colval_arr;
|
||||
new_colval_arr+= num_columns;
|
||||
memcpy(new_colval, val->col_val_array,
|
||||
sizeof(p_column_list_val) * num_columns);
|
||||
new_val->col_val_array= new_colval;
|
||||
}
|
||||
part_clone->list_val_list.push_back(new_val);
|
||||
}
|
||||
}
|
||||
DBUG_RETURN(clone);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue