@@ -21,6 +21,7 @@ import (
21
21
"sync"
22
22
23
23
"vitess.io/vitess/go/mysql"
24
+ "vitess.io/vitess/go/mysql/collations"
24
25
"vitess.io/vitess/go/sqltypes"
25
26
querypb "vitess.io/vitess/go/vt/proto/query"
26
27
"vitess.io/vitess/go/vt/sqlparser"
@@ -75,7 +76,7 @@ func (p *Projection) TryExecute(ctx context.Context, vcursor VCursor, bindVars m
75
76
resultRows = append (resultRows , resultRow )
76
77
}
77
78
if wantfields {
78
- result .Fields , err = p .evalFields (env , result .Fields )
79
+ result .Fields , err = p .evalFields (env , result .Fields , vcursor . ConnCollation () )
79
80
if err != nil {
80
81
return nil , err
81
82
}
@@ -96,7 +97,7 @@ func (p *Projection) TryStreamExecute(ctx context.Context, vcursor VCursor, bind
96
97
defer mu .Unlock ()
97
98
if wantfields {
98
99
once .Do (func () {
99
- fields , err = p .evalFields (env , qr .Fields )
100
+ fields , err = p .evalFields (env , qr .Fields , vcursor . ConnCollation () )
100
101
if err != nil {
101
102
return
102
103
}
@@ -135,14 +136,14 @@ func (p *Projection) GetFields(ctx context.Context, vcursor VCursor, bindVars ma
135
136
return nil , err
136
137
}
137
138
env := evalengine .NewExpressionEnv (ctx , bindVars , vcursor )
138
- qr .Fields , err = p .evalFields (env , qr .Fields )
139
+ qr .Fields , err = p .evalFields (env , qr .Fields , vcursor . ConnCollation () )
139
140
if err != nil {
140
141
return nil , err
141
142
}
142
143
return qr , nil
143
144
}
144
145
145
- func (p * Projection ) evalFields (env * evalengine.ExpressionEnv , infields []* querypb.Field ) ([]* querypb.Field , error ) {
146
+ func (p * Projection ) evalFields (env * evalengine.ExpressionEnv , infields []* querypb.Field , coll collations. ID ) ([]* querypb.Field , error ) {
146
147
// TODO: once the evalengine becomes smart enough, we should be able to remove the
147
148
// dependency on these fields altogether
148
149
env .Fields = infields
@@ -157,10 +158,15 @@ func (p *Projection) evalFields(env *evalengine.ExpressionEnv, infields []*query
157
158
if ! sqltypes .IsNull (typ .Type ()) && ! typ .Nullable () {
158
159
fl |= uint32 (querypb .MySqlFlag_NOT_NULL_FLAG )
159
160
}
161
+ typCol := typ .Collation ()
162
+ if sqltypes .IsTextOrBinary (typ .Type ()) && typCol != collations .CollationBinaryID {
163
+ typCol = coll
164
+ }
165
+
160
166
fields = append (fields , & querypb.Field {
161
167
Name : col ,
162
168
Type : typ .Type (),
163
- Charset : uint32 (typ . Collation () ),
169
+ Charset : uint32 (typCol ),
164
170
ColumnLength : uint32 (typ .Size ()),
165
171
Decimals : uint32 (typ .Scale ()),
166
172
Flags : fl ,
0 commit comments