Skip to content

Commit dd6900b

Browse files
committed
for test
1 parent d041cd0 commit dd6900b

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

pkg/expression/builtin_cast.go

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"github.com/pingcap/tidb/pkg/sessionctx/stmtctx"
3939
"github.com/pingcap/tidb/pkg/types"
4040
"github.com/pingcap/tidb/pkg/util/chunk"
41+
"github.com/pingcap/tidb/pkg/util/collate"
4142
"github.com/pingcap/tipb/go-tipb"
4243
)
4344

@@ -288,7 +289,8 @@ func (c *castAsDecimalFunctionClass) getFunction(ctx BuildContext, args []Expres
288289
type castAsStringFunctionClass struct {
289290
baseFunctionClass
290291

291-
tp *types.FieldType
292+
tp *types.FieldType
293+
isExplicitCharSet bool
292294
}
293295

294296
func (c *castAsStringFunctionClass) getFunction(ctx BuildContext, args []Expression) (sig builtinFunc, err error) {
@@ -299,6 +301,16 @@ func (c *castAsStringFunctionClass) getFunction(ctx BuildContext, args []Express
299301
if err != nil {
300302
return nil, err
301303
}
304+
if c.isExplicitCharSet {
305+
bf.SetCharsetAndCollation(c.tp.GetCharset(), c.tp.GetCollate())
306+
bf.setCollator(collate.GetCollator(c.tp.GetCollate()))
307+
bf.SetCoercibility(CoercibilityExplicit)
308+
if c.tp.GetCharset() == charset.CharsetASCII {
309+
bf.SetRepertoire(ASCII)
310+
} else {
311+
bf.SetRepertoire(UNICODE)
312+
}
313+
}
302314
if args[0].GetType(ctx.GetEvalCtx()).Hybrid() {
303315
sig = &builtinCastStringAsStringSig{bf}
304316
sig.setPbCode(tipb.ScalarFuncSig_CastStringAsString)
@@ -2265,7 +2277,7 @@ func CanImplicitEvalReal(expr Expression) bool {
22652277
// BuildCastFunction4Union build a implicitly CAST ScalarFunction from the Union
22662278
// Expression.
22672279
func BuildCastFunction4Union(ctx BuildContext, expr Expression, tp *types.FieldType) (res Expression) {
2268-
res, err := BuildCastFunctionWithCheck(ctx, expr, tp, true)
2280+
res, err := BuildCastFunctionWithCheck(ctx, expr, tp, true, false)
22692281
terror.Log(err)
22702282
return
22712283
}
@@ -2302,13 +2314,20 @@ func BuildCastCollationFunction(ctx BuildContext, expr Expression, ec *ExprColla
23022314

23032315
// BuildCastFunction builds a CAST ScalarFunction from the Expression.
23042316
func BuildCastFunction(ctx BuildContext, expr Expression, tp *types.FieldType) (res Expression) {
2305-
res, err := BuildCastFunctionWithCheck(ctx, expr, tp, false)
2317+
res, err := BuildCastFunctionWithCheck(ctx, expr, tp, false, false)
2318+
terror.Log(err)
2319+
return
2320+
}
2321+
2322+
// BuildCastFunctionExplicitCharset builds a CAST ScalarFunction from the Expression.
2323+
func BuildCastFunctionExplicitCharset(ctx BuildContext, expr Expression, tp *types.FieldType) (res Expression) {
2324+
res, err := BuildCastFunctionWithCheck(ctx, expr, tp, false, true)
23062325
terror.Log(err)
23072326
return
23082327
}
23092328

23102329
// BuildCastFunctionWithCheck builds a CAST ScalarFunction from the Expression and return error if any.
2311-
func BuildCastFunctionWithCheck(ctx BuildContext, expr Expression, tp *types.FieldType, inUnion bool) (res Expression, err error) {
2330+
func BuildCastFunctionWithCheck(ctx BuildContext, expr Expression, tp *types.FieldType, inUnion bool, isExplicitCharSet bool) (res Expression, err error) {
23122331
argType := expr.GetType(ctx.GetEvalCtx())
23132332
// If source argument's nullable, then target type should be nullable
23142333
if !mysql.HasNotNullFlag(argType.GetFlag()) {
@@ -2336,7 +2355,7 @@ func BuildCastFunctionWithCheck(ctx BuildContext, expr Expression, tp *types.Fie
23362355
case types.ETVectorFloat32:
23372356
fc = &castAsVectorFloat32FunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp}
23382357
case types.ETString:
2339-
fc = &castAsStringFunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp}
2358+
fc = &castAsStringFunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp, isExplicitCharSet}
23402359
if expr.GetType(ctx.GetEvalCtx()).GetType() == mysql.TypeBit {
23412360
tp.SetFlen((expr.GetType(ctx.GetEvalCtx()).GetFlen() + 7) / 8)
23422361
}

pkg/expression/util.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ func ColumnSubstituteImpl(ctx BuildContext, expr Expression, schema *Schema, new
455455
flag := v.RetType.GetFlag()
456456
var e Expression
457457
if v.FuncName.L == ast.Cast {
458-
e = BuildCastFunction(ctx, newArg, v.RetType)
458+
e = BuildCastFunctionExplicitCharset(ctx, newArg, v.RetType)
459459
} else {
460460
// for grouping function recreation, use clone (meta included) instead of newFunction
461461
e = v.Clone()

pkg/planner/core/expression_rewriter.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1504,7 +1504,7 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok
15041504
return retNode, false
15051505
}
15061506

1507-
castFunction, err := expression.BuildCastFunctionWithCheck(er.sctx, arg, v.Tp, false)
1507+
castFunction, err := expression.BuildCastFunctionWithCheck(er.sctx, arg, v.Tp, false, v.ExplicitCharSet)
15081508
if err != nil {
15091509
er.err = err
15101510
return retNode, false

0 commit comments

Comments
 (0)