func()

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
}