polardbxengine/mysql-test/suite/innodb/t/sdi.test

495 lines
17 KiB
Plaintext

#
# Skip this test when MySQL has been built with other storage engines
# than InnoDB, it is because dumping SDI from mysql.ibd
# causes extra output when for example the ndbcluster storage engine is
# included and additional system tables are added to the MySQL data dictionary
# It is hard to separate this output
# from mysql.json
--source include/have_only_innodb.inc
#########################
# how to record this test JSON result content mismatch
# If required fix regex patterns in mysql-test/include/ibd2sdi.pl
# and mysql-test/suite/innodb/include/ibd2sdi_replace_pattern.inc,
# then run the test with --record option.
#########################
--let $SRC_DIR=$MYSQL_TEST_DIR/std_data/dd/sdi/innodb_sdi
# Create a directory to store json generated
--let $DEST_DIR=$MYSQL_TMP_DIR/sdi_dest/
--error 0,1
--force-rmdir $DEST_DIR
--mkdir $DEST_DIR
let $MYSQLD_BASEDIR= `select @@basedir`;
let $START_PAGE_SIZE= `select @@innodb_page_size`;
let $LOG_FILE_SIZE= `select @@innodb_log_file_size`;
# Set path for --datadir
let $MYSQLD_DATADIR = $MYSQL_TMP_DIR/datadir;
--mkdir $MYSQLD_DATADIR
let BOOTSTRAP_SQL=$MYSQL_TMP_DIR/boot.sql;
--echo # create bootstrap file
write_file $BOOTSTRAP_SQL;
CREATE DATABASE test;
EOF
# Set the bootstrap parameters with undo log encryption enabled
let NEW_CMD = $MYSQLD --no-defaults --innodb_dedicated_server=OFF --initialize-insecure --secure-file-priv="" --innodb_log_file_size=$LOG_FILE_SIZE --innodb_page_size=$START_PAGE_SIZE --datadir=$MYSQLD_DATADIR --init-file=$BOOTSTRAP_SQL --cluster-id=1 --cluster-start-index=1 --cluster-info='127.0.0.1:29211@1' </dev/null>>$MYSQLTEST_VARDIR/tmp/bootstrap.log 2>&1;
--echo # Stop the MTR default DB server
--source include/shutdown_mysqld.inc
--echo # Run the bootstrap command
--exec $NEW_CMD
--let $restart_parameters="restart: --datadir=$MYSQLD_DATADIR --innodb_log_file_size=$LOG_FILE_SIZE --innodb_log_files_in_group=2"
--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR $LOG_FILE_SIZE LOG_FILE_SIZE
--source include/start_mysqld.inc
CREATE TABLE t1 (a INT);
CREATE TABLE t2 (a INT PRIMARY KEY, b BLOB);
CREATE TABLE t3 (a INT PRIMARY KEY, b SMALLINT, c TEXT, d JSON, UNIQUE KEY k1(b), KEY k2(b, c(20)));
CREATE TABLE t4 (a INT PRIMARY KEY, b TINYINT, c MEDIUMINT, d BIGINT);
CREATE TABLE t5 (a INT NOT NULL, b INT NOT NULL, PRIMARY KEY(a,b), c DECIMAL(5,2), d FLOAT(7,4), e DOUBLE);
create table `t6` (
`c0291` char(140) not null,
`c0292` int(10) unsigned zerofill not null,
`c0293` time(3) default null,
`c0294` int(11) not null,
`c0295` binary(1) not null,
`c0296` datetime(6) not null,
`c0297` date default null,
`c0298` mediumtext not null,
`c0299` int(10) unsigned zerofill not null,
`c0300` decimal(54,6) not null,
primary key (`c0296`,`c0298`(186)),
unique key `i0002` (`c0294`),
unique key `i0005` (`c0298`(102)),
unique key `i0007` (`c0299`,`c0292`,`c0297`),
unique key `i0008` (`c0296`,`c0293`),
unique key `i0001` (`c0297`,`c0298`(240),`c0296`,`c0293`,`c0294`),
unique key `i0004` (`c0296`,`c0295`,`c0293`,`c0291`(95),`c0298`(215)),
key `i0003` (`c0296`,`c0291`(26)),
key `i0006` (`c0297`,`c0296`,`c0293`,`c0294`),
key `i0009` (`c0299`,`c0292`,`c0300`) using btree
) engine=innodb default charset=latin1 row_format=compact;
CREATE TABLE t7(
a TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
b INT NOT NULL DEFAULT '123',
c TIMESTAMP NOT NULL DEFAULT '2000-01-01 00:00:00'
) ROW_FORMAT=REDUNDANT ENGINE=InnoDB;
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd';
CREATE TABLE t8(fld1 INT NOT NULL PRIMARY KEY) TABLESPACE=ts1 ENGINE=InnoDB;
CREATE TABLE t9(fld1 INT NOT NULL, fld2 INT AS (fld1) VIRTUAL, KEY(fld2),
FOREIGN KEY(fld1) REFERENCES t8(fld1) ON UPDATE CASCADE) TABLESPACE=ts1 ENGINE=InnoDB;
CREATE TABLE t10(a INT PRIMARY KEY, b JSON, c BLOB, d LONGBLOB, e MEDIUMBLOB, f TINYBLOB);
CREATE TABLE t11 (a INT, b INT, c INT GENERATED ALWAYS AS(a+b), h VARCHAR(10),
j INT, m INT GENERATED ALWAYS AS(b + x), n VARCHAR(10),
p VARCHAR(20) GENERATED ALWAYS AS(CONCAT(n, y)),
x INT, y CHAR(20), z INT, INDEX idx1(c), INDEX idx2 (m), INDEX idx3(p)) ENGINE=InnoDB;
CREATE TABLE t12 (
id INT NOT NULL,
store_id INT NOT NULL,
x INT GENERATED ALWAYS AS (id + store_id)
) ENGINE=InnoDB
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN (21)
);
CREATE TABLE t13 (
FTS_DOC_ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
id int(10) not null ,
first_name varchar(50) NOT NULL,
last_name varchar(50) NOT NULL,
PRIMARY KEY (FTS_DOC_ID),
UNIQUE KEY idx_1 (first_name, last_name),
FULLTEXT KEY `idx_2` (first_name)
) ENGINE=InnoDB;
CREATE TABLE t14 (
i int(10) unsigned not null auto_increment primary key,
a varchar(255) not null,
FULLTEXT KEY (a)
) ENGINE = INNODB;
create table t15 (c1 int, c2 geometry not null SRID 0, spatial index (c2)) engine=innodb;
CREATE TABLE t16 (
a INT,
b INT,
c INT,
d INT,
e INT,
f INT,
PRIMARY KEY (a),
INDEX i1 (b),
INDEX i2 (c),
INDEX i3 (d),
INDEX i4 (e)
) ENGINE=INNODB TABLESPACE=`innodb_system`;
SET GLOBAL innodb_file_per_table=OFF;
CREATE TABLE t17(
c1 iNT AUTO_INCREMENT PRIMARY KEY) ENGINE=InnoDB;
SET GLOBAL innodb_file_per_table=default;
SET NAMES UTF8;
CREATE TABLE t18(హి INT, శరెెనిక BLOB);
--echo #
--echo # Bug#29020745: INNODB TABLESPACES WITH SUBPARTITIONS DO NOT
--echo # CONTAIN TABLE SDI OBJECT
--echo #
CREATE TABLE t18_ (a INT NOT NULL, b INT)
PARTITION BY RANGE (a) PARTITIONS 3 SUBPARTITION BY KEY (b) (
PARTITION p1 VALUES LESS THAN (200) (
SUBPARTITION p11,
SUBPARTITION p12,
SUBPARTITION p13),
PARTITION p2 VALUES LESS THAN (600) (
SUBPARTITION p21,
SUBPARTITION p22,
SUBPARTITION p23),
PARTITION p3 VALUES LESS THAN (1800) (
SUBPARTITION p31,
SUBPARTITION p32,
SUBPARTITION p33));
#--let $table_id=`select HEX(se_private_id) from mysql.tables where name = 't14'`
#--echo "table_id is $table_id"
#--let $count = `select count(*) from mysql.tablespace_files where file_name like './test/fts_%$table_id%'`
#--echo "count is $count"
#--let $val = 1
#--expr $count = $count - $val
#--echo "count is $count"
#while ($count >= 0)
#{
#--let $file_name$count = `select file_name from mysql.tablespace_files where file_name like './test/fts_%$table_id%' LIMIT $count,1`
#--echo "file_name is $file_name$count"
#dec $count;
#}
--source include/shutdown_mysqld.inc
--echo # Check SDI from mysql.ibd
--let JSON_FILE_PATH = $DEST_DIR/mysql.json
--exec $IBD2SDI $MYSQLD_DATADIR/mysql.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace_mysql.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/mysql.json $JSON_FILE_PATH
}
--echo # Check SDI from t1.ibd
--let JSON_FILE_PATH = $DEST_DIR/t1.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t1.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t1.json $JSON_FILE_PATH
}
--echo # Check SDI from t2.ibd
--let JSON_FILE_PATH = $DEST_DIR/t2.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t2.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t2.json $JSON_FILE_PATH
}
--echo # Check SDI from t3.ibd
--let JSON_FILE_PATH = $DEST_DIR/t3.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t3.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t3.json $JSON_FILE_PATH
}
--echo # Check SDI from t4.ibd
--let JSON_FILE_PATH = $DEST_DIR/t4.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t4.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t4.json $JSON_FILE_PATH
}
--echo # Check SDI from t5.ibd
--let JSON_FILE_PATH = $DEST_DIR/t5.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t5.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t5.json $JSON_FILE_PATH
}
--echo # Check SDI from t6.ibd
--let JSON_FILE_PATH = $DEST_DIR/t6.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t6.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t6.json $JSON_FILE_PATH
}
--echo # Check SDI from t7.ibd
--let JSON_FILE_PATH = $DEST_DIR/t7.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t7.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t7.json $JSON_FILE_PATH
}
--echo # Check SDI from ts1.ibd(holds t8 & t9)
--let JSON_FILE_PATH = $DEST_DIR/ts1.json
--exec $IBD2SDI $MYSQLD_DATADIR/ts1.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/ts1.json $JSON_FILE_PATH
}
--echo # Check SDI from t10.ibd
--let JSON_FILE_PATH = $DEST_DIR/t10.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t10.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t10.json $JSON_FILE_PATH
}
--echo # Check SDI from t11.ibd
--let JSON_FILE_PATH = $DEST_DIR/t11.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t11.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t11.json $JSON_FILE_PATH
}
--echo # Check SDI from partition tables t12.ibd
--let JSON_FILE_PATH = $DEST_DIR/t12#p#p0.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t12#P#p0.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t12#p#p0.json $JSON_FILE_PATH
}
--let JSON_FILE_PATH = $DEST_DIR/t12#p#p1.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t12#P#p1.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t12#p#p1.json $JSON_FILE_PATH
}
--echo # Check SDI from t13.ibd
--let JSON_FILE_PATH = $DEST_DIR/t13.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t13.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t13.json $JSON_FILE_PATH
}
--echo # Check SDI from t14.ibd
--let JSON_FILE_PATH = $DEST_DIR/t14.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t14.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t14.json $JSON_FILE_PATH
}
# This seems very hard
#--echo # Check SDI from FTS .ibd files
--echo # Check SDI from t15.ibd
--let JSON_FILE_PATH = $DEST_DIR/t15.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t15.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t15.json $JSON_FILE_PATH
}
--echo # Check SDI from system tablespace(has 16,17)
--let JSON_FILE_PATH = $DEST_DIR/ibdata1.json
--exec $IBD2SDI $MYSQLD_DATADIR/ibdata1 -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace_system.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/ibdata1.json $JSON_FILE_PATH
}
--echo # Check SDI from t18.ibd
--let JSON_FILE_PATH = $DEST_DIR/t18.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t18.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t18.json $JSON_FILE_PATH
}
--echo # Check SDI from t18_#p#p1#sp#p11.ibd
--echo # Should have both tablespace and table SDIs
--let JSON_FILE_PATH = $DEST_DIR/t18_#p#p1#sp#p11.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t18_#P#p1#SP#p11.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t18_#p#p1#sp#p11.json $JSON_FILE_PATH
}
--echo # Check SDI from t18_#p#p1#sp#p12.ibd
--echo # Should only have tablespace SDI
--let JSON_FILE_PATH = $DEST_DIR/t18_#p#p1#sp#p12.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t18_#P#p1#SP#p12.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t18_#p#p1#sp#p12.json $JSON_FILE_PATH
}
--replace_result $MYSQLD_DATADIR MYSQLD_DATADIR $LOG_FILE_SIZE LOG_FILE_SIZE
--source include/start_mysqld.inc
--echo # ALTER TABLE t1, ADD COLUMN. Verify SDI shows the newly added column
ALTER TABLE t1 ADD COLUMN b INT;
--echo # ALTER TABLE t2, ADD INDEX, Verify SDI shows the newly added index
ALTER TABLE t2 ADD INDEX k1(b(10));
--echo # ALTER TABLE t3, DROP INDEX, Verify SDI doesn't show dropped index
ALTER TABLE t3 DROP INDEX k2;
--echo # ALTER TABLE t4, DROP column, Verify SDI doesn't show dropped column
ALTER TABLE t4 DROP COLUMN d;
--echo # ALTER TABLE RENAME column
ALTER TABLE t10 CHANGE a pk INT;
--echo # Drop virtual column, verify SDI is updated
ALTER TABLE t11 DROP COLUMN m;
--echo # Create and drop tables in general tablespace
CREATE TABLE t19(a INT) TABLESPACE=`ts1`;
CREATE TABLE t20(a INT, b INT) TABLESPACE=`ts1`;
DROP TABLE t19;
DROP TABLE t20;
--source include/shutdown_mysqld.inc
--echo # ALTER TABLE t1, ADD COLUMN. Verify SDI shows the newly added column 'b'
--echo # Check SDI from t1.ibd
--let JSON_FILE_PATH = $DEST_DIR/t1_altered.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t1.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t1_altered.json $JSON_FILE_PATH
}
--echo # ALTER TABLE t2, ADD INDEX, Verify SDI shows the newly added index 'k1'
--echo # Check SDI from t2.ibd
--let JSON_FILE_PATH = $DEST_DIR/t2_altered.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t2.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t2_altered.json $JSON_FILE_PATH
}
--echo # ALTER TABLE t3, DROP INDEX, Verify SDI doesn't show dropped index 'k2'
--echo # Check SDI from t3.ibd
--let JSON_FILE_PATH = $DEST_DIR/t3_altered.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t3.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t3_altered.json $JSON_FILE_PATH
}
--echo # ALTER TABLE t4, DROP column, Verify SDI doesn't show dropped column 'd'
--echo # Check SDI from t4.ibd
--let JSON_FILE_PATH = $DEST_DIR/t4_altered.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t4.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t4_altered.json $JSON_FILE_PATH
}
--echo # ALTER TABLE t10 RENAME column from 'a' to 'pk'. Verify column name is 'pk'
--echo # Check SDI from t10.ibd
--let JSON_FILE_PATH = $DEST_DIR/t10_altered.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t10.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t10_altered.json $JSON_FILE_PATH
}
--echo # Drop virtual column of t11, verify SDI doesn't show clumn 'm'
--echo # Check SDI from t11.ibd
--let JSON_FILE_PATH = $DEST_DIR/t11_altered.json
--exec $IBD2SDI $MYSQLD_DATADIR/test/t11.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/t11_altered.json $JSON_FILE_PATH
}
--echo # Create and drop tables in general tablespace. Shouldn't show t19, t20
--let JSON_FILE_PATH = $DEST_DIR/ts1_altered.json
--exec $IBD2SDI $MYSQLD_DATADIR/ts1.ibd -d $JSON_FILE_PATH 2>&1
--source ../include/ibd2sdi_replace.inc
if ($MTR_RECORD == 0) {
--diff_files $SRC_DIR/ts1_altered.json $JSON_FILE_PATH
}
# If --record is used, save the json files created in the $DEST_DIR
# back to the $SRC_DIR.
if ($MTR_RECORD == 1) {
--copy_files_wildcard $DEST_DIR $SRC_DIR *.json
}
--echo # Remove json and other test files
--force-rmdir $DEST_DIR
--force-rmdir $MYSQLD_DATADIR
--remove_file $BOOTSTRAP_SQL
--remove_file $MYSQLTEST_VARDIR/tmp/bootstrap.log
--let $restart_parameters=
--source include/start_mysqld.inc
--echo #
--echo # Bug#27151163 - INNODB: ASSERTION FAILURE: DICT0SDI.CC:.*
--echo #
--disable_query_log
call mtr.add_suppression("Operating system error number 2 in a file operation.");
call mtr.add_suppression("The error means the system cannot find the path specified.");
call mtr.add_suppression("Cannot open datafile for read-only:");
call mtr.add_suppression("Cannot calculate statistics for table .* because the \.ibd file is missing");
call mtr.add_suppression("Tablespace .*, name 'ts1', file 'ts1.ibd' is missing!");
call mtr.add_suppression("Cannot find tablespace for 'ts1' in the tablespace memory cache");
--enable_query_log
let $MYSQLD_DATADIR= `select @@datadir`;
CREATE TABLESPACE ts1 ADD DATAFILE 'ts1.ibd';
CREATE DATABASE sdi;
CREATE TABLE sdi.t1(i int) TABLESPACE ts1;
--echo # Shutdown the server
--source include/shutdown_mysqld.inc
--echo # Remove ts1.ibd file
--remove_file $MYSQLD_DATADIR/ts1.ibd
--source include/start_mysqld.inc
--error ER_TABLESPACE_MISSING
ALTER TABLE sdi.t1 ADD COLUMN j INT;
--error ER_TABLESPACE_MISSING
ALTER TABLE sdi.t1 RENAME COLUMN i to j;
--error ER_ALTER_FILEGROUP_FAILED
ALTER TABLESPACE ts1 RENAME to ts2;
SHOW WARNINGS;
DROP DATABASE sdi;
DROP TABLESPACE ts1;