pingcap / tidb

TiDB is an open-source, cloud-native, distributed, MySQL-Compatible database for elastic scale and real-time analytics. Try AI-powered Chat2Query free at : https://www.pingcap.com/tidb-serverless/
https://pingcap.com
Apache License 2.0
36.94k stars 5.81k forks source link

Index out of range [1] with length 1 when using AES_DECRYPT #43063

Closed King-Dylan closed 1 year ago

King-Dylan commented 1 year ago

Bug Report

Index out of range [1] with length 1 when using AES_DECRYPT

1. Minimal reproduce step (Required)

create table test (name1 varchar(64),name2 varchar(64));
insert into test values('99FAFD8059A44BC14BCCC70154AC00F3','99FAFD8059A44BC14BCCC70154AC00F3');
SELECT * FROM test WHERE CAST(AES_DECRYPT(UNHEX(name1), 'r��Lu-t�AS�h)%R`') AS CHAR) = '00' AND CAST(AES_DECRYPT(UNHEX(name2), 'r��`') AS CHAR) = '1';

2. What did you expect to see? (Required)

No error

3. What did you see instead (Required)

ERROR 1105 (HY000): runtime error: index out of range [1] with length 1
github.com/pingcap/tidb/executor.(*recordSet).Next.func1
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/executor/adapter.go:149
runtime.gopanic
\t/usr/local/go/src/runtime/panic.go:884
runtime.goPanicIndex
\t/usr/local/go/src/runtime/panic.go:113
github.com/pingcap/tidb/util/chunk.(*Column).GetBytes
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/util/chunk/column.go:588
github.com/pingcap/tidb/expression.(*builtinAesDecryptSig).vecEvalString
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/builtin_encryption_vec.go:73
github.com/pingcap/tidb/expression.(*ScalarFunction).VecEvalString
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/scalar_function.go:58
github.com/pingcap/tidb/expression.(*builtinInternalFromBinarySig).vecEvalString
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/builtin_convert_charset.go:198
github.com/pingcap/tidb/expression.(*ScalarFunction).VecEvalString
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/scalar_function.go:58
github.com/pingcap/tidb/expression.(*builtinCastStringAsStringSig).vecEvalString
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/builtin_cast_vec.go:1895
github.com/pingcap/tidb/expression.(*ScalarFunction).VecEvalString
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/scalar_function.go:58
github.com/pingcap/tidb/expression.(*builtinEQStringSig).vecEvalInt
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/builtin_compare_vec_generated.go:1003
github.com/pingcap/tidb/expression.(*ScalarFunction).VecEvalInt
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/scalar_function.go:48
github.com/pingcap/tidb/expression.(*builtinLogicOrSig).vecEvalInt
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/builtin_op_vec.go:77
github.com/pingcap/tidb/expression.(*ScalarFunction).VecEvalInt
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/scalar_function.go:48
github.com/pingcap/tidb/expression.EvalExpr
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/expression.go:574
github.com/pingcap/tidb/expression.VecEvalBool
\t/home/jenkins/agent/workspace/build-common/go/src/github.com/pingcap/tidb/expression/expression.go:369

4. What is your TiDB version? (Required)

master

guo-shaoge commented 1 year ago

The first EQ expr filter all rows(Sel in Chunk is not nil, but length is zero, check here), but builtinAesDecrypt in the second EQ expr assume the result of its child result is not empty, and try to get the first byte of its child result(check here). So we got this panic.

guo-shaoge commented 1 year ago

You can disble vectorized expr(set @@tidb_enable_vectorized_expression = off) as a workround