in pkg/datasource/sql/exec/at/multi_delete_executor.go [140:193]
func (m *multiDeleteExecutor) buildBeforeImageSQL() (string, []driver.NamedValue, error) {
tableName, err := m.getFromTableInSQL()
if err != nil {
return "", nil, err
}
var (
// todo optimize replace * by use columns
selectSQL = "SELECT SQL_NO_CACHE * FROM " + tableName
params []driver.NamedValue
whereCondition string
hasWhereCondition = true
)
for _, parser := range m.parserCtx.MultiStmt {
deleteParser := parser.DeleteStmt
if deleteParser == nil {
continue
}
if deleteParser.Limit != nil {
return "", nil, fmt.Errorf("Multi delete SQL with limit condition is not support yet!")
}
if deleteParser.Order != nil {
return "", nil, fmt.Errorf("Multi delete SQL with orderBy condition is not support yet!")
}
if deleteParser.Where == nil || !hasWhereCondition {
hasWhereCondition = false
continue
}
var whereBuffer bytes.Buffer
if err = deleteParser.Where.Restore(format.NewRestoreCtx(format.RestoreKeyWordUppercase, &whereBuffer)); err != nil {
return "", nil, err
}
if whereCondition != "" {
whereCondition += " OR "
}
whereCondition += fmt.Sprintf("(%s)", string(whereBuffer.Bytes()))
newParams := m.buildSelectArgs(&ast.SelectStmt{Where: parser.DeleteStmt.Where}, m.execContext.NamedValues)
params = append(params, newParams...)
}
if hasWhereCondition {
selectSQL += " WHERE " + whereCondition
} else {
params = []driver.NamedValue{}
}
selectSQL += " FOR UPDATE"
return selectSQL, params, nil
}