115 lines
3.7 KiB
Diff
115 lines
3.7 KiB
Diff
|
Patch for https://bugzilla.redhat.com/show_bug.cgi?id=1686818
|
||
|
Picked from https://github.com/MariaDB/server/commit/802ce9672f
|
||
|
|
||
|
Fixed by rebase to 10.3.12
|
||
|
|
||
|
--- mariadb-10.3.11/storage/innobase/handler/handler0alter.cc 2018-11-16 19:04:53.000000000 +0100
|
||
|
+++ mariadb-10.3.11/storage/innobase/handler/handler0alter.cc_patched 2019-03-13 11:52:15.752268825 +0100
|
||
|
@@ -7712,36 +7712,40 @@ err_exit:
|
||
|
index != NULL;
|
||
|
index = dict_table_get_next_index(index)) {
|
||
|
|
||
|
+ bool has_prefixes = false;
|
||
|
+ for (size_t i = 0; i < dict_index_get_n_fields(index); i++) {
|
||
|
+ if (dict_index_get_nth_field(index, i)->prefix_len) {
|
||
|
+ has_prefixes = true;
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
for (ulint i = 0; i < dict_index_get_n_fields(index); i++) {
|
||
|
- if (my_strcasecmp(
|
||
|
- system_charset_info,
|
||
|
- dict_index_get_nth_field(index, i)->name,
|
||
|
- from)) {
|
||
|
+ const dict_field_t* field
|
||
|
+ = dict_index_get_nth_field(index, i);
|
||
|
+ if (my_strcasecmp(system_charset_info, field->name,
|
||
|
+ from)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
info = pars_info_create();
|
||
|
|
||
|
+ int pos = i;
|
||
|
+ if (has_prefixes) {
|
||
|
+ pos = (pos << 16) + field->prefix_len;
|
||
|
+ }
|
||
|
+
|
||
|
pars_info_add_ull_literal(info, "indexid", index->id);
|
||
|
- pars_info_add_int4_literal(info, "nth", i);
|
||
|
+ pars_info_add_int4_literal(info, "nth", pos);
|
||
|
pars_info_add_str_literal(info, "new", to);
|
||
|
|
||
|
error = que_eval_sql(
|
||
|
info,
|
||
|
"PROCEDURE RENAME_SYS_FIELDS_PROC () IS\n"
|
||
|
"BEGIN\n"
|
||
|
-
|
||
|
"UPDATE SYS_FIELDS SET COL_NAME=:new\n"
|
||
|
"WHERE INDEX_ID=:indexid\n"
|
||
|
"AND POS=:nth;\n"
|
||
|
-
|
||
|
- /* Try again, in case there is a prefix_len
|
||
|
- encoded in SYS_FIELDS.POS */
|
||
|
-
|
||
|
- "UPDATE SYS_FIELDS SET COL_NAME=:new\n"
|
||
|
- "WHERE INDEX_ID=:indexid\n"
|
||
|
- "AND POS>=65536*:nth AND POS<65536*(:nth+1);\n"
|
||
|
-
|
||
|
"END;\n",
|
||
|
FALSE, trx);
|
||
|
|
||
|
--- mariadb-10.3.11/mysql-test/suite/innodb/r/innodb-alter.result 2018-11-16 19:04:50.000000000 +0100
|
||
|
+++ mariadb-10.3.11/mysql-test/suite/innodb/r/innodb-alter.result_patched 2019-03-13 12:06:48.788107502 +0100
|
||
|
@@ -879,6 +879,27 @@ NAME
|
||
|
a
|
||
|
b
|
||
|
DROP TABLE t1;
|
||
|
+# and an MDEV-18041 regression related to indexes prefixes
|
||
|
+create table `test` (
|
||
|
+`test_old` varchar(255) NOT NULL,
|
||
|
+`other` varchar(255) NOT NULL,
|
||
|
+PRIMARY KEY (`test_old`,`other`),
|
||
|
+UNIQUE KEY uk (`test_old`(100), `other`)
|
||
|
+) ENGINE=InnoDB;
|
||
|
+select name, pos from information_schema.innodb_SYS_FIELDS where name in ('test_old', 'other', 'test_new');
|
||
|
+name pos
|
||
|
+test_old 0
|
||
|
+other 1
|
||
|
+test_old 0
|
||
|
+other 1
|
||
|
+alter table `test` CHANGE COLUMN `test_old` `test_new` varchar(255) NOT NULL;
|
||
|
+select name, pos from information_schema.innodb_SYS_FIELDS where name in ('test_old', 'other', 'test_new');
|
||
|
+name pos
|
||
|
+test_new 0
|
||
|
+other 1
|
||
|
+test_new 0
|
||
|
+other 1
|
||
|
+drop table `test`;
|
||
|
#
|
||
|
# BUG 20029625 - HANDLE_FATAL_SIGNAL (SIG=11) IN
|
||
|
# DICT_MEM_TABLE_COL_RENAME_LOW
|
||
|
--- mariadb-10.3.11/mysql-test/suite/innodb/t/innodb-alter.test 2018-11-16 19:04:50.000000000 +0100
|
||
|
+++ mariadb-10.3.11/mysql-test/suite/innodb/t/innodb-alter.test_patched 2019-03-13 12:08:36.398847184 +0100
|
||
|
@@ -545,6 +545,19 @@ SELECT C.NAME FROM INFORMATION_SCHEMA.IN
|
||
|
WHERE T.NAME='test/t1';
|
||
|
DROP TABLE t1;
|
||
|
|
||
|
+--echo # and an MDEV-18041 regression related to indexes prefixes
|
||
|
+create table `test` (
|
||
|
+ `test_old` varchar(255) NOT NULL,
|
||
|
+ `other` varchar(255) NOT NULL,
|
||
|
+ PRIMARY KEY (`test_old`,`other`),
|
||
|
+ UNIQUE KEY uk (`test_old`(100), `other`)
|
||
|
+) ENGINE=InnoDB;
|
||
|
+
|
||
|
+select name, pos from information_schema.innodb_SYS_FIELDS where name in ('test_old', 'other', 'test_new');
|
||
|
+alter table `test` CHANGE COLUMN `test_old` `test_new` varchar(255) NOT NULL;
|
||
|
+select name, pos from information_schema.innodb_SYS_FIELDS where name in ('test_old', 'other', 'test_new');
|
||
|
+drop table `test`;
|
||
|
+
|
||
|
|
||
|
--echo #
|
||
|
--echo # BUG 20029625 - HANDLE_FATAL_SIGNAL (SIG=11) IN
|