diff --git a/ddl/column.go b/ddl/column.go index 7cef23ac56ffc..0db1d8188eb68 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -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] +} diff --git a/ddl/index.go b/ddl/index.go index d085a658fd4a8..ea3146c1c5f1d 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -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) @@ -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) + } + } +} diff --git a/tests/integrationtest/r/ddl/db_rename.result b/tests/integrationtest/r/ddl/db_rename.result new file mode 100644 index 0000000000000..8b47d3aff357e --- /dev/null +++ b/tests/integrationtest/r/ddl/db_rename.result @@ -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"] diff --git a/tests/integrationtest/t/ddl/db_rename.test b/tests/integrationtest/t/ddl/db_rename.test new file mode 100644 index 0000000000000..05f3814f24e61 --- /dev/null +++ b/tests/integrationtest/t/ddl/db_rename.test @@ -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;