in pkg/datasource/sql/exec/at/insert_on_update_executor.go [146:201]
func (i *insertOnUpdateExecutor) buildBeforeImageSQL(insertStmt *ast.InsertStmt, metaData types.TableMeta, args []driver.NamedValue) (string, []driver.NamedValue, error) {
if err := checkDuplicateKeyUpdate(insertStmt, metaData); err != nil {
return "", nil, err
}
paramMap, insertNum, err := i.buildBeforeImageSQLParameters(insertStmt, args, metaData)
if err != nil {
return "", nil, err
}
sql := strings.Builder{}
sql.WriteString("SELECT * FROM " + metaData.TableName + " ")
isContainWhere := false
var selectArgs []driver.NamedValue
for j := 0; j < insertNum; j++ {
finalJ := j
var paramAppenderTempList []driver.NamedValue
for _, index := range metaData.Indexs {
// unique index
if index.NonUnique || isIndexValueNull(index, paramMap, finalJ) {
continue
}
columnIsNull := true
var uniqueList []string
for _, columnMeta := range index.Columns {
columnName := columnMeta.ColumnName
imageParameters, ok := paramMap[strings.ToLower(columnName)]
if !ok && columnMeta.ColumnDef != nil {
if strings.EqualFold("PRIMARY", index.Name) {
i.beforeImageSqlPrimaryKeys[columnName] = true
}
uniqueList = append(uniqueList, columnName+" = DEFAULT("+columnName+") ")
columnIsNull = false
continue
}
if strings.EqualFold("PRIMARY", index.Name) {
i.beforeImageSqlPrimaryKeys[columnName] = true
}
columnIsNull = false
uniqueList = append(uniqueList, columnName+" = ? ")
paramAppenderTempList = append(paramAppenderTempList, imageParameters[finalJ])
}
if !columnIsNull {
if isContainWhere {
sql.WriteString(" OR (" + strings.Join(uniqueList, " and ") + ") ")
} else {
sql.WriteString(" WHERE (" + strings.Join(uniqueList, " and ") + ") ")
isContainWhere = true
}
}
}
selectArgs = append(selectArgs, paramAppenderTempList...)
}
log.Infof("build select sql by insert on update sourceQuery, sql %s", sql.String())
return sql.String(), selectArgs, nil
}