func()

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
}