Skip to content

Commit 4dfdcfe

Browse files
committed
update
1 parent 406c84e commit 4dfdcfe

File tree

5 files changed

+74
-40
lines changed

5 files changed

+74
-40
lines changed

pkg/expression/builtin.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,47 @@ func newBaseBuiltinCastFunc(builtinFunc baseBuiltinFunc, inUnion bool) baseBuilt
464464
}
465465
}
466466

467+
// // baseBuiltinCastStringFunc will be used in every struct created by `castAsStringFunctionClass`.
468+
type baseBuiltinCastStringFunc struct {
469+
baseBuiltinFunc
470+
471+
// isExplicitCharSet indicates whether cast function set the charset info explicit.
472+
isExplicitCharSet bool
473+
}
474+
475+
func newBaseBuiltinCastStringFunc(ctx BuildContext, funcName string, args []Expression, tp *types.FieldType, isExplicitCharSet bool) (baseBuiltinCastStringFunc, error) {
476+
bf, err := newBaseBuiltinFunc(ctx, funcName, args, tp)
477+
if err != nil {
478+
return baseBuiltinCastStringFunc{}, err
479+
}
480+
if isExplicitCharSet {
481+
bf.SetCharsetAndCollation(tp.GetCharset(), tp.GetCollate())
482+
bf.setCollator(collate.GetCollator(tp.GetCollate()))
483+
bf.SetCoercibility(CoercibilityExplicit)
484+
if tp.GetCharset() == charset.CharsetASCII {
485+
bf.SetRepertoire(ASCII)
486+
} else {
487+
bf.SetRepertoire(UNICODE)
488+
}
489+
}
490+
return baseBuiltinCastStringFunc{
491+
baseBuiltinFunc: bf,
492+
isExplicitCharSet: isExplicitCharSet,
493+
}, nil
494+
}
495+
496+
func newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(builtinFunc baseBuiltinFunc, isExplicitCharSet bool) baseBuiltinCastStringFunc {
497+
return baseBuiltinCastStringFunc{
498+
baseBuiltinFunc: builtinFunc,
499+
isExplicitCharSet: isExplicitCharSet,
500+
}
501+
}
502+
503+
func (b *baseBuiltinCastStringFunc) cloneFrom(from *baseBuiltinCastStringFunc) {
504+
b.baseBuiltinFunc.cloneFrom(&from.baseBuiltinFunc)
505+
b.isExplicitCharSet = from.isExplicitCharSet
506+
}
507+
467508
// vecBuiltinFunc contains all vectorized methods for a builtin function.
468509
type vecBuiltinFunc interface {
469510
// vectorized returns if this builtin function itself supports vectorized evaluation.

pkg/expression/builtin_cast.go

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ 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"
4241
"github.com/pingcap/tipb/go-tipb"
4342
)
4443

@@ -297,20 +296,10 @@ func (c *castAsStringFunctionClass) getFunction(ctx BuildContext, args []Express
297296
if err := c.verifyArgs(args); err != nil {
298297
return nil, err
299298
}
300-
bf, err := newBaseBuiltinFunc(ctx, c.funcName, args, c.tp)
299+
bf, err := newBaseBuiltinCastStringFunc(ctx, c.funcName, args, c.tp, c.isExplicitCharSet)
301300
if err != nil {
302301
return nil, err
303302
}
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-
}
314303
if args[0].GetType(ctx.GetEvalCtx()).Hybrid() {
315304
sig = &builtinCastStringAsStringSig{bf}
316305
sig.setPbCode(tipb.ScalarFuncSig_CastStringAsString)
@@ -910,12 +899,12 @@ func (b *builtinCastIntAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row)
910899
}
911900

912901
type builtinCastIntAsStringSig struct {
913-
baseBuiltinFunc
902+
baseBuiltinCastStringFunc
914903
}
915904

916905
func (b *builtinCastIntAsStringSig) Clone() builtinFunc {
917906
newSig := &builtinCastIntAsStringSig{}
918-
newSig.cloneFrom(&b.baseBuiltinFunc)
907+
newSig.cloneFrom(&b.baseBuiltinCastStringFunc)
919908
return newSig
920909
}
921910

@@ -1227,12 +1216,12 @@ func (b *builtinCastRealAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row
12271216
}
12281217

12291218
type builtinCastRealAsStringSig struct {
1230-
baseBuiltinFunc
1219+
baseBuiltinCastStringFunc
12311220
}
12321221

12331222
func (b *builtinCastRealAsStringSig) Clone() builtinFunc {
12341223
newSig := &builtinCastRealAsStringSig{}
1235-
newSig.cloneFrom(&b.baseBuiltinFunc)
1224+
newSig.cloneFrom(&b.baseBuiltinCastStringFunc)
12361225
return newSig
12371226
}
12381227

@@ -1382,12 +1371,12 @@ func (b *builtinCastDecimalAsIntSig) evalInt(ctx EvalContext, row chunk.Row) (re
13821371
}
13831372

13841373
type builtinCastDecimalAsStringSig struct {
1385-
baseBuiltinFunc
1374+
baseBuiltinCastStringFunc
13861375
}
13871376

13881377
func (b *builtinCastDecimalAsStringSig) Clone() builtinFunc {
13891378
newSig := &builtinCastDecimalAsStringSig{}
1390-
newSig.cloneFrom(&b.baseBuiltinFunc)
1379+
newSig.cloneFrom(&b.baseBuiltinCastStringFunc)
13911380
return newSig
13921381
}
13931382

@@ -1492,12 +1481,12 @@ func (b *builtinCastDecimalAsDurationSig) evalDuration(ctx EvalContext, row chun
14921481
}
14931482

14941483
type builtinCastStringAsStringSig struct {
1495-
baseBuiltinFunc
1484+
baseBuiltinCastStringFunc
14961485
}
14971486

14981487
func (b *builtinCastStringAsStringSig) Clone() builtinFunc {
14991488
newSig := &builtinCastStringAsStringSig{}
1500-
newSig.cloneFrom(&b.baseBuiltinFunc)
1489+
newSig.cloneFrom(&b.baseBuiltinCastStringFunc)
15011490
return newSig
15021491
}
15031492

@@ -1809,12 +1798,12 @@ func (b *builtinCastTimeAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row
18091798
}
18101799

18111800
type builtinCastTimeAsStringSig struct {
1812-
baseBuiltinFunc
1801+
baseBuiltinCastStringFunc
18131802
}
18141803

18151804
func (b *builtinCastTimeAsStringSig) Clone() builtinFunc {
18161805
newSig := &builtinCastTimeAsStringSig{}
1817-
newSig.cloneFrom(&b.baseBuiltinFunc)
1806+
newSig.cloneFrom(&b.baseBuiltinCastStringFunc)
18181807
return newSig
18191808
}
18201809

@@ -1948,12 +1937,12 @@ func (b *builtinCastDurationAsDecimalSig) evalDecimal(ctx EvalContext, row chunk
19481937
}
19491938

19501939
type builtinCastDurationAsStringSig struct {
1951-
baseBuiltinFunc
1940+
baseBuiltinCastStringFunc
19521941
}
19531942

19541943
func (b *builtinCastDurationAsStringSig) Clone() builtinFunc {
19551944
newSig := &builtinCastDurationAsStringSig{}
1956-
newSig.cloneFrom(&b.baseBuiltinFunc)
1945+
newSig.cloneFrom(&b.baseBuiltinCastStringFunc)
19571946
return newSig
19581947
}
19591948

@@ -2090,12 +2079,12 @@ func (b *builtinCastJSONAsDecimalSig) evalDecimal(ctx EvalContext, row chunk.Row
20902079
}
20912080

20922081
type builtinCastJSONAsStringSig struct {
2093-
baseBuiltinFunc
2082+
baseBuiltinCastStringFunc
20942083
}
20952084

20962085
func (b *builtinCastJSONAsStringSig) Clone() builtinFunc {
20972086
newSig := &builtinCastJSONAsStringSig{}
2098-
newSig.cloneFrom(&b.baseBuiltinFunc)
2087+
newSig.cloneFrom(&b.baseBuiltinCastStringFunc)
20992088
return newSig
21002089
}
21012090

@@ -2112,12 +2101,12 @@ func (b *builtinCastJSONAsStringSig) evalString(ctx EvalContext, row chunk.Row)
21122101
}
21132102

21142103
type builtinCastVectorFloat32AsStringSig struct {
2115-
baseBuiltinFunc
2104+
baseBuiltinCastStringFunc
21162105
}
21172106

21182107
func (b *builtinCastVectorFloat32AsStringSig) Clone() builtinFunc {
21192108
newSig := &builtinCastVectorFloat32AsStringSig{}
2120-
newSig.cloneFrom(&b.baseBuiltinFunc)
2109+
newSig.cloneFrom(&b.baseBuiltinCastStringFunc)
21212110
return newSig
21222111
}
21232112

pkg/expression/builtin_cast_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ func TestCastFuncSig(t *testing.T) {
655655
tp := types.NewFieldType(mysql.TypeVarString)
656656
tp.SetCharset(charset.CharsetBin)
657657
args := []Expression{c.before}
658-
stringFunc, err := newBaseBuiltinFunc(ctx, "", args, tp)
658+
stringFunc, err := newBaseBuiltinCastStringFunc(ctx, "", args, tp, false)
659659
require.NoError(t, err)
660660
switch i {
661661
case 0:
@@ -742,7 +742,7 @@ func TestCastFuncSig(t *testing.T) {
742742
tp := types.NewFieldType(mysql.TypeVarString)
743743
tp.SetFlen(c.flen)
744744
tp.SetCharset(charset.CharsetBin)
745-
stringFunc, err := newBaseBuiltinFunc(ctx, "", args, tp)
745+
stringFunc, err := newBaseBuiltinCastStringFunc(ctx, "", args, tp, false)
746746
require.NoError(t, err)
747747
switch i {
748748
case 0:
@@ -1099,7 +1099,7 @@ func TestCastFuncSig(t *testing.T) {
10991099
// null case
11001100
args := []Expression{&Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0}}
11011101
row := chunk.MutRowFromDatums([]types.Datum{types.NewDatum(nil)})
1102-
bf, err := newBaseBuiltinFunc(ctx, "", args, types.NewFieldType(mysql.TypeVarString))
1102+
bf, err := newBaseBuiltinCastStringFunc(ctx, "", args, types.NewFieldType(mysql.TypeVarString), false)
11031103
require.NoError(t, err)
11041104
sig = &builtinCastRealAsStringSig{bf}
11051105
sRes, err := evalBuiltinFunc(sig, ctx, row.ToRow())

pkg/expression/distsql_builtin.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ func getSignatureByPB(ctx BuildContext, sigCode tipb.ScalarFuncSig, tp *tipb.Fie
4848
case tipb.ScalarFuncSig_CastIntAsReal:
4949
f = &builtinCastIntAsRealSig{newBaseBuiltinCastFunc(base, false)}
5050
case tipb.ScalarFuncSig_CastIntAsString:
51-
f = &builtinCastIntAsStringSig{base}
51+
f = &builtinCastIntAsStringSig{newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(base, false)}
5252
case tipb.ScalarFuncSig_CastIntAsDecimal:
5353
f = &builtinCastIntAsDecimalSig{newBaseBuiltinCastFunc(base, false)}
5454
case tipb.ScalarFuncSig_CastIntAsTime:
@@ -62,7 +62,7 @@ func getSignatureByPB(ctx BuildContext, sigCode tipb.ScalarFuncSig, tp *tipb.Fie
6262
case tipb.ScalarFuncSig_CastRealAsReal:
6363
f = &builtinCastRealAsRealSig{newBaseBuiltinCastFunc(base, false)}
6464
case tipb.ScalarFuncSig_CastRealAsString:
65-
f = &builtinCastRealAsStringSig{base}
65+
f = &builtinCastRealAsStringSig{newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(base, false)}
6666
case tipb.ScalarFuncSig_CastRealAsDecimal:
6767
f = &builtinCastRealAsDecimalSig{newBaseBuiltinCastFunc(base, false)}
6868
case tipb.ScalarFuncSig_CastRealAsTime:
@@ -76,7 +76,7 @@ func getSignatureByPB(ctx BuildContext, sigCode tipb.ScalarFuncSig, tp *tipb.Fie
7676
case tipb.ScalarFuncSig_CastDecimalAsReal:
7777
f = &builtinCastDecimalAsRealSig{newBaseBuiltinCastFunc(base, false)}
7878
case tipb.ScalarFuncSig_CastDecimalAsString:
79-
f = &builtinCastDecimalAsStringSig{base}
79+
f = &builtinCastDecimalAsStringSig{newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(base, false)}
8080
case tipb.ScalarFuncSig_CastDecimalAsDecimal:
8181
f = &builtinCastDecimalAsDecimalSig{newBaseBuiltinCastFunc(base, false)}
8282
case tipb.ScalarFuncSig_CastDecimalAsTime:
@@ -90,7 +90,7 @@ func getSignatureByPB(ctx BuildContext, sigCode tipb.ScalarFuncSig, tp *tipb.Fie
9090
case tipb.ScalarFuncSig_CastStringAsReal:
9191
f = &builtinCastStringAsRealSig{newBaseBuiltinCastFunc(base, false)}
9292
case tipb.ScalarFuncSig_CastStringAsString:
93-
f = &builtinCastStringAsStringSig{base}
93+
f = &builtinCastStringAsStringSig{newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(base, false)}
9494
case tipb.ScalarFuncSig_CastStringAsDecimal:
9595
f = &builtinCastStringAsDecimalSig{newBaseBuiltinCastFunc(base, false)}
9696
case tipb.ScalarFuncSig_CastStringAsTime:
@@ -104,7 +104,7 @@ func getSignatureByPB(ctx BuildContext, sigCode tipb.ScalarFuncSig, tp *tipb.Fie
104104
case tipb.ScalarFuncSig_CastTimeAsReal:
105105
f = &builtinCastTimeAsRealSig{newBaseBuiltinCastFunc(base, false)}
106106
case tipb.ScalarFuncSig_CastTimeAsString:
107-
f = &builtinCastTimeAsStringSig{base}
107+
f = &builtinCastTimeAsStringSig{newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(base, false)}
108108
case tipb.ScalarFuncSig_CastTimeAsDecimal:
109109
f = &builtinCastTimeAsDecimalSig{newBaseBuiltinCastFunc(base, false)}
110110
case tipb.ScalarFuncSig_CastTimeAsTime:
@@ -118,7 +118,7 @@ func getSignatureByPB(ctx BuildContext, sigCode tipb.ScalarFuncSig, tp *tipb.Fie
118118
case tipb.ScalarFuncSig_CastDurationAsReal:
119119
f = &builtinCastDurationAsRealSig{newBaseBuiltinCastFunc(base, false)}
120120
case tipb.ScalarFuncSig_CastDurationAsString:
121-
f = &builtinCastDurationAsStringSig{base}
121+
f = &builtinCastDurationAsStringSig{newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(base, false)}
122122
case tipb.ScalarFuncSig_CastDurationAsDecimal:
123123
f = &builtinCastDurationAsDecimalSig{newBaseBuiltinCastFunc(base, false)}
124124
case tipb.ScalarFuncSig_CastDurationAsTime:
@@ -132,7 +132,7 @@ func getSignatureByPB(ctx BuildContext, sigCode tipb.ScalarFuncSig, tp *tipb.Fie
132132
case tipb.ScalarFuncSig_CastJsonAsReal:
133133
f = &builtinCastJSONAsRealSig{newBaseBuiltinCastFunc(base, false)}
134134
case tipb.ScalarFuncSig_CastJsonAsString:
135-
f = &builtinCastJSONAsStringSig{base}
135+
f = &builtinCastJSONAsStringSig{newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(base, false)}
136136
case tipb.ScalarFuncSig_CastJsonAsDecimal:
137137
f = &builtinCastJSONAsDecimalSig{newBaseBuiltinCastFunc(base, false)}
138138
case tipb.ScalarFuncSig_CastJsonAsTime:
@@ -1077,7 +1077,7 @@ func getSignatureByPB(ctx BuildContext, sigCode tipb.ScalarFuncSig, tp *tipb.Fie
10771077
// TODO: set the `cannotConvertStringAsWarning` accordingly
10781078
f = &builtinInternalFromBinarySig{base, false}
10791079
case tipb.ScalarFuncSig_CastVectorFloat32AsString:
1080-
f = &builtinCastVectorFloat32AsStringSig{base}
1080+
f = &builtinCastVectorFloat32AsStringSig{newBaseBuiltinCastStringFuncFromBaseBuiltinFunc(base, false)}
10811081
case tipb.ScalarFuncSig_CastVectorFloat32AsVectorFloat32:
10821082
f = &builtinCastVectorFloat32AsVectorFloat32Sig{base}
10831083
case tipb.ScalarFuncSig_LTVectorFloat32:

pkg/expression/util.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,11 @@ 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 = BuildCastFunctionExplicitCharset(ctx, newArg, v.RetType)
458+
if f, ok := v.Function.(*baseBuiltinCastStringFunc); ok && f.isExplicitCharSet {
459+
e = BuildCastFunctionExplicitCharset(ctx, newArg, v.RetType)
460+
} else {
461+
e = BuildCastFunction(ctx, newArg, v.RetType)
462+
}
459463
} else {
460464
// for grouping function recreation, use clone (meta included) instead of newFunction
461465
e = v.Clone()

0 commit comments

Comments
 (0)