Skip to content

Commit 23796a4

Browse files
authored
ddl: fix recover table by JobID bug when JobID is set to 0 tidb-server panic (#46343) (#48086)
close #46296
1 parent a169b60 commit 23796a4

File tree

4 files changed

+14
-7
lines changed

4 files changed

+14
-7
lines changed

executor/ddl.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -392,10 +392,11 @@ func (e *DDLExec) executeRecoverTable(s *ast.RecoverTableStmt) error {
392392
var job *model.Job
393393
var err error
394394
var tblInfo *model.TableInfo
395-
if s.JobID != 0 {
396-
job, tblInfo, err = e.getRecoverTableByJobID(s, dom)
397-
} else {
395+
// Let check table first. Related isssue #46296.
396+
if s.Table != nil {
398397
job, tblInfo, err = e.getRecoverTableByTableName(s.Table)
398+
} else {
399+
job, tblInfo, err = e.getRecoverTableByJobID(s, dom)
399400
}
400401
if err != nil {
401402
return err

executor/recover_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ func TestRecoverTable(t *testing.T) {
9292
err := tk.ExecToErr(fmt.Sprintf("recover table by job %d", 10000000))
9393
require.Error(t, err)
9494

95+
// recover table by zero JobID.
96+
// related issue: https://github.com/pingcap/tidb/issues/46296
97+
err = tk.ExecToErr(fmt.Sprintf("recover table by job %d", 0))
98+
require.Error(t, err)
99+
95100
// Disable GC by manual first, then after recover table, the GC enable status should also be disabled.
96101
require.NoError(t, gcutil.DisableGC(tk.Session()))
97102

parser/ast/ddl.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4228,16 +4228,16 @@ type RecoverTableStmt struct {
42284228
// Restore implements Node interface.
42294229
func (n *RecoverTableStmt) Restore(ctx *format.RestoreCtx) error {
42304230
ctx.WriteKeyWord("RECOVER TABLE ")
4231-
if n.JobID != 0 {
4232-
ctx.WriteKeyWord("BY JOB ")
4233-
ctx.WritePlainf("%d", n.JobID)
4234-
} else {
4231+
if n.Table != nil {
42354232
if err := n.Table.Restore(ctx); err != nil {
42364233
return errors.Annotate(err, "An error occurred while splicing RecoverTableStmt Table")
42374234
}
42384235
if n.JobNum > 0 {
42394236
ctx.WritePlainf(" %d", n.JobNum)
42404237
}
4238+
} else {
4239+
ctx.WriteKeyWord("BY JOB ")
4240+
ctx.WritePlainf("%d", n.JobID)
42414241
}
42424242
return nil
42434243
}

parser/parser_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3311,6 +3311,7 @@ func TestDDL(t *testing.T) {
33113311
{"recover table by job 11", true, "RECOVER TABLE BY JOB 11"},
33123312
{"recover table by job 11,12,13", false, ""},
33133313
{"recover table by job", false, ""},
3314+
{"recover table by job 0", true, "RECOVER TABLE BY JOB 0"},
33143315
{"recover table t1", true, "RECOVER TABLE `t1`"},
33153316
{"recover table t1,t2", false, ""},
33163317
{"recover table ", false, ""},

0 commit comments

Comments
 (0)