in pkg/datasource/sql/undo/builder/mysql_insert_undo_log_builder.go [362:396]
func (u *MySQLInsertUndoLogBuilder) getPkValuesByColumn(execCtx *types.ExecContext) (map[string][]interface{}, error) {
if execCtx == nil || execCtx.ParseContext == nil || execCtx.ParseContext.InsertStmt == nil {
return nil, nil
}
parseCtx := execCtx.ParseContext
tableName := execCtx.ParseContext.InsertStmt.Table.TableRefs.Left.(*ast.TableSource).Source.(*ast.TableName).Name.O
meta := execCtx.MetaDataMap[tableName]
pkValuesMap, err := u.parsePkValuesFromStatement(parseCtx.InsertStmt, meta, execCtx.NamedValues)
if err != nil {
return nil, err
}
// generate pkValue by auto increment
for _, v := range pkValuesMap {
tmpV := v
if len(tmpV) == 1 {
// pk auto generated while single insert primary key is expression
if _, ok := tmpV[0].(*ast.FuncCallExpr); ok {
curPkValueMap, err := u.getPkValuesByAuto(execCtx)
if err != nil {
return nil, err
}
pkValuesMapMerge(&pkValuesMap, curPkValueMap)
}
} else if len(tmpV) > 0 && tmpV[0] == nil {
// pk auto generated while column exists and value is null
curPkValueMap, err := u.getPkValuesByAuto(execCtx)
if err != nil {
return nil, err
}
pkValuesMapMerge(&pkValuesMap, curPkValueMap)
}
}
return pkValuesMap, nil
}