From 391290faf22eb34acedeff507228fdd142320ba4 Mon Sep 17 00:00:00 2001 From: Weizhen Wang Date: Thu, 4 May 2023 16:05:55 +0800 Subject: [PATCH 1/3] This is an automated cherry-pick of #43431 Signed-off-by: ti-chi-bot --- executor/mem_reader.go | 6 +----- table/column.go | 33 ++++++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/executor/mem_reader.go b/executor/mem_reader.go index 38424799922df..8190d4be3fa02 100644 --- a/executor/mem_reader.go +++ b/executor/mem_reader.go @@ -216,11 +216,7 @@ func buildMemTableReader(ctx context.Context, us *UnionScanExec, tblReader *Tabl } defVal := func(i int) ([]byte, error) { - sessVars := us.ctx.GetSessionVars() - originStrict := sessVars.StrictSQLMode - sessVars.StrictSQLMode = false - d, err := table.GetColOriginDefaultValue(us.ctx, us.columns[i]) - sessVars.StrictSQLMode = originStrict + d, err := table.GetColOriginDefaultValueWithoutStrictSQLMode(us.ctx, us.columns[i]) if err != nil { return nil, err } diff --git a/table/column.go b/table/column.go index 2ec3946b02c8c..95768d90a24b0 100644 --- a/table/column.go +++ b/table/column.go @@ -479,6 +479,7 @@ func (c *Column) IsCommonHandleColumn(tbInfo *model.TableInfo) bool { return mysql.HasPriKeyFlag(c.GetFlag()) && tbInfo.IsCommonHandle } +<<<<<<< HEAD // CheckNotNull checks if row has nil value set to a column with NotNull flag set. func CheckNotNull(cols []*Column, row []types.Datum) error { for _, c := range cols { @@ -487,11 +488,22 @@ func CheckNotNull(cols []*Column, row []types.Datum) error { } } return nil +======= +type getColOriginDefaultValue struct { + StrictSQLMode bool +>>>>>>> 79729c32d40 (executor: fix data race in the buildMemTableReader (#43431)) } // GetColOriginDefaultValue gets default value of the column from original default value. func GetColOriginDefaultValue(ctx sessionctx.Context, col *model.ColumnInfo) (types.Datum, error) { - return getColDefaultValue(ctx, col, col.GetOriginDefaultValue()) + return getColDefaultValue(ctx, col, col.GetOriginDefaultValue(), nil) +} + +// GetColOriginDefaultValueWithoutStrictSQLMode gets default value of the column from original default value with Strict SQL mode. +func GetColOriginDefaultValueWithoutStrictSQLMode(ctx sessionctx.Context, col *model.ColumnInfo) (types.Datum, error) { + return getColDefaultValue(ctx, col, col.GetOriginDefaultValue(), &getColOriginDefaultValue{ + StrictSQLMode: false, + }) } // CheckNoDefaultValueForInsert checks if the column has no default value before insert data. @@ -514,7 +526,7 @@ func CheckNoDefaultValueForInsert(sc *stmtctx.StatementContext, col *model.Colum func GetColDefaultValue(ctx sessionctx.Context, col *model.ColumnInfo) (types.Datum, error) { defaultValue := col.GetDefaultValue() if !col.DefaultIsExpr { - return getColDefaultValue(ctx, col, defaultValue) + return getColDefaultValue(ctx, col, defaultValue, nil) } return getColDefaultExprValue(ctx, col, defaultValue.(string)) } @@ -552,9 +564,9 @@ func getColDefaultExprValue(ctx sessionctx.Context, col *model.ColumnInfo, defau return value, nil } -func getColDefaultValue(ctx sessionctx.Context, col *model.ColumnInfo, defaultVal interface{}) (types.Datum, error) { +func getColDefaultValue(ctx sessionctx.Context, col *model.ColumnInfo, defaultVal interface{}, args *getColOriginDefaultValue) (types.Datum, error) { if defaultVal == nil { - return getColDefaultValueFromNil(ctx, col) + return getColDefaultValueFromNil(ctx, col, args) } if col.GetType() != mysql.TypeTimestamp && col.GetType() != mysql.TypeDatetime { @@ -595,8 +607,13 @@ func getColDefaultValue(ctx sessionctx.Context, col *model.ColumnInfo, defaultVa return value, nil } +<<<<<<< HEAD func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo) (types.Datum, error) { if !mysql.HasNotNullFlag(col.GetFlag()) { +======= +func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo, args *getColOriginDefaultValue) (types.Datum, error) { + if !mysql.HasNotNullFlag(col.GetFlag()) && !mysql.HasNoDefaultValueFlag(col.GetFlag()) { +>>>>>>> 79729c32d40 (executor: fix data race in the buildMemTableReader (#43431)) return types.Datum{}, nil } if col.GetType() == mysql.TypeEnum { @@ -614,7 +631,13 @@ func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo) (t } vars := ctx.GetSessionVars() sc := vars.StmtCtx - if !vars.StrictSQLMode { + var strictSQLMode bool + if args != nil { + strictSQLMode = args.StrictSQLMode + } else { + strictSQLMode = vars.StrictSQLMode + } + if !strictSQLMode { sc.AppendWarning(ErrNoDefaultValue.FastGenByArgs(col.Name)) return GetZeroValue(col), nil } From 789a734a841bc7acaf72522f3781c79bcaa8a0d3 Mon Sep 17 00:00:00 2001 From: Jason Mo Date: Wed, 28 Aug 2024 09:43:33 +0800 Subject: [PATCH 2/3] fix conflict --- table/column.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/table/column.go b/table/column.go index 95768d90a24b0..c7e4d7d123bd6 100644 --- a/table/column.go +++ b/table/column.go @@ -479,7 +479,6 @@ func (c *Column) IsCommonHandleColumn(tbInfo *model.TableInfo) bool { return mysql.HasPriKeyFlag(c.GetFlag()) && tbInfo.IsCommonHandle } -<<<<<<< HEAD // CheckNotNull checks if row has nil value set to a column with NotNull flag set. func CheckNotNull(cols []*Column, row []types.Datum) error { for _, c := range cols { @@ -488,10 +487,10 @@ func CheckNotNull(cols []*Column, row []types.Datum) error { } } return nil -======= +} + type getColOriginDefaultValue struct { StrictSQLMode bool ->>>>>>> 79729c32d40 (executor: fix data race in the buildMemTableReader (#43431)) } // GetColOriginDefaultValue gets default value of the column from original default value. @@ -607,13 +606,8 @@ func getColDefaultValue(ctx sessionctx.Context, col *model.ColumnInfo, defaultVa return value, nil } -<<<<<<< HEAD -func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo) (types.Datum, error) { - if !mysql.HasNotNullFlag(col.GetFlag()) { -======= func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo, args *getColOriginDefaultValue) (types.Datum, error) { - if !mysql.HasNotNullFlag(col.GetFlag()) && !mysql.HasNoDefaultValueFlag(col.GetFlag()) { ->>>>>>> 79729c32d40 (executor: fix data race in the buildMemTableReader (#43431)) + if !mysql.HasNotNullFlag(col.GetFlag()) { return types.Datum{}, nil } if col.GetType() == mysql.TypeEnum { From 2f8402fd224da970f640aeda6e9aae02b59df2cf Mon Sep 17 00:00:00 2001 From: Jason Mo Date: Wed, 28 Aug 2024 10:57:21 +0800 Subject: [PATCH 3/3] update --- table/column.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table/column.go b/table/column.go index c7e4d7d123bd6..6798510933bc0 100644 --- a/table/column.go +++ b/table/column.go @@ -645,7 +645,7 @@ func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo, ar sc.AppendWarning(err) return GetZeroValue(col), nil } - return types.Datum{}, ErrNoDefaultValue.FastGenByArgs(col.Name) + return types.Datum{}, ErrNoDefaultValue.GenWithStackByArgs(col.Name) } // GetZeroValue gets zero value for given column type.