in pkg/datasource/sql/exec/at/update_executor.go [88:136]
func (u *updateExecutor) beforeImage(ctx context.Context) (*types.RecordImage, error) {
if !u.isAstStmtValid() {
return nil, nil
}
selectSQL, selectArgs, err := u.buildBeforeImageSQL(ctx, u.execContext.NamedValues)
if err != nil {
return nil, err
}
tableName, _ := u.parserCtx.GetTableName()
metaData, err := datasource.GetTableCache(types.DBTypeMySQL).GetTableMeta(ctx, u.execContext.DBName, tableName)
if err != nil {
return nil, err
}
var rowsi driver.Rows
queryerCtx, ok := u.execContext.Conn.(driver.QueryerContext)
var queryer driver.Queryer
if !ok {
queryer, ok = u.execContext.Conn.(driver.Queryer)
}
if ok {
rowsi, err = util.CtxDriverQuery(ctx, queryerCtx, queryer, selectSQL, selectArgs)
defer func() {
if rowsi != nil {
rowsi.Close()
}
}()
if err != nil {
log.Errorf("ctx driver query: %+v", err)
return nil, err
}
} else {
log.Errorf("target conn should been driver.QueryerContext or driver.Queryer")
return nil, fmt.Errorf("invalid conn")
}
image, err := u.buildRecordImages(rowsi, metaData, types.SQLTypeUpdate)
if err != nil {
return nil, err
}
lockKey := u.buildLockKey(image, *metaData)
u.execContext.TxCtx.LockKeys[lockKey] = struct{}{}
image.SQLType = u.parserCtx.SQLType
return image, nil
}