ColumnInfos2ColumnsAndNames converts the ColumnInfo to the *Column and NameSlice.
(ctx BuildContext, dbName, tblName pmodel.CIStr, colInfos []*model.ColumnInfo, tblInfo *model.TableInfo)
| 1068 | |
| 1069 | // ColumnInfos2ColumnsAndNames converts the ColumnInfo to the *Column and NameSlice. |
| 1070 | func ColumnInfos2ColumnsAndNames(ctx BuildContext, dbName, tblName pmodel.CIStr, colInfos []*model.ColumnInfo, tblInfo *model.TableInfo) ([]*Column, types.NameSlice, error) { |
| 1071 | columns := make([]*Column, 0, len(colInfos)) |
| 1072 | names := make([]*types.FieldName, 0, len(colInfos)) |
| 1073 | for i, col := range colInfos { |
| 1074 | names = append(names, &types.FieldName{ |
| 1075 | OrigTblName: tblName, |
| 1076 | OrigColName: col.Name, |
| 1077 | DBName: dbName, |
| 1078 | TblName: tblName, |
| 1079 | ColName: col.Name, |
| 1080 | }) |
| 1081 | newCol := &Column{ |
| 1082 | RetType: col.FieldType.Clone(), |
| 1083 | ID: col.ID, |
| 1084 | UniqueID: ctx.AllocPlanColumnID(), |
| 1085 | Index: col.Offset, |
| 1086 | OrigName: names[i].String(), |
| 1087 | IsHidden: col.Hidden, |
| 1088 | } |
| 1089 | columns = append(columns, newCol) |
| 1090 | } |
| 1091 | // Resolve virtual generated column. |
| 1092 | mockSchema := NewSchema(columns...) |
| 1093 | |
| 1094 | truncateIgnored := false |
| 1095 | for i, col := range colInfos { |
| 1096 | if col.IsVirtualGenerated() { |
| 1097 | if !truncateIgnored { |
| 1098 | // Ignore redundant warning here. |
| 1099 | ctx = exprctx.CtxWithHandleTruncateErrLevel(ctx, errctx.LevelIgnore) |
| 1100 | truncateIgnored = true |
| 1101 | } |
| 1102 | |
| 1103 | expr, err := generatedexpr.ParseExpression(col.GeneratedExprString) |
| 1104 | if err != nil { |
| 1105 | return nil, nil, errors.Trace(err) |
| 1106 | } |
| 1107 | expr, err = generatedexpr.SimpleResolveName(expr, tblInfo) |
| 1108 | if err != nil { |
| 1109 | return nil, nil, errors.Trace(err) |
| 1110 | } |
| 1111 | e, err := BuildSimpleExpr(ctx, expr, WithInputSchemaAndNames(mockSchema, names, tblInfo), WithAllowCastArray(true)) |
| 1112 | if err != nil { |
| 1113 | return nil, nil, errors.Trace(err) |
| 1114 | } |
| 1115 | if e != nil { |
| 1116 | columns[i].VirtualExpr = e.Clone() |
| 1117 | } |
| 1118 | columns[i].VirtualExpr, err = columns[i].VirtualExpr.ResolveIndices(mockSchema) |
| 1119 | if err != nil { |
| 1120 | return nil, nil, errors.Trace(err) |
| 1121 | } |
| 1122 | } |
| 1123 | } |
| 1124 | return columns, names, nil |
| 1125 | } |
| 1126 | |
| 1127 | // NewValuesFunc creates a new values function. |