diff --git a/pkg/executor/ddl.go b/pkg/executor/ddl.go index 7cddefb17b4e3..6766742fbdab5 100644 --- a/pkg/executor/ddl.go +++ b/pkg/executor/ddl.go @@ -393,10 +393,11 @@ func (e *DDLExec) executeRecoverTable(s *ast.RecoverTableStmt) error { var job *model.Job var err error var tblInfo *model.TableInfo - if s.JobID != 0 { - job, tblInfo, err = e.getRecoverTableByJobID(s, dom) - } else { + // Let check table first. Related isssue #46296. + if s.Table != nil { job, tblInfo, err = e.getRecoverTableByTableName(s.Table) + } else { + job, tblInfo, err = e.getRecoverTableByJobID(s, dom) } if err != nil { return err diff --git a/pkg/executor/recover_test.go b/pkg/executor/recover_test.go index cada16d5113ac..c57c71dc61af9 100644 --- a/pkg/executor/recover_test.go +++ b/pkg/executor/recover_test.go @@ -92,6 +92,11 @@ func TestRecoverTable(t *testing.T) { err := tk.ExecToErr(fmt.Sprintf("recover table by job %d", 10000000)) require.Error(t, err) + // recover table by zero JobID. + // related issue: https://github.com/pingcap/tidb/issues/46296 + err = tk.ExecToErr(fmt.Sprintf("recover table by job %d", 0)) + require.Error(t, err) + // Disable GC by manual first, then after recover table, the GC enable status should also be disabled. require.NoError(t, gcutil.DisableGC(tk.Session())) diff --git a/pkg/parser/ast/ddl.go b/pkg/parser/ast/ddl.go index e3eb09ad6d9a4..8211737d8ffd0 100644 --- a/pkg/parser/ast/ddl.go +++ b/pkg/parser/ast/ddl.go @@ -4381,16 +4381,16 @@ type RecoverTableStmt struct { // Restore implements Node interface. func (n *RecoverTableStmt) Restore(ctx *format.RestoreCtx) error { ctx.WriteKeyWord("RECOVER TABLE ") - if n.JobID != 0 { - ctx.WriteKeyWord("BY JOB ") - ctx.WritePlainf("%d", n.JobID) - } else { + if n.Table != nil { if err := n.Table.Restore(ctx); err != nil { return errors.Annotate(err, "An error occurred while splicing RecoverTableStmt Table") } if n.JobNum > 0 { ctx.WritePlainf(" %d", n.JobNum) } + } else { + ctx.WriteKeyWord("BY JOB ") + ctx.WritePlainf("%d", n.JobID) } return nil } diff --git a/pkg/parser/parser_test.go b/pkg/parser/parser_test.go index ff9170b0f5819..e698b42f55fd6 100644 --- a/pkg/parser/parser_test.go +++ b/pkg/parser/parser_test.go @@ -3375,6 +3375,7 @@ func TestDDL(t *testing.T) { {"recover table by job 11", true, "RECOVER TABLE BY JOB 11"}, {"recover table by job 11,12,13", false, ""}, {"recover table by job", false, ""}, + {"recover table by job 0", true, "RECOVER TABLE BY JOB 0"}, {"recover table t1", true, "RECOVER TABLE `t1`"}, {"recover table t1,t2", false, ""}, {"recover table ", false, ""},