@@ -1212,11 +1212,23 @@ type updateColumnWorker struct {
1212
1212
checksumNeeded bool
1213
1213
}
1214
1214
1215
- func newUpdateColumnWorker (sessCtx sessionctx.Context , id int , t table.PhysicalTable , decodeColMap map [int64 ]decoder.Column , reorgInfo * reorgInfo , jc * JobContext ) * updateColumnWorker {
1215
+ func newUpdateColumnWorker (id int , t table.PhysicalTable , decodeColMap map [int64 ]decoder.Column , reorgInfo * reorgInfo , jc * JobContext ) (* updateColumnWorker , error ) {
1216
+ bCtx , err := newBackfillCtx (id , reorgInfo , reorgInfo .SchemaName , t , jc , "update_col_rate" , false )
1217
+ if err != nil {
1218
+ return nil , err
1219
+ }
1220
+
1221
+ sessCtx := bCtx .sessCtx
1222
+ sessCtx .GetSessionVars ().StmtCtx .SetTypeFlags (
1223
+ sessCtx .GetSessionVars ().StmtCtx .TypeFlags ().
1224
+ WithIgnoreZeroDateErr (! reorgInfo .ReorgMeta .SQLMode .HasStrictMode ()))
1225
+ bCtx .exprCtx = bCtx .sessCtx .GetExprCtx ()
1226
+ bCtx .tblCtx = bCtx .sessCtx .GetTableCtx ()
1227
+
1216
1228
if ! bytes .Equal (reorgInfo .currElement .TypeKey , meta .ColumnElementKey ) {
1217
1229
logutil .DDLLogger ().Error ("Element type for updateColumnWorker incorrect" , zap .String ("jobQuery" , reorgInfo .Query ),
1218
1230
zap .Stringer ("reorgInfo" , reorgInfo ))
1219
- return nil
1231
+ return nil , nil
1220
1232
}
1221
1233
var oldCol , newCol * model.ColumnInfo
1222
1234
for _ , col := range t .WritableCols () {
@@ -1248,13 +1260,13 @@ func newUpdateColumnWorker(sessCtx sessionctx.Context, id int, t table.PhysicalT
1248
1260
}
1249
1261
}
1250
1262
return & updateColumnWorker {
1251
- backfillCtx : newBackfillCtx ( reorgInfo . d , id , sessCtx , reorgInfo . SchemaName , t , jc , "update_col_rate" , false ) ,
1263
+ backfillCtx : bCtx ,
1252
1264
oldColInfo : oldCol ,
1253
1265
newColInfo : newCol ,
1254
1266
rowDecoder : rowDecoder ,
1255
1267
rowMap : make (map [int64 ]types.Datum , len (decodeColMap )),
1256
1268
checksumNeeded : checksumNeeded ,
1257
- }
1269
+ }, nil
1258
1270
}
1259
1271
1260
1272
func (w * updateColumnWorker ) AddMetricInfo (cnt float64 ) {
@@ -1294,7 +1306,7 @@ func (w *updateColumnWorker) fetchRowColVals(txn kv.Transaction, taskRange reorg
1294
1306
taskDone := false
1295
1307
var lastAccessedHandle kv.Key
1296
1308
oprStartTime := startTime
1297
- err := iterateSnapshotKeys (w .jobContext , w .sessCtx . GetStore () , taskRange .priority , taskRange .physicalTable .RecordPrefix (),
1309
+ err := iterateSnapshotKeys (w .jobContext , w .ddlCtx . store , taskRange .priority , taskRange .physicalTable .RecordPrefix (),
1298
1310
txn .StartTS (), taskRange .startKey , taskRange .endKey , func (handle kv.Handle , recordKey kv.Key , rawRow []byte ) (bool , error ) {
1299
1311
oprEndTime := time .Now ()
1300
1312
logSlowOperations (oprEndTime .Sub (oprStartTime ), "iterateSnapshotKeys in updateColumnWorker fetchRowColVals" , 0 )
@@ -1329,8 +1341,8 @@ func (w *updateColumnWorker) fetchRowColVals(txn kv.Transaction, taskRange reorg
1329
1341
}
1330
1342
1331
1343
func (w * updateColumnWorker ) getRowRecord (handle kv.Handle , recordKey []byte , rawRow []byte ) error {
1332
- sysTZ := w .sessCtx . GetSessionVars (). StmtCtx . TimeZone ()
1333
- _ , err := w .rowDecoder .DecodeTheExistedColumnMap (w .sessCtx , handle , rawRow , sysTZ , w .rowMap )
1344
+ sysTZ := w .loc
1345
+ _ , err := w .rowDecoder .DecodeTheExistedColumnMap (w .exprCtx , handle , rawRow , sysTZ , w .rowMap )
1334
1346
if err != nil {
1335
1347
return errors .Trace (dbterror .ErrCantDecodeRecord .GenWithStackByArgs ("column" , err ))
1336
1348
}
@@ -1343,26 +1355,26 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra
1343
1355
1344
1356
var recordWarning * terror.Error
1345
1357
// Since every updateColumnWorker handle their own work individually, we can cache warning in statement context when casting datum.
1346
- oldWarn := w .sessCtx . GetSessionVars (). StmtCtx .GetWarnings ()
1358
+ oldWarn := w .warnings .GetWarnings ()
1347
1359
if oldWarn == nil {
1348
1360
oldWarn = []contextutil.SQLWarn {}
1349
1361
} else {
1350
1362
oldWarn = oldWarn [:0 ]
1351
1363
}
1352
- w .sessCtx . GetSessionVars (). StmtCtx .SetWarnings (oldWarn )
1364
+ w .warnings .SetWarnings (oldWarn )
1353
1365
val := w .rowMap [w .oldColInfo .ID ]
1354
1366
col := w .newColInfo
1355
1367
if val .Kind () == types .KindNull && col .FieldType .GetType () == mysql .TypeTimestamp && mysql .HasNotNullFlag (col .GetFlag ()) {
1356
- if v , err := expression .GetTimeCurrentTimestamp (w .sessCtx . GetExprCtx () .GetEvalCtx (), col .GetType (), col .GetDecimal ()); err == nil {
1368
+ if v , err := expression .GetTimeCurrentTimestamp (w .exprCtx .GetEvalCtx (), col .GetType (), col .GetDecimal ()); err == nil {
1357
1369
// convert null value to timestamp should be substituted with current timestamp if NOT_NULL flag is set.
1358
1370
w .rowMap [w .oldColInfo .ID ] = v
1359
1371
}
1360
1372
}
1361
- newColVal , err := table .CastValue (w .sessCtx , w .rowMap [w .oldColInfo .ID ], w .newColInfo , false , false )
1373
+ newColVal , err := table .CastColumnValue (w .exprCtx , w .rowMap [w .oldColInfo .ID ], w .newColInfo , false , false )
1362
1374
if err != nil {
1363
1375
return w .reformatErrors (err )
1364
1376
}
1365
- warn := w .sessCtx . GetSessionVars (). StmtCtx .GetWarnings ()
1377
+ warn := w .warnings .GetWarnings ()
1366
1378
if len (warn ) != 0 {
1367
1379
//nolint:forcetypeassert
1368
1380
recordWarning = errors .Cause (w .reformatErrors (warn [0 ].Err )).(* terror.Error )
@@ -1378,7 +1390,7 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra
1378
1390
})
1379
1391
1380
1392
w .rowMap [w .newColInfo .ID ] = newColVal
1381
- _ , err = w .rowDecoder .EvalRemainedExprColumnMap (w .sessCtx , w .rowMap )
1393
+ _ , err = w .rowDecoder .EvalRemainedExprColumnMap (w .exprCtx , w .rowMap )
1382
1394
if err != nil {
1383
1395
return errors .Trace (err )
1384
1396
}
@@ -1389,9 +1401,10 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra
1389
1401
newRow = append (newRow , val )
1390
1402
}
1391
1403
checksums := w .calcChecksums ()
1392
- sctx , rd := w .sessCtx .GetSessionVars ().StmtCtx , & w .sessCtx .GetSessionVars ().RowEncoder
1393
- newRowVal , err := tablecodec .EncodeRow (sctx .TimeZone (), newRow , newColumnIDs , nil , nil , rd , checksums ... )
1394
- err = sctx .HandleError (err )
1404
+ rd := & w .tblCtx .GetSessionVars ().RowEncoder
1405
+ ec := w .exprCtx .GetEvalCtx ().ErrCtx ()
1406
+ newRowVal , err := tablecodec .EncodeRow (w .loc , newRow , newColumnIDs , nil , nil , rd , checksums ... )
1407
+ err = ec .HandleError (err )
1395
1408
if err != nil {
1396
1409
return errors .Trace (err )
1397
1410
}
@@ -1423,7 +1436,7 @@ func (w *updateColumnWorker) calcChecksums() []uint32 {
1423
1436
if ! sort .IsSorted (w .checksumBuffer ) {
1424
1437
sort .Sort (w .checksumBuffer )
1425
1438
}
1426
- checksum , err := w .checksumBuffer .Checksum (w .sessCtx . GetSessionVars (). StmtCtx . TimeZone () )
1439
+ checksum , err := w .checksumBuffer .Checksum (w .loc )
1427
1440
if err != nil {
1428
1441
logutil .DDLLogger ().Warn ("skip checksum in update-column backfill due to encode error" , zap .Error (err ))
1429
1442
return nil
@@ -1465,7 +1478,7 @@ func (w *updateColumnWorker) cleanRowMap() {
1465
1478
func (w * updateColumnWorker ) BackfillData (handleRange reorgBackfillTask ) (taskCtx backfillTaskContext , errInTxn error ) {
1466
1479
oprStartTime := time .Now ()
1467
1480
ctx := kv .WithInternalSourceAndTaskType (context .Background (), w .jobContext .ddlJobSourceType (), kvutil .ExplicitTypeDDL )
1468
- errInTxn = kv .RunInNewTxn (ctx , w .sessCtx . GetStore () , true , func (_ context.Context , txn kv.Transaction ) error {
1481
+ errInTxn = kv .RunInNewTxn (ctx , w .ddlCtx . store , true , func (_ context.Context , txn kv.Transaction ) error {
1469
1482
taskCtx .addedCount = 0
1470
1483
taskCtx .scanCount = 0
1471
1484
updateTxnEntrySizeLimitIfNeeded (txn )
0 commit comments