mirror of
https://github.com/MariaDB/server.git
synced 2025-09-02 09:41:40 +03:00
MDEV-17376 Server fails to set ADD_PK_INDEX, DROP_PK_INDEX if unique index nominated as PK
Problem: ======== Server fails to notify the engine by not setting the ADD_PK_INDEX and DROP_PK_INDEX When there is a i) Change in candidate for primary key. ii) New candidate for primary key. Fix: ==== Server sets the ADD_PK_INDEX and DROP_PK_INDEX while doing alter for the above problematic case.
This commit is contained in:
107
mysql-test/suite/innodb/r/alter_candidate_key.result
Normal file
107
mysql-test/suite/innodb/r/alter_candidate_key.result
Normal file
@@ -0,0 +1,107 @@
|
||||
CREATE TABLE t1 (f1 INT NOT NULL, f2 INT NOT NULL,
|
||||
UNIQUE KEY uidx2(f1,f2),
|
||||
UNIQUE KEY uidx1(f2)) ENGINE=InnoDB;
|
||||
INSERT INTO t1 VALUES(1, 1);
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f1` int(11) NOT NULL,
|
||||
`f2` int(11) NOT NULL,
|
||||
UNIQUE KEY `uidx2` (`f1`,`f2`),
|
||||
UNIQUE KEY `uidx1` (`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter
|
||||
SIGNAL conc_dml WAIT_FOR go_ahead';
|
||||
ALTER TABLE t1 CHANGE COLUMN f1 f11 INT, ALGORITHM=INPLACE;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR conc_dml';
|
||||
DELETE FROM t1;
|
||||
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f11` int(11) DEFAULT NULL,
|
||||
`f2` int(11) NOT NULL,
|
||||
UNIQUE KEY `uidx1` (`f2`),
|
||||
UNIQUE KEY `uidx2` (`f11`,`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
CHECK TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(f1 INT, f2 INT,
|
||||
PRIMARY KEY(f1, f2),
|
||||
UNIQUE INDEX uidx2 (f1, f2),
|
||||
UNIQUE INDEX uidx1 (f2))ENGINE=InnoDB;
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f1` int(11) NOT NULL DEFAULT '0',
|
||||
`f2` int(11) NOT NULL DEFAULT '0',
|
||||
UNIQUE KEY `uidx2` (`f1`,`f2`),
|
||||
UNIQUE KEY `uidx1` (`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
SET DEBUG_SYNC = 'innodb_inplace_alter_table_enter
|
||||
SIGNAL conc_dml WAIT_FOR go_ahead';
|
||||
ALTER TABLE t1 CHANGE COLUMN f1 f11 INT, ALGORITHM=INPLACE;
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR conc_dml';
|
||||
INSERT INTO t1 VALUES(1, 1), (1, 1);
|
||||
ERROR 23000: Duplicate entry '1-1' for key 'uidx2'
|
||||
SET DEBUG_SYNC = 'now SIGNAL go_ahead';
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f11` int(11) DEFAULT NULL,
|
||||
`f2` int(11) NOT NULL DEFAULT '0',
|
||||
UNIQUE KEY `uidx1` (`f2`),
|
||||
UNIQUE KEY `uidx2` (`f11`,`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
CHECK TABLE t1;
|
||||
Table Op Msg_type Msg_text
|
||||
test.t1 check status OK
|
||||
DROP TABLE t1;
|
||||
SET SQL_MODE= strict_trans_tables;
|
||||
CREATE TABLE t1(a INT UNIQUE) ENGINE=InnoDB;
|
||||
SET DEBUG_SYNC='row_log_table_apply1_before SIGNAL dml WAIT_FOR dml_done';
|
||||
ALTER TABLE t1 MODIFY COLUMN a INT NOT NULL;
|
||||
SET DEBUG_SYNC='now WAIT_FOR dml';
|
||||
BEGIN;
|
||||
INSERT INTO t1 SET a=NULL;
|
||||
ROLLBACK;
|
||||
set DEBUG_SYNC='now SIGNAL dml_done';
|
||||
ERROR 22004: Invalid use of NULL value
|
||||
DROP TABLE t1;
|
||||
SET DEBUG_SYNC="RESET";
|
||||
SET SQL_MODE=DEFAULT;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL, PRIMARY KEY(f1, f2),
|
||||
UNIQUE KEY(f2))ENGINE=InnoDB;
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f1` int(11) NOT NULL,
|
||||
`f2` int(11) NOT NULL,
|
||||
UNIQUE KEY `f2` (`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1(f1 INT NOT NULL, f2 INT NOT NULL,
|
||||
UNIQUE KEY(f2), UNIQUE KEY(f2))ENGINE=InnoDB;
|
||||
Warnings:
|
||||
Note 1831 Duplicate index `f2_2`. This is deprecated and will be disallowed in a future release.
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f1` int(11) NOT NULL,
|
||||
`f2` int(11) NOT NULL,
|
||||
UNIQUE KEY `f2` (`f2`),
|
||||
UNIQUE KEY `f2_2` (`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
ALTER TABLE t1 DROP INDEX f2, ALGORITHM=INPLACE;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`f1` int(11) NOT NULL,
|
||||
`f2` int(11) NOT NULL,
|
||||
UNIQUE KEY `f2_2` (`f2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
@@ -85,17 +85,6 @@ t1 CREATE TABLE `t1` (
|
||||
UNIQUE KEY `c2` (`c2`),
|
||||
UNIQUE KEY `c2_2` (`c2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT
|
||||
ALTER TABLE t1 DROP INDEX c2, ALGORITHM = INPLACE;
|
||||
ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Dropping a primary key is not allowed without also adding a new primary key. Try ALGORITHM=COPY.
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`c1` int(11) NOT NULL,
|
||||
`c2` int(11) NOT NULL,
|
||||
`c3` text NOT NULL,
|
||||
UNIQUE KEY `c2` (`c2`),
|
||||
UNIQUE KEY `c2_2` (`c2`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=COMPACT
|
||||
ALTER TABLE t1 DROP INDEX c2, ADD PRIMARY KEY(c1);
|
||||
# session default
|
||||
SET DEBUG_SYNC = 'now WAIT_FOR scanned';
|
||||
|
Reference in New Issue
Block a user