MDEV-18732 InnoDB: ALTER IGNORE returns error for NULL
Only starting with MariaDB 10.3.8 (MDEV-16365), InnoDB can actually handle ALTER IGNORE TABLE correctly when introducing a NOT NULL attribute to a column that contains a NULL value. Between MariaDB Server 10.0 and 10.2, we would incorrectly return an error for ALTER IGNORE TABLE when the column contains a NULL value.
This commit is contained in:
parent
19df45a705
commit
91e4f00389
@ -55,3 +55,37 @@ CREATE TABLE t1(c1 INT) ENGINE=InnoDB;
|
||||
ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1);
|
||||
ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1);
|
||||
DROP TABLE t1;
|
||||
#
|
||||
# MDEV-18732 InnoDB: ALTER IGNORE returns error for NULL
|
||||
#
|
||||
SET @mode = @@sql_mode;
|
||||
SET sql_mode = STRICT_TRANS_TABLES;
|
||||
CREATE TABLE t1(c INT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
ALTER IGNORE TABLE t1 MODIFY c INT NOT NULL;
|
||||
affected rows: 1
|
||||
info: Records: 1 Duplicates: 0 Warnings: 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c' at row 1
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
ERROR 23000: Column 'c' cannot be null
|
||||
SELECT * FROM t1;
|
||||
c
|
||||
0
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(c INT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (NULL),(1),(1);
|
||||
ALTER IGNORE TABLE t1 ADD UNIQUE(c);
|
||||
affected rows: 3
|
||||
info: Records: 3 Duplicates: 1 Warnings: 0
|
||||
ALTER IGNORE TABLE t1 ADD PRIMARY KEY(c);
|
||||
affected rows: 2
|
||||
info: Records: 2 Duplicates: 0 Warnings: 1
|
||||
Warnings:
|
||||
Warning 1265 Data truncated for column 'c' at row 1
|
||||
SELECT * FROM t1;
|
||||
c
|
||||
0
|
||||
1
|
||||
DROP TABLE t1;
|
||||
SET sql_mode = @mode;
|
||||
|
@ -76,6 +76,32 @@ ALTER TABLE t1 ADD CONSTRAINT UNIQUE KEY i1(c1);
|
||||
ALTER TABLE t1 CHANGE c1 c1 INT NOT NULL,ADD KEY(c1);
|
||||
DROP TABLE t1;
|
||||
|
||||
--echo #
|
||||
--echo # MDEV-18732 InnoDB: ALTER IGNORE returns error for NULL
|
||||
--echo #
|
||||
|
||||
SET @mode = @@sql_mode;
|
||||
SET sql_mode = STRICT_TRANS_TABLES;
|
||||
CREATE TABLE t1(c INT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
--enable_info
|
||||
ALTER IGNORE TABLE t1 MODIFY c INT NOT NULL;
|
||||
--disable_info
|
||||
--error ER_BAD_NULL_ERROR
|
||||
INSERT INTO t1 VALUES (NULL);
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
CREATE TABLE t1(c INT) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES (NULL),(1),(1);
|
||||
--enable_info
|
||||
ALTER IGNORE TABLE t1 ADD UNIQUE(c);
|
||||
ALTER IGNORE TABLE t1 ADD PRIMARY KEY(c);
|
||||
--disable_info
|
||||
SELECT * FROM t1;
|
||||
DROP TABLE t1;
|
||||
SET sql_mode = @mode;
|
||||
|
||||
# Check that all connections opened by test cases in this file are really
|
||||
# gone so execution of other tests won't be affected by their presence.
|
||||
--source include/wait_until_count_sessions.inc
|
||||
|
@ -328,7 +328,7 @@ ha_innobase::check_if_supported_inplace_alter(
|
||||
NULL to a NOT NULL value. */
|
||||
if ((ha_alter_info->handler_flags
|
||||
& Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE)
|
||||
&& !thd_is_strict_mode(user_thd)) {
|
||||
&& (ha_alter_info->ignore || !thd_is_strict_mode(user_thd))) {
|
||||
ha_alter_info->unsupported_reason = innobase_get_err_msg(
|
||||
ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL);
|
||||
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
|
||||
|
@ -332,7 +332,7 @@ ha_innobase::check_if_supported_inplace_alter(
|
||||
NULL to a NOT NULL value. */
|
||||
if ((ha_alter_info->handler_flags
|
||||
& Alter_inplace_info::ALTER_COLUMN_NOT_NULLABLE)
|
||||
&& !thd_is_strict_mode(user_thd)) {
|
||||
&& (ha_alter_info->ignore || !thd_is_strict_mode(user_thd))) {
|
||||
ha_alter_info->unsupported_reason = innobase_get_err_msg(
|
||||
ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL);
|
||||
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
|
||||
|
Loading…
x
Reference in New Issue
Block a user