mirror of
https://github.com/MariaDB/server.git
synced 2025-01-30 18:41:56 +01:00
7a27db778e
Allow instant changes of columns in ROW_FORMAT=REDUNDANT from NOT NULL to NULL. Later, this may be implemented for ROW_FORMAT=COMPACT or DYNAMIC, but in that case any indexes on the table must be rebuilt. dict_table_t::prepare_instant(): Add some debug assertions, and relax a debug assertion so that the number of fields is allowed not to change. dict_index_t::instant_add_field(): Relax a debug assertion, allowing a column to change from NOT NULL to NULL. dict_table_t::instant_column(): Add debug assertions. instant_alter_column_possible(): Allow ALTER_COLUMN_NULLABLE when applicable. innodb_insert_sys_columns(): Add the parameter bool update=false to run UPDATE instead of INSERT. innobase_instant_add_col(): Remove; let the only caller invoke innodb_insert_sys_columns() directly. innobase_instant_try(): Update the SYS_COLUMNS record if the column is changed. Only convert the table to the instant ALTER TABLE format if necessary. For ALTER_COLUMN_NULLABLE in ROW_FORMAT=REDUNDANT, there is no data format change.
57 lines
1.6 KiB
Text
57 lines
1.6 KiB
Text
--source include/have_innodb.inc
|
|
|
|
create table t (a int NOT NULL) engine=innodb row_format= compressed;
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED
|
|
alter table t modify a int NULL, algorithm=instant;
|
|
drop table t;
|
|
|
|
create table t (a int NOT NULL) engine=innodb row_format= dynamic;
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED
|
|
alter table t modify a int NULL, algorithm=instant;
|
|
drop table t;
|
|
|
|
create table t (a int NOT NULL) engine=innodb row_format= compact;
|
|
--error ER_ALTER_OPERATION_NOT_SUPPORTED
|
|
alter table t modify a int NULL, algorithm=instant;
|
|
drop table t;
|
|
|
|
create table t (
|
|
id int primary key,
|
|
a int NOT NULL default 0,
|
|
b int NOT NULL default 0,
|
|
c int NOT NULL default 0,
|
|
index idx (a,b,c)
|
|
) engine=innodb row_format=redundant;
|
|
|
|
--error ER_BAD_NULL_ERROR
|
|
insert into t (id, a) values (0, NULL);
|
|
--error ER_BAD_NULL_ERROR
|
|
insert into t (id, b) values (0, NULL);
|
|
--error ER_BAD_NULL_ERROR
|
|
insert into t (id, c) values (0, NULL);
|
|
|
|
insert into t values (1,1,1,1);
|
|
|
|
set @id = (select table_id from information_schema.innodb_sys_tables
|
|
where name = 'test/t');
|
|
|
|
--replace_column 1 TABLE_ID
|
|
select * from information_schema.innodb_sys_columns where table_id=@id;
|
|
|
|
alter table t modify a int NULL, algorithm=instant;
|
|
insert into t values (2, NULL, 2, 2);
|
|
|
|
alter table t modify b int NULL, algorithm=nocopy;
|
|
insert into t values (3, NULL, NULL, 3);
|
|
|
|
alter table t modify c int NULL, algorithm=inplace;
|
|
insert into t values (4, NULL, NULL, NULL);
|
|
|
|
--replace_column 1 TABLE_ID
|
|
select * from information_schema.innodb_sys_columns where table_id=@id;
|
|
|
|
select * from t;
|
|
|
|
check table t;
|
|
|
|
drop table t;
|