Skip to content

Commit

Permalink
refine tidb cast binary to json
Browse files Browse the repository at this point in the history
Signed-off-by: Yang Keao <yangkeao@chunibyo.icu>
  • Loading branch information
YangKeao committed Mar 7, 2024
1 parent 87bcf32 commit 3ad06e0
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 2 deletions.
2 changes: 1 addition & 1 deletion pkg/expression/builtin_cast.go
Expand Up @@ -878,7 +878,7 @@ func (b *builtinCastStringAsJSONSig) evalJSON(ctx EvalContext, row chunk.Row) (r
typ := b.args[0].GetType()
if types.IsBinaryStr(typ) {
buf := []byte(val)
if typ.GetType() == mysql.TypeString {
if typ.GetType() == mysql.TypeString && typ.GetFlen() > 0 {
// the tailing zero should also be in the opaque json
buf = make([]byte, typ.GetFlen())
copy(buf, val)
Expand Down
2 changes: 1 addition & 1 deletion pkg/expression/builtin_cast_vec.go
Expand Up @@ -853,7 +853,7 @@ func (b *builtinCastStringAsJSONSig) vecEvalJSON(ctx EvalContext, input *chunk.C

val := buf.GetBytes(i)
resultBuf := val
if typ.GetType() == mysql.TypeString {
if typ.GetType() == mysql.TypeString && typ.GetFlen() > 0 {
// only for BINARY: the tailing zero should also be in the opaque json
resultBuf = make([]byte, typ.GetFlen())
copy(resultBuf, val)
Expand Down
21 changes: 21 additions & 0 deletions tests/integrationtest/r/expression/json.result
Expand Up @@ -628,3 +628,24 @@ a cast(a as signed)
"-1" -1
"18446744073709551615" -1
"18446744073709552000" -1
select cast(binary 'aa' as json);
cast(binary 'aa' as json)
"base64:type254:YWE="
drop table if exists t;
create table t (vb VARBINARY(10), b BINARY(10), vc VARCHAR(10), c CHAR(10));
insert into t values ('1', '1', '1', '1');
select cast(vb as json), cast(b as json), cast(vc as json), cast(c as json) from t;
cast(vb as json) cast(b as json) cast(vc as json) cast(c as json)
"base64:type15:MQ==" "base64:type254:MQAAAAAAAAAAAA==" 1 1
select 1 as data from t where cast(vb as json) = '1';
data
select 1 as data from t where cast(b as json) = '1';
data
select 1 as data from t where cast(vc as json) = '1';
data
select 1 as data from t where cast(c as json) = '1';
data
select 1 as data from t where cast(BINARY vc as json) = '1';
data
select 1 as data from t where cast(BINARY c as json) = '1';
data
13 changes: 13 additions & 0 deletions tests/integrationtest/t/expression/json.test
Expand Up @@ -380,3 +380,16 @@ insert into t values ('"18446744073709552000"');
select a, cast(a as unsigned) from t;
-- sorted_result
select a, cast(a as signed) from t;

# TestCastBinaryStringToJSON
select cast(binary 'aa' as json);
drop table if exists t;
create table t (vb VARBINARY(10), b BINARY(10), vc VARCHAR(10), c CHAR(10));
insert into t values ('1', '1', '1', '1');
select cast(vb as json), cast(b as json), cast(vc as json), cast(c as json) from t;
select 1 from t where cast(vb as json) = '1';
select 1 from t where cast(b as json) = '1';
select 1 from t where cast(vc as json) = '1';
select 1 from t where cast(c as json) = '1';
select 1 from t where cast(BINARY vc as json) = '1';
select 1 from t where cast(BINARY c as json) = '1';

0 comments on commit 3ad06e0

Please sign in to comment.