You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

709 lines
25 KiB

MDEV-13838: Wrong result after altering a partitioned table Reverted incorrect changes done on MDEV-7367 and MDEV-9469. Fixes properly also related bugs: MDEV-13668: InnoDB unnecessarily rebuilds table when renaming a column and adding index MDEV-9469: 'Incorrect key file' on ALTER TABLE MDEV-9548: Alter table (renaming and adding index) fails with "Incorrect key file for table" MDEV-10535: ALTER TABLE causes standalone/wsrep cluster crash MDEV-13640: ALTER TABLE CHANGE and ADD INDEX on auto_increment column fails with "Incorrect key file for table..." Root cause for all these bugs is the fact that MariaDB .frm file can contain virtual columns but InnoDB dictionary does not and previous fixes were incorrect or unnecessarily forced table rebuilt. In index creation key_part->fieldnr can be bigger than number of columns in InnoDB data dictionary. We need to skip not stored fields when calculating correct column number for InnoDB data dictionary. dict_table_get_col_name_for_mysql Remove innobase_match_index_columns Revert incorrect change done on MDEV-7367 innobase_need_rebuild Remove unnecessary rebuild force when column is renamed. innobase_create_index_field_def Calculate InnoDB column number correctly and remove unnecessary column name set. innobase_create_index_def, innobase_create_key_defs Remove unneeded fields parameter. Revert unneeded memset. prepare_inplace_alter_table_dict Remove unneeded col_names parameter index_field_t Remove unneeded col_name member. row_merge_create_index Remove unneeded col_names parameter and resolution. Effected tests: innodb-alter-table : Add test case for MDEV-13668 innodb-alter : Remove MDEV-13668, MDEV-9469 FIXMEs and restore original tests innodb-wl5980-alter : Remove MDEV-13668, MDEV-9469 FIXMEs and restore original tests
8 years ago
  1. --echo #
  2. --echo # This is a copy of innodb-alter.test except using remote tablespaces
  3. --echo # and showing those files.
  4. --echo #
  5. --source include/have_innodb.inc
  6. SET @innodb_file_per_table_orig=@@GLOBAL.innodb_file_per_table;
  7. LET $regexp=/FTS_[0-9a-f_]+([A-Z0-9_]+)\.([islbd]{3})/FTS_AUX_\1.\2/ /#sql-ib[1-9][0-9]*\.ibd\n//;
  8. # Set up some variables
  9. LET $MYSQL_DATA_DIR = `select @@datadir`;
  10. LET $data_directory_clause = DATA DIRECTORY='$MYSQL_TMP_DIR/alt_dir';
  11. SET default_storage_engine=InnoDB;
  12. SET GLOBAL innodb_file_per_table=ON;
  13. SET NAMES utf8mb4;
  14. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  15. eval CREATE TABLE t1 (
  16. c1 INT PRIMARY KEY, c2 INT DEFAULT 1, ct TEXT,
  17. INDEX(c2))
  18. ENGINE=InnoDB $data_directory_clause;
  19. INSERT INTO t1 SET c1=1;
  20. CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
  21. WHERE NAME LIKE 'test/t%';
  22. CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i
  23. INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID;
  24. CREATE TABLE t1p LIKE t1;
  25. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  26. eval CREATE TABLE t1c (c1 INT PRIMARY KEY, c2 INT, c3 INT, INDEX(c2), INDEX(c3),
  27. CONSTRAINT t1c2 FOREIGN KEY (c2) REFERENCES t1(c2),
  28. CONSTRAINT t1c3 FOREIGN KEY (c3) REFERENCES t1p(c2))
  29. ENGINE=InnoDB $data_directory_clause;
  30. CREATE TABLE sys_foreign SELECT i.*
  31. FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i
  32. WHERE FOR_NAME LIKE 'test/t%';
  33. SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i
  34. INNER JOIN sys_foreign sf ON i.ID = sf.ID;
  35. -- source suite/innodb/include/innodb_dict.inc
  36. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  37. SHOW CREATE TABLE t1;
  38. ALTER TABLE t1 ALTER c2 DROP DEFAULT;
  39. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  40. SHOW CREATE TABLE t1;
  41. --echo ### files in MYSQL_DATA_DIR/test
  42. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  43. --replace_regex $regexp
  44. --cat_file $MYSQL_DATA_DIR.files.txt
  45. --remove_file $MYSQL_DATA_DIR.files.txt
  46. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  47. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  48. --replace_regex $regexp
  49. --cat_file $MYSQL_DATA_DIR.files.txt
  50. --remove_file $MYSQL_DATA_DIR.files.txt
  51. -- source suite/innodb/include/innodb_dict.inc
  52. # These should be no-op.
  53. ALTER TABLE t1 CHANGE c2 c2 INT AFTER c1;
  54. ALTER TABLE t1 CHANGE c1 c1 INT FIRST;
  55. --echo ### files in MYSQL_DATA_DIR/test
  56. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  57. --replace_regex $regexp
  58. --cat_file $MYSQL_DATA_DIR.files.txt
  59. --remove_file $MYSQL_DATA_DIR.files.txt
  60. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  61. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  62. --replace_regex $regexp
  63. --cat_file $MYSQL_DATA_DIR.files.txt
  64. --remove_file $MYSQL_DATA_DIR.files.txt
  65. -- source suite/innodb/include/innodb_dict.inc
  66. ALTER TABLE t1 CHANGE C2 c3 INT;
  67. --echo ### files in MYSQL_DATA_DIR/test
  68. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  69. --replace_regex $regexp
  70. --cat_file $MYSQL_DATA_DIR.files.txt
  71. --remove_file $MYSQL_DATA_DIR.files.txt
  72. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  73. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  74. --replace_regex $regexp
  75. --cat_file $MYSQL_DATA_DIR.files.txt
  76. --remove_file $MYSQL_DATA_DIR.files.txt
  77. -- source suite/innodb/include/innodb_dict.inc
  78. ALTER TABLE t1 CHANGE c3 C INT;
  79. --echo ### files in MYSQL_DATA_DIR/test
  80. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  81. --replace_regex $regexp
  82. --cat_file $MYSQL_DATA_DIR.files.txt
  83. --remove_file $MYSQL_DATA_DIR.files.txt
  84. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  85. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  86. --replace_regex $regexp
  87. --cat_file $MYSQL_DATA_DIR.files.txt
  88. --remove_file $MYSQL_DATA_DIR.files.txt
  89. -- source suite/innodb/include/innodb_dict.inc
  90. ALTER TABLE t1 CHANGE C Cöŀumň_TWO INT;
  91. --echo ### files in MYSQL_DATA_DIR/test
  92. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  93. --replace_regex $regexp
  94. --cat_file $MYSQL_DATA_DIR.files.txt
  95. --remove_file $MYSQL_DATA_DIR.files.txt
  96. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  97. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  98. --replace_regex $regexp
  99. --cat_file $MYSQL_DATA_DIR.files.txt
  100. --remove_file $MYSQL_DATA_DIR.files.txt
  101. SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN_COLS i
  102. INNER JOIN sys_foreign sf ON i.ID = sf.ID;
  103. -- source suite/innodb/include/innodb_dict.inc
  104. -- error ER_BAD_FIELD_ERROR
  105. ALTER TABLE t1 CHANGE cöĿǖmň_two c3 INT;
  106. ALTER TABLE t1 CHANGE cÖĿUMŇ_two c3 INT, RENAME TO t3;
  107. --echo ### files in MYSQL_DATA_DIR/test
  108. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  109. --replace_regex $regexp
  110. --cat_file $MYSQL_DATA_DIR.files.txt
  111. --remove_file $MYSQL_DATA_DIR.files.txt
  112. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  113. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  114. --replace_regex $regexp
  115. --cat_file $MYSQL_DATA_DIR.files.txt
  116. --remove_file $MYSQL_DATA_DIR.files.txt
  117. SELECT st.NAME, i.NAME
  118. FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i
  119. ON i.TABLE_ID=st.TABLE_ID;
  120. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  121. SHOW CREATE TABLE t3;
  122. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  123. SHOW CREATE TABLE t1c;
  124. # The maximum column name length should be 64 characters.
  125. --error ER_TOO_LONG_IDENT
  126. ALTER TABLE t3 CHANGE c3
  127. `12345678901234567890123456789012345678901234567890123456789012345` INT;
  128. ALTER TABLE t3 CHANGE c3
  129. `1234567890123456789012345678901234567890123456789012345678901234` INT;
  130. --echo ### files in MYSQL_DATA_DIR/test
  131. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  132. --replace_regex $regexp
  133. --cat_file $MYSQL_DATA_DIR.files.txt
  134. --remove_file $MYSQL_DATA_DIR.files.txt
  135. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  136. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  137. --replace_regex $regexp
  138. --cat_file $MYSQL_DATA_DIR.files.txt
  139. --remove_file $MYSQL_DATA_DIR.files.txt
  140. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  141. SHOW CREATE TABLE t3;
  142. # Test the length limit with non-ASCII utf-8 characters.
  143. --error ER_TOO_LONG_IDENT
  144. ALTER TABLE t3 CHANGE
  145. `1234567890123456789012345678901234567890123456789012345678901234`
  146. `倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候倚倛倜倝倞借倠倡倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾倿偀` INT;
  147. --error ER_TOO_LONG_IDENT
  148. ALTER TABLE t3 CHANGE
  149. `1234567890123456789012345678901234567890123456789012345678901234`
  150. `倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候倚倛倜倝倞借倠倡倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾倿ä` INT;
  151. ALTER TABLE t3 CHANGE
  152. `1234567890123456789012345678901234567890123456789012345678901234`
  153. `倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候倚倛倜倝倞借倠倡倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾ä` INT;
  154. --echo ### files in MYSQL_DATA_DIR/test
  155. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  156. --replace_regex $regexp
  157. --cat_file $MYSQL_DATA_DIR.files.txt
  158. --remove_file $MYSQL_DATA_DIR.files.txt
  159. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  160. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  161. --replace_regex $regexp
  162. --cat_file $MYSQL_DATA_DIR.files.txt
  163. --remove_file $MYSQL_DATA_DIR.files.txt
  164. # check that the rename is case-insensitive (note the upper-case ä at end)
  165. ALTER TABLE t3 CHANGE
  166. `倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候倚倛倜倝倞借倠倡倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾Ä`
  167. c3 INT;
  168. --echo ### files in MYSQL_DATA_DIR/test
  169. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  170. --replace_regex $regexp
  171. --cat_file $MYSQL_DATA_DIR.files.txt
  172. --remove_file $MYSQL_DATA_DIR.files.txt
  173. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  174. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  175. --replace_regex $regexp
  176. --cat_file $MYSQL_DATA_DIR.files.txt
  177. --remove_file $MYSQL_DATA_DIR.files.txt
  178. # test with 4-byte UTF-8 (should be disallowed)
  179. --error ER_INVALID_CHARACTER_STRING
  180. ALTER TABLE t3 CHANGE c3 𐌀𐌁𐌂𐌃𐌄𐌅𐌆𐌇𐌈𐌉𐌊𐌋𐌌𐌍𐌎𐌏𐌐𐌑𐌒𐌓𐌔𐌕𐌖𐌗𐌘𐌙𐌚𐌛𐌜 INT;
  181. --error ER_INVALID_CHARACTER_STRING
  182. ALTER TABLE t3 CHANGE c3 😲 INT;
  183. ALTER TABLE t3 RENAME TO t2;
  184. --echo ### files in MYSQL_DATA_DIR/test
  185. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  186. --replace_regex $regexp
  187. --cat_file $MYSQL_DATA_DIR.files.txt
  188. --remove_file $MYSQL_DATA_DIR.files.txt
  189. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  190. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  191. --replace_regex $regexp
  192. --cat_file $MYSQL_DATA_DIR.files.txt
  193. --remove_file $MYSQL_DATA_DIR.files.txt
  194. SELECT st.NAME, i.NAME
  195. FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i
  196. ON i.TABLE_ID=st.TABLE_ID;
  197. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  198. SHOW CREATE TABLE t2;
  199. RENAME TABLE t2 TO t1;
  200. SELECT st.NAME, i.NAME
  201. FROM sys_tables st INNER JOIN INFORMATION_SCHEMA.INNODB_SYS_TABLES i
  202. ON i.TABLE_ID=st.TABLE_ID;
  203. --echo ### files in MYSQL_DATA_DIR/test
  204. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  205. --replace_regex $regexp
  206. --cat_file $MYSQL_DATA_DIR.files.txt
  207. --remove_file $MYSQL_DATA_DIR.files.txt
  208. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  209. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  210. --replace_regex $regexp
  211. --cat_file $MYSQL_DATA_DIR.files.txt
  212. --remove_file $MYSQL_DATA_DIR.files.txt
  213. -- source suite/innodb/include/innodb_dict.inc
  214. --error ER_DROP_INDEX_FK
  215. ALTER TABLE t1 DROP INDEX c2;
  216. --error ER_CANT_DROP_FIELD_OR_KEY
  217. ALTER TABLE t1 DROP INDEX c4;
  218. --error ER_CANT_DROP_FIELD_OR_KEY
  219. ALTER TABLE t1c DROP FOREIGN KEY c2;
  220. --error ER_CANT_DROP_FIELD_OR_KEY
  221. ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2;
  222. --error ER_CANT_DROP_FIELD_OR_KEY
  223. ALTER TABLE t1c DROP FOREIGN KEY t1c2, DROP FOREIGN KEY c2, DROP INDEX c2;
  224. --error ER_DROP_INDEX_FK
  225. ALTER TABLE t1c DROP INDEX c2;
  226. --error ER_CANT_DROP_FIELD_OR_KEY
  227. ALTER TABLE t1c DROP FOREIGN KEY ẗ1C2;
  228. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  229. SHOW CREATE TABLE t1c;
  230. SET foreign_key_checks=0;
  231. DROP TABLE t1p;
  232. SET foreign_key_checks=1;
  233. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  234. SHOW CREATE TABLE t1c;
  235. --echo ### files in MYSQL_DATA_DIR/test
  236. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  237. --replace_regex $regexp
  238. --cat_file $MYSQL_DATA_DIR.files.txt
  239. --remove_file $MYSQL_DATA_DIR.files.txt
  240. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  241. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  242. --replace_regex $regexp
  243. --cat_file $MYSQL_DATA_DIR.files.txt
  244. --remove_file $MYSQL_DATA_DIR.files.txt
  245. -- source suite/innodb/include/innodb_dict.inc
  246. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  247. eval CREATE TABLE t1p (c1 INT PRIMARY KEY, c2 INT, INDEX(c2))
  248. ENGINE=InnoDB $data_directory_clause;
  249. --error ER_DROP_INDEX_FK
  250. ALTER TABLE t1c DROP INDEX C2, DROP INDEX C3;
  251. --error ER_DROP_INDEX_FK
  252. ALTER TABLE t1c DROP INDEX C3;
  253. SET foreign_key_checks=0;
  254. ALTER TABLE t1c DROP INDEX C3;
  255. --echo ### files in MYSQL_DATA_DIR/test
  256. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  257. --replace_regex $regexp
  258. --cat_file $MYSQL_DATA_DIR.files.txt
  259. --remove_file $MYSQL_DATA_DIR.files.txt
  260. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  261. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  262. --replace_regex $regexp
  263. --cat_file $MYSQL_DATA_DIR.files.txt
  264. --remove_file $MYSQL_DATA_DIR.files.txt
  265. SET foreign_key_checks=1;
  266. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  267. SHOW CREATE TABLE t1c;
  268. -- source suite/innodb/include/innodb_dict.inc
  269. ALTER TABLE t1c DROP FOREIGN KEY t1C3;
  270. --echo ### files in MYSQL_DATA_DIR/test
  271. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  272. --replace_regex $regexp
  273. --cat_file $MYSQL_DATA_DIR.files.txt
  274. --remove_file $MYSQL_DATA_DIR.files.txt
  275. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  276. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  277. --replace_regex $regexp
  278. --cat_file $MYSQL_DATA_DIR.files.txt
  279. --remove_file $MYSQL_DATA_DIR.files.txt
  280. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  281. SHOW CREATE TABLE t1c;
  282. -- source suite/innodb/include/innodb_dict.inc
  283. ALTER TABLE t1c DROP INDEX c2, DROP FOREIGN KEY t1C2;
  284. --echo ### files in MYSQL_DATA_DIR/test
  285. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  286. --replace_regex $regexp
  287. --cat_file $MYSQL_DATA_DIR.files.txt
  288. --remove_file $MYSQL_DATA_DIR.files.txt
  289. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  290. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  291. --replace_regex $regexp
  292. --cat_file $MYSQL_DATA_DIR.files.txt
  293. --remove_file $MYSQL_DATA_DIR.files.txt
  294. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  295. SHOW CREATE TABLE t1c;
  296. -- source suite/innodb/include/innodb_dict.inc
  297. ALTER TABLE t1 DROP INDEX c2, CHANGE c3 c2 INT;
  298. --echo ### files in MYSQL_DATA_DIR/test
  299. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  300. --replace_regex $regexp
  301. --cat_file $MYSQL_DATA_DIR.files.txt
  302. --remove_file $MYSQL_DATA_DIR.files.txt
  303. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  304. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  305. --replace_regex $regexp
  306. --cat_file $MYSQL_DATA_DIR.files.txt
  307. --remove_file $MYSQL_DATA_DIR.files.txt
  308. -- source suite/innodb/include/innodb_dict.inc
  309. CREATE TABLE t1o LIKE t1;
  310. # This will implicitly add a DOC_ID column.
  311. # The LOCK=NONE should thus fail.
  312. --error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
  313. ALTER TABLE t1 ADD FULLTEXT INDEX (ct),
  314. CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt,
  315. ALGORITHM=INPLACE, LOCK=NONE;
  316. # Retry with LOCK=EXCLUSIVE.
  317. ALTER TABLE t1 ADD FULLTEXT INDEX (ct),
  318. CHANGE c1 pk INT, ALTER c2 SET DEFAULT 42, RENAME TO tt,
  319. ALGORITHM=INPLACE, LOCK=SHARED;
  320. --echo ### files in MYSQL_DATA_DIR/test
  321. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  322. --replace_regex $regexp
  323. --cat_file $MYSQL_DATA_DIR.files.txt
  324. --remove_file $MYSQL_DATA_DIR.files.txt
  325. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  326. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  327. --replace_regex $regexp
  328. --cat_file $MYSQL_DATA_DIR.files.txt
  329. --remove_file $MYSQL_DATA_DIR.files.txt
  330. # The output should be empty, because index->id was reassigned.
  331. -- source suite/innodb/include/innodb_dict.inc
  332. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  333. SHOW CREATE TABLE tt;
  334. # DB_ROW_ID, DB_TRX_ID, DB_ROLL_PTR are reserved InnoDB system column names.
  335. --error ER_WRONG_COLUMN_NAME
  336. ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=COPY;
  337. --error ER_WRONG_COLUMN_NAME
  338. ALTER TABLE t1o CHANGE c1 dB_row_Id INT, ALGORITHM=INPLACE;
  339. --error ER_WRONG_COLUMN_NAME
  340. ALTER TABLE t1o CHANGE c1 DB_TRX_ID INT;
  341. --error ER_WRONG_COLUMN_NAME
  342. ALTER TABLE t1o CHANGE c1 db_roll_ptr INT;
  343. # FTS_DOC_ID is the internal row identifier for full-text search.
  344. # It should be of type BIGINT UNSIGNED NOT NULL.
  345. --error ER_WRONG_COLUMN_NAME
  346. ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT,
  347. ALGORITHM=COPY;
  348. --error ER_INNODB_FT_WRONG_DOCID_COLUMN
  349. ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_DOC_ID INT,
  350. ALGORITHM=INPLACE;
  351. --error ER_WRONG_COLUMN_NAME
  352. ALTER TABLE t1o ADD FULLTEXT INDEX(ct), CHANGE c1 FTS_Doc_ID INT,
  353. ALGORITHM=INPLACE;
  354. --error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
  355. ALTER TABLE t1o ADD FULLTEXT INDEX(ct),
  356. CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
  357. ALGORITHM=INPLACE;
  358. CREATE TABLE t1n LIKE t1o;
  359. ALTER TABLE t1n ADD FULLTEXT INDEX(ct);
  360. --echo ### files in MYSQL_DATA_DIR/test
  361. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  362. --replace_regex $regexp
  363. --cat_file $MYSQL_DATA_DIR.files.txt
  364. --remove_file $MYSQL_DATA_DIR.files.txt
  365. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  366. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  367. --replace_regex $regexp
  368. --cat_file $MYSQL_DATA_DIR.files.txt
  369. --remove_file $MYSQL_DATA_DIR.files.txt
  370. --error ER_WRONG_COLUMN_NAME
  371. ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=INPLACE;
  372. --error ER_WRONG_COLUMN_NAME
  373. ALTER TABLE t1n CHANGE c1 Fts_DOC_ID INT, ALGORITHM=COPY;
  374. --error ER_BAD_FIELD_ERROR
  375. ALTER TABLE t1n CHANGE FTS_DOC_ID c11 INT, ALGORITHM=INPLACE;
  376. ALTER TABLE t1n CHANGE c1 FTS_DOC_ïD INT, ALGORITHM=INPLACE;
  377. --echo ### files in MYSQL_DATA_DIR/test
  378. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  379. --replace_regex $regexp
  380. --cat_file $MYSQL_DATA_DIR.files.txt
  381. --remove_file $MYSQL_DATA_DIR.files.txt
  382. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  383. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  384. --replace_regex $regexp
  385. --cat_file $MYSQL_DATA_DIR.files.txt
  386. --remove_file $MYSQL_DATA_DIR.files.txt
  387. ALTER TABLE t1n CHANGE FTS_DOC_ÏD c1 INT, ALGORITHM=INPLACE;
  388. --echo ### files in MYSQL_DATA_DIR/test
  389. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  390. --replace_regex $regexp
  391. --cat_file $MYSQL_DATA_DIR.files.txt
  392. --remove_file $MYSQL_DATA_DIR.files.txt
  393. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  394. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  395. --replace_regex $regexp
  396. --cat_file $MYSQL_DATA_DIR.files.txt
  397. --remove_file $MYSQL_DATA_DIR.files.txt
  398. ALTER TABLE t1n CHANGE c1 c2 INT, CHANGE c2 ct INT, CHANGE ct c1 TEXT,
  399. ALGORITHM=INPLACE;
  400. --echo ### files in MYSQL_DATA_DIR/test
  401. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  402. --replace_regex $regexp
  403. --cat_file $MYSQL_DATA_DIR.files.txt
  404. --remove_file $MYSQL_DATA_DIR.files.txt
  405. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  406. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  407. --replace_regex $regexp
  408. --cat_file $MYSQL_DATA_DIR.files.txt
  409. --remove_file $MYSQL_DATA_DIR.files.txt
  410. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  411. SHOW CREATE TABLE t1n;
  412. ALTER TABLE t1n CHANGE c2 c1 INT, CHANGE ct c2 INT, CHANGE c1 ct TEXT,
  413. ALGORITHM=COPY;
  414. --echo ### files in MYSQL_DATA_DIR/test
  415. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  416. --replace_regex $regexp
  417. --cat_file $MYSQL_DATA_DIR.files.txt
  418. --remove_file $MYSQL_DATA_DIR.files.txt
  419. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  420. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  421. --replace_regex $regexp
  422. --cat_file $MYSQL_DATA_DIR.files.txt
  423. --remove_file $MYSQL_DATA_DIR.files.txt
  424. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  425. SHOW CREATE TABLE t1n;
  426. --error ER_KEY_COLUMN_DOES_NOT_EXITS
  427. ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=INPLACE;
  428. --error ER_KEY_COLUMN_DOES_NOT_EXITS
  429. ALTER TABLE t1n ADD INDEX(c2), CHANGE c2 c4 INT, ALGORITHM=COPY;
  430. ALTER TABLE t1n ADD INDEX(c4), CHANGE c2 c4 INT, ALGORITHM=INPLACE;
  431. --echo ### files in MYSQL_DATA_DIR/test
  432. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  433. --replace_regex $regexp
  434. --cat_file $MYSQL_DATA_DIR.files.txt
  435. --remove_file $MYSQL_DATA_DIR.files.txt
  436. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  437. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  438. --replace_regex $regexp
  439. --cat_file $MYSQL_DATA_DIR.files.txt
  440. --remove_file $MYSQL_DATA_DIR.files.txt
  441. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  442. SHOW CREATE TABLE t1n;
  443. ALTER TABLE t1n DROP INDEX c4;
  444. --echo ### files in MYSQL_DATA_DIR/test
  445. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  446. --replace_regex $regexp
  447. --cat_file $MYSQL_DATA_DIR.files.txt
  448. --remove_file $MYSQL_DATA_DIR.files.txt
  449. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  450. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  451. --replace_regex $regexp
  452. --cat_file $MYSQL_DATA_DIR.files.txt
  453. --remove_file $MYSQL_DATA_DIR.files.txt
  454. --error ER_DUP_FIELDNAME
  455. ALTER TABLE t1n CHANGE c4 c1 INT, ADD INDEX(c1), ALGORITHM=INPLACE;
  456. ALTER TABLE t1n CHANGE c4 c11 INT, ADD INDEX(c11), ALGORITHM=INPLACE;
  457. --echo ### files in MYSQL_DATA_DIR/test
  458. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  459. --replace_regex $regexp
  460. --cat_file $MYSQL_DATA_DIR.files.txt
  461. --remove_file $MYSQL_DATA_DIR.files.txt
  462. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  463. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  464. --replace_regex $regexp
  465. --cat_file $MYSQL_DATA_DIR.files.txt
  466. --remove_file $MYSQL_DATA_DIR.files.txt
  467. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  468. SHOW CREATE TABLE t1n;
  469. DROP TABLE t1n;
  470. ALTER TABLE t1o MODIFY c1 BIGINT UNSIGNED NOT NULL;
  471. --echo ### files in MYSQL_DATA_DIR/test
  472. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  473. --replace_regex $regexp
  474. --cat_file $MYSQL_DATA_DIR.files.txt
  475. --remove_file $MYSQL_DATA_DIR.files.txt
  476. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  477. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  478. --replace_regex $regexp
  479. --cat_file $MYSQL_DATA_DIR.files.txt
  480. --remove_file $MYSQL_DATA_DIR.files.txt
  481. ALTER TABLE t1o ADD FULLTEXT INDEX(ct),
  482. CHANGE c1 FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
  483. ALGORITHM=INPLACE;
  484. --echo ### files in MYSQL_DATA_DIR/test
  485. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  486. --replace_regex $regexp
  487. --cat_file $MYSQL_DATA_DIR.files.txt
  488. --remove_file $MYSQL_DATA_DIR.files.txt
  489. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  490. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  491. --replace_regex $regexp
  492. --cat_file $MYSQL_DATA_DIR.files.txt
  493. --remove_file $MYSQL_DATA_DIR.files.txt
  494. # This would create a hidden FTS_DOC_ID column, which cannot be done online.
  495. --error ER_ALTER_OPERATION_NOT_SUPPORTED_REASON
  496. ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL,
  497. LOCK=NONE;
  498. # This should not show duplicates.
  499. SELECT sc.pos FROM information_schema.innodb_sys_columns sc
  500. INNER JOIN information_schema.innodb_sys_tables st
  501. ON sc.TABLE_ID=st.TABLE_ID
  502. WHERE st.NAME='test/t1o' AND sc.NAME='FTS_DOC_ID';
  503. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  504. SHOW CREATE TABLE t1o;
  505. ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL,
  506. DROP INDEX ct, LOCK=NONE;
  507. --echo ### files in MYSQL_DATA_DIR/test
  508. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  509. --replace_regex $regexp
  510. --cat_file $MYSQL_DATA_DIR.files.txt
  511. --remove_file $MYSQL_DATA_DIR.files.txt
  512. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  513. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  514. --replace_regex $regexp
  515. --cat_file $MYSQL_DATA_DIR.files.txt
  516. --remove_file $MYSQL_DATA_DIR.files.txt
  517. --replace_result $MYSQL_TMP_DIR MYSQL_TMP_DIR
  518. SHOW CREATE TABLE t1o;
  519. DROP TABLE t1c, t1p, sys_tables, sys_indexes, sys_foreign;
  520. # Check the internal schemata of tt, t1o.
  521. CREATE TABLE sys_tables SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
  522. WHERE NAME='test/t1o';
  523. CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i
  524. INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID;
  525. CREATE TABLE sys_foreign SELECT i.*
  526. FROM INFORMATION_SCHEMA.INNODB_SYS_FOREIGN i WHERE FOR_NAME='test/t1o';
  527. -- source suite/innodb/include/innodb_dict.inc
  528. # Ensure that there exists no hidden FTS_DOC_ID_INDEX on foo_id.
  529. ALTER TABLE t1o ADD UNIQUE INDEX FTS_DOC_ID_INDEX(foo_id);
  530. --echo ### files in MYSQL_DATA_DIR/test
  531. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  532. --replace_regex $regexp
  533. --cat_file $MYSQL_DATA_DIR.files.txt
  534. --remove_file $MYSQL_DATA_DIR.files.txt
  535. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  536. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  537. --replace_regex $regexp
  538. --cat_file $MYSQL_DATA_DIR.files.txt
  539. --remove_file $MYSQL_DATA_DIR.files.txt
  540. ALTER TABLE t1o CHANGE foo_id FTS_DOC_ID BIGINT UNSIGNED NOT NULL,
  541. ADD FULLTEXT INDEX(ct);
  542. --echo ### files in MYSQL_DATA_DIR/test
  543. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  544. --replace_regex $regexp
  545. --cat_file $MYSQL_DATA_DIR.files.txt
  546. --remove_file $MYSQL_DATA_DIR.files.txt
  547. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  548. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_TMP_DIR/alt_dir/test
  549. --replace_regex $regexp
  550. --cat_file $MYSQL_DATA_DIR.files.txt
  551. --remove_file $MYSQL_DATA_DIR.files.txt
  552. --error ER_INNODB_FT_WRONG_DOCID_INDEX
  553. ALTER TABLE t1o CHANGE FTS_DOC_ID foo_id BIGINT UNSIGNED NOT NULL;
  554. DROP TABLE sys_indexes;
  555. CREATE TABLE sys_indexes SELECT i.* FROM INFORMATION_SCHEMA.INNODB_SYS_INDEXES i
  556. INNER JOIN sys_tables st ON i.TABLE_ID=st.TABLE_ID;
  557. -- source suite/innodb/include/innodb_dict.inc
  558. --echo #
  559. --echo # Cleanup
  560. --echo #
  561. DROP TABLE tt, t1o, sys_tables, sys_indexes, sys_foreign;
  562. --echo ### files in MYSQL_DATA_DIR/test
  563. --list_files_write_file $MYSQL_DATA_DIR.files.txt $MYSQL_DATA_DIR/test
  564. --replace_regex $regexp
  565. --cat_file $MYSQL_DATA_DIR.files.txt
  566. --remove_file $MYSQL_DATA_DIR.files.txt
  567. --echo ### files in MYSQL_TMP_DIR/alt_dir/test
  568. --replace_regex $regexp
  569. --list_files $MYSQL_TMP_DIR/alt_dir/test
  570. --rmdir $MYSQL_TMP_DIR/alt_dir/test
  571. --rmdir $MYSQL_TMP_DIR/alt_dir
  572. SET GLOBAL innodb_file_per_table = @innodb_file_per_table_orig;