in pkg/datasource/sql/exec/at/insert_executor.go [422:459]
func (i *insertExecutor) getPkValuesByColumn(ctx context.Context, execCtx *types.ExecContext) (map[string][]interface{}, error) {
if !i.isAstStmtValid() {
return nil, nil
}
tableName, _ := i.parserCtx.GetTableName()
meta, err := datasource.GetTableCache(types.DBTypeMySQL).GetTableMeta(ctx, i.execContext.DBName, tableName)
if err != nil {
return nil, err
}
pkValuesMap, err := i.parsePkValuesFromStatement(i.parserCtx.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 := i.getPkValuesByAuto(ctx, 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 := i.getPkValuesByAuto(ctx, execCtx)
if err != nil {
return nil, err
}
pkValuesMapMerge(&pkValuesMap, curPkValueMap)
}
}
return pkValuesMap, nil
}