code: func (e *DDLExec) executeRecoverTable(s *ast.RecoverTableStmt) error {
  	txn, err := e.ctx.Txn(true)
  	if err != nil {
  		return err
  	}
  	t := meta.NewMeta(txn)
  	dom := domain.GetDomain(e.ctx)
  	var job *model.Job
  	var tblInfo *model.TableInfo
  	if s.JobID != 0 {
  		job, tblInfo, err = e.getRecoverTableByJobID(s, t, dom)
  	} else {
  		job, tblInfo, err = e.getRecoverTableByTableName(s, t, dom)
  	}
  	if err != nil {
  		return err
  	}
  	// Get table original autoID before table drop.
  	m, err := dom.GetSnapshotMeta(job.StartTS)
  	if err != nil {
  		return err
  	}
  	autoID, err := m.GetAutoTableID(job.SchemaID, job.TableID)
  	if err != nil {
  		return errors.Errorf("recover table_id: %d, get original autoID from snapshot meta err: %s", job.TableID, err.Error())
  	}
  	// Call DDL RecoverTable
  	err = domain.GetDomain(e.ctx).DDL().RecoverTable(e.ctx, tblInfo, job.SchemaID, autoID, job.ID, job.StartTS)
  	return err
  }
docs: // executeRecoverTable represents a recover table executor.
  // It is built from "recover table" statement,
  // is used to recover the table that deleted by mistake.