Skip to content

Commit

Permalink
ddl: fix rename index for expression indexes (#51984) (#53737)
Browse files Browse the repository at this point in the history
close #51431
  • Loading branch information
ti-chi-bot authored Jun 5, 2024
1 parent 19731df commit 18c7f08
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 0 deletions.
9 changes: 9 additions & 0 deletions ddl/column.go
Original file line number Diff line number Diff line change
Expand Up @@ -1954,3 +1954,12 @@ func getChangingColumnOriginName(changingColumn *model.ColumnInfo) string {
}
return columnName[:pos]
}

func getExpressionIndexOriginName(expressionIdx *model.ColumnInfo) string {
columnName := strings.TrimPrefix(expressionIdx.Name.O, expressionIndexPrefix+"_")
var pos int
if pos = strings.LastIndex(columnName, "_"); pos == -1 {
return columnName
}
return columnName[:pos]
}
11 changes: 11 additions & 0 deletions ddl/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,8 @@ func onRenameIndex(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error)
}

renameIndexes(tblInfo, from, to)
renameHiddenColumns(tblInfo, from, to)

if ver, err = updateVersionAndTableInfo(d, t, job, tblInfo, true); err != nil {
job.State = model.JobStateCancelled
return ver, errors.Trace(err)
Expand Down Expand Up @@ -2024,3 +2026,12 @@ func renameIndexes(tblInfo *model.TableInfo, from, to model.CIStr) {
}
}
}

func renameHiddenColumns(tblInfo *model.TableInfo, from, to model.CIStr) {
for _, col := range tblInfo.Columns {
if col.Hidden && getExpressionIndexOriginName(col) == from.O {
col.Name.L = strings.Replace(col.Name.L, from.L, to.L, 1)
col.Name.O = strings.Replace(col.Name.O, from.O, to.O, 1)
}
}
}
27 changes: 27 additions & 0 deletions tests/integrationtest/r/ddl/db_rename.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
drop table if exists t;
create table t (pk int primary key, c int default 1, c1 int default 1, unique key k1(c), key k2(c1));
alter table t rename index k1 to k3;
admin check index t k3;
alter table t rename index k3 to k3;
admin check index t k3;
alter table t rename index x to x;
Error 1176 (42000): Key 'x' doesn't exist in table 't'
alter table t rename index k3 to k2;
Error 1061 (42000): Duplicate key name 'k2'
alter table t rename index k2 to K2;
alter table t rename key k3 to K2;
Error 1061 (42000): Duplicate key name 'K2'
drop table t;
create table t(j json);
alter table t add index idx1((cast(j as char(10) array)));
alter table t rename index idx1 to idx2;
alter table t add index idx1((cast(j as char(10) array)));
insert into t values ('["1"]');
alter table t add index IDX3((cast(j as char(10) array)));
alter table t rename index IDX3 to IDX4;
alter table t add index IDX3((cast(j as char(10) array)));
insert into t values ('["2"]');
select * from t;
j
["1"]
["2"]
27 changes: 27 additions & 0 deletions tests/integrationtest/t/ddl/db_rename.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# TestRenameIndex
drop table if exists t;
create table t (pk int primary key, c int default 1, c1 int default 1, unique key k1(c), key k2(c1));
alter table t rename index k1 to k3;
admin check index t k3;
alter table t rename index k3 to k3;
admin check index t k3;
-- error 1176
alter table t rename index x to x;
-- error 1061
alter table t rename index k3 to k2;
alter table t rename index k2 to K2;
-- error 1061
alter table t rename key k3 to K2;

# TestIssue51431
drop table t;
create table t(j json);
alter table t add index idx1((cast(j as char(10) array)));
alter table t rename index idx1 to idx2;
alter table t add index idx1((cast(j as char(10) array)));
insert into t values ('["1"]');
alter table t add index IDX3((cast(j as char(10) array)));
alter table t rename index IDX3 to IDX4;
alter table t add index IDX3((cast(j as char(10) array)));
insert into t values ('["2"]');
select * from t;

0 comments on commit 18c7f08

Please sign in to comment.