From 34073ed24121e946256bd38d5c84aaead287f04a Mon Sep 17 00:00:00 2001 From: wjhuang2016 Date: Thu, 29 Dec 2022 15:01:38 +0800 Subject: [PATCH] done Signed-off-by: wjhuang2016 --- ddl/column.go | 9 +++++++++ ddl/db_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/ddl/column.go b/ddl/column.go index 3bbe7417fd7b5..8105e52fa438e 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -1654,6 +1654,15 @@ func updateColumnDefaultValue(d *ddlCtx, t *meta.Meta, job *model.Job, newCol *m job.State = model.JobStateCancelled return ver, infoschema.ErrColumnNotExists.GenWithStackByArgs(newCol.Name, tblInfo.Name) } + + if hasDefaultValue, _, err := checkColumnDefaultValue(newContext(d.store), table.ToColumn(oldCol.Clone()), newCol.DefaultValue); err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } else if !hasDefaultValue { + job.State = model.JobStateCancelled + return ver, dbterror.ErrInvalidDefaultValue.GenWithStackByArgs(newCol.Name) + } + // The newCol's offset may be the value of the old schema version, so we can't use newCol directly. oldCol.DefaultValue = newCol.DefaultValue oldCol.DefaultValueBit = newCol.DefaultValueBit diff --git a/ddl/db_test.go b/ddl/db_test.go index d48bacd3947c0..7d1e829b3db61 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -20,6 +20,7 @@ import ( "math" "strconv" "strings" + "sync" "testing" "time" @@ -1789,3 +1790,37 @@ func TestHashPartitionAddColumn(t *testing.T) { dom.DDL().SetHook(hook) tk.MustExec("alter table t add column c int") } + +func TestSetInvalidDefaultValueAfterModifyColumn(t *testing.T) { + store, dom := testkit.CreateMockStoreAndDomain(t) + + tk := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int)") + + var wg sync.WaitGroup + var checkErr error + one := false + hook := &ddl.TestDDLCallback{Do: dom} + hook.OnJobRunBeforeExported = func(job *model.Job) { + if job.SchemaState != model.StateDeleteOnly { + return + } + if !one { + one = true + } else { + return + } + wg.Add(1) + go func() { + tk2 := testkit.NewTestKit(t, store) + tk2.MustExec("use test") + _, checkErr = tk2.Exec("alter table t alter column a set default 1") + wg.Done() + }() + } + dom.DDL().SetHook(hook) + tk.MustExec("alter table t modify column a text(100)") + wg.Wait() + require.EqualError(t, checkErr, "[ddl:1101]BLOB/TEXT/JSON column 'a' can't have a default value") +}