@@ -33,6 +33,7 @@ import (
33
33
"github.com/pingcap/tidb/pkg/kv"
34
34
"github.com/pingcap/tidb/pkg/meta"
35
35
"github.com/pingcap/tidb/pkg/meta/autoid"
36
+ "github.com/pingcap/tidb/pkg/parser/ast"
36
37
"github.com/pingcap/tidb/pkg/parser/model"
37
38
"github.com/pingcap/tidb/pkg/parser/mysql"
38
39
"github.com/pingcap/tidb/pkg/sessionctx"
@@ -138,15 +139,21 @@ func TableFromMeta(allocs autoid.Allocators, tblInfo *model.TableInfo) (table.Ta
138
139
139
140
col := table .ToColumn (colInfo )
140
141
if col .IsGenerated () {
141
- expr , err := generatedexpr .ParseExpression (colInfo .GeneratedExprString )
142
+ genStr := colInfo .GeneratedExprString
143
+ expr , err := buildGeneratedExpr (tblInfo , genStr )
142
144
if err != nil {
143
145
return nil , err
144
146
}
145
- expr , err = generatedexpr .SimpleResolveName (expr , tblInfo )
146
- if err != nil {
147
- return nil , err
148
- }
149
- col .GeneratedExpr = expr
147
+ col .GeneratedExpr = table .NewClonableExprNode (func () ast.ExprNode {
148
+ newExpr , err1 := buildGeneratedExpr (tblInfo , genStr )
149
+ if err1 != nil {
150
+ logutil .BgLogger ().Warn ("unexpected parse generated string error" ,
151
+ zap .String ("generatedStr" , genStr ),
152
+ zap .Error (err1 ))
153
+ return expr
154
+ }
155
+ return newExpr
156
+ }, expr )
150
157
}
151
158
// default value is expr.
152
159
if col .DefaultIsExpr {
@@ -177,6 +184,18 @@ func TableFromMeta(allocs autoid.Allocators, tblInfo *model.TableInfo) (table.Ta
177
184
return newPartitionedTable (& t , tblInfo )
178
185
}
179
186
187
+ func buildGeneratedExpr (tblInfo * model.TableInfo , genExpr string ) (ast.ExprNode , error ) {
188
+ expr , err := generatedexpr .ParseExpression (genExpr )
189
+ if err != nil {
190
+ return nil , err
191
+ }
192
+ expr , err = generatedexpr .SimpleResolveName (expr , tblInfo )
193
+ if err != nil {
194
+ return nil , err
195
+ }
196
+ return expr , nil
197
+ }
198
+
180
199
// initTableCommon initializes a TableCommon struct.
181
200
func initTableCommon (t * TableCommon , tblInfo * model.TableInfo , physicalTableID int64 , cols []* table.Column , allocs autoid.Allocators , constraints []* table.Constraint ) {
182
201
t .tableID = tblInfo .ID
0 commit comments