diff --git a/pkg/ddl/create_table.go b/pkg/ddl/create_table.go index cbe7b9dd23a12..688fd9df895f1 100644 --- a/pkg/ddl/create_table.go +++ b/pkg/ddl/create_table.go @@ -313,6 +313,9 @@ func onCreateView(jobCtx *jobContext, job *model.Job) (ver int64, _ error) { metaMut := jobCtx.metaMut oldTableID, err := findTableIDByName(jobCtx.infoCache, metaMut, schemaID, tbInfo.Name.L) + if err == nil && oldTableID > 0 { + err = infoschema.ErrTableExists + } if infoschema.ErrTableNotExists.Equal(err) { err = nil } @@ -329,6 +332,7 @@ func onCreateView(jobCtx *jobContext, job *model.Job) (ver int64, _ error) { return ver, errors.Trace(err) } } + ver, err = updateSchemaVersion(jobCtx, job) if err != nil { return ver, errors.Trace(err) diff --git a/pkg/ddl/table_test.go b/pkg/ddl/table_test.go index 47cfb2c73e883..369f0820ced53 100644 --- a/pkg/ddl/table_test.go +++ b/pkg/ddl/table_test.go @@ -791,3 +791,27 @@ func TestDropTableAccessibleInInfoSchema(t *testing.T) { } require.True(t, len(errs) > 0) } + +func TestCreateViewTwice(t *testing.T) { + store := testkit.CreateMockStore(t) + tk := testkit.NewTestKit(t, store) + tk2 := testkit.NewTestKit(t, store) + tk.MustExec("use test") + tk.MustExec("create table t_raw (id int)") + tk2.MustExec("use test") + + var wg sync.WaitGroup + wg.Add(1) + first := true + testfailpoint.EnableCall(t, "github.com/pingcap/tidb/pkg/ddl/beforeDeliveryJob", func(job *model.Job) { + if first { + first = false + go func() { + defer wg.Done() + tk2.MustExecToErr("create view v as select * from t_raw where id > 666") + }() + } + }) + tk.MustExec("create view v as select * from t_raw") + wg.Wait() +}