diff --git a/ddl/column_test.go b/ddl/column_test.go index bda786ae9508..11d2f47f8d1e 100644 --- a/ddl/column_test.go +++ b/ddl/column_test.go @@ -926,6 +926,8 @@ func (s *testColumnSuite) TestModifyColumn(c *C) { {"varchar(10)", "varchar(8)", errUnsupportedModifyColumn.GenByArgs("length 8 is less than origin 10")}, {"varchar(10)", "varchar(11)", nil}, {"varchar(10) character set utf8 collate utf8_bin", "varchar(10) character set utf8", nil}, + {"decimal(2,1)", "decimal(3,2)", errUnsupportedModifyColumn.Gen("unsupported modify decimal column precision")}, + {"decimal(2,1)", "decimal(2,1)", nil}, } for _, tt := range tests { ftA := s.colDefStrToFieldType(c, tt.origin) diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 03da00c331ca..6a8323c20fba 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -1328,6 +1328,10 @@ func (d *ddl) DropColumn(ctx sessionctx.Context, ti ast.Ident, colName model.CIS // It returns true if the two types has the same Charset and Collation, the same sign, both are // integer types or string types, and new Flen and Decimal must be greater than or equal to origin. func modifiable(origin *types.FieldType, to *types.FieldType) error { + // The root cause is modifying decimal precision needs to rewrite binary representation of that decimal. + if origin.Tp == mysql.TypeNewDecimal && (to.Flen != origin.Flen || to.Decimal != origin.Decimal) { + return errUnsupportedModifyColumn.Gen("unsupported modify decimal column precision") + } if to.Flen > 0 && to.Flen < origin.Flen { msg := fmt.Sprintf("length %d is less than origin %d", to.Flen, origin.Flen) return errUnsupportedModifyColumn.GenByArgs(msg) diff --git a/executor/admin_test.go b/executor/admin_test.go index edfd8e1faf7e..49a6a034da6a 100644 --- a/executor/admin_test.go +++ b/executor/admin_test.go @@ -466,6 +466,16 @@ func (s *testSuite) TestAdminCheckTable(c *C) { tk.MustExec(`alter table t1 add column b timestamp not null;`) tk.MustExec(`alter table t1 add index(b);`) tk.MustExec(`admin check table t1;`) + + // Test for index with change decimal precision. + tk.MustExec(`drop table if exists t1`) + tk.MustExec(`create table t1 (a decimal(2,1), index(a))`) + tk.MustExec(`insert into t1 set a='1.9'`) + _, err := tk.Exec(`alter table t1 modify column a decimal(3,2);`) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:203]unsupported modify decimal column precision") + tk.MustExec(`delete from t1;`) + tk.MustExec(`admin check table t1;`) } func (s *testSuite) TestAdminShowNextID(c *C) {