Skip to content

Commit

Permalink
*: add encode SQL digest function (pingcap#43194)
Browse files Browse the repository at this point in the history
  • Loading branch information
jackysp authored May 16, 2023
1 parent 7a44294 commit 6dd84b6
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 1 deletion.
26 changes: 26 additions & 0 deletions executor/cluster_table_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,32 @@ func TestFunctionDecodeSQLDigestsPrivilege(t *testing.T) {
tk.MustExec("select tidb_decode_sql_digests('[\"aa\"]')")
}

func TestFunctionEncodeSQLDigest(t *testing.T) {
store, dom := testkit.CreateMockStoreAndDomain(t)
srv := createRPCServer(t, dom)
defer srv.Stop()

tk := testkit.NewTestKit(t, store)
tk.MustExec("use test")
require.NoError(t, tk.Session().Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil, nil))
tk.MustExec("drop table if exists test_func_encode_sql_digest")
tk.MustExec("create table test_func_encode_sql_digest(id int primary key, v int)")

q1 := "begin"
digest1 := parser.DigestHash(q1)
q2 := "select @@tidb_current_ts"
digest2 := parser.DigestHash(q2)
q3 := "select id, v from test_func_decode_sql_digests where id = 1 for update"
digest3 := parser.DigestHash(q3)

tk.MustQuery(fmt.Sprintf("select tidb_encode_sql_digest(\"%s\")", q1)).Check(testkit.Rows(digest1.String()))
tk.MustQuery(fmt.Sprintf("select tidb_encode_sql_digest(\"%s\")", q2)).Check(testkit.Rows(digest2.String()))
tk.MustQuery(fmt.Sprintf("select tidb_encode_sql_digest(\"%s\")", q3)).Check(testkit.Rows(digest3.String()))

tk.MustQuery("select tidb_encode_sql_digest(null)").Check(testkit.Rows("<nil>"))
tk.MustGetErrCode("select tidb_encode_sql_digest()", 1582)
}

func prepareLogs(t *testing.T, logData []string, fileNames []string) {
for i, log := range logData {
f, err := os.OpenFile(fileNames[i], os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
Expand Down
2 changes: 1 addition & 1 deletion executor/test/showtest/show_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1524,7 +1524,7 @@ func TestShowBuiltin(t *testing.T) {
res := tk.MustQuery("show builtins;")
require.NotNil(t, res)
rows := res.Rows()
const builtinFuncNum = 288
const builtinFuncNum = 289
require.Equal(t, builtinFuncNum, len(rows))
require.Equal(t, rows[0][0].(string), "abs")
require.Equal(t, rows[builtinFuncNum-1][0].(string), "yearweek")
Expand Down
1 change: 1 addition & 0 deletions expression/builtin.go
Original file line number Diff line number Diff line change
Expand Up @@ -903,6 +903,7 @@ var funcs = map[string]functionClass{
ast.TiDBDecodePlan: &tidbDecodePlanFunctionClass{baseFunctionClass{ast.TiDBDecodePlan, 1, 1}},
ast.TiDBDecodeBinaryPlan: &tidbDecodePlanFunctionClass{baseFunctionClass{ast.TiDBDecodeBinaryPlan, 1, 1}},
ast.TiDBDecodeSQLDigests: &tidbDecodeSQLDigestsFunctionClass{baseFunctionClass{ast.TiDBDecodeSQLDigests, 1, 2}},
ast.TiDBEncodeSQLDigest: &tidbEncodeSQLDigestFunctionClass{baseFunctionClass{ast.TiDBEncodeSQLDigest, 1, 1}},

// TiDB Sequence function.
ast.NextVal: &nextValFunctionClass{baseFunctionClass{ast.NextVal, 1, 1}},
Expand Down
40 changes: 40 additions & 0 deletions expression/builtin_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (
"time"

"github.com/pingcap/errors"
"github.com/pingcap/tidb/parser"
"github.com/pingcap/tidb/parser/ast"
"github.com/pingcap/tidb/parser/model"
"github.com/pingcap/tidb/parser/mysql"
Expand Down Expand Up @@ -964,6 +965,45 @@ func (b *builtinTiDBDecodeSQLDigestsSig) evalString(row chunk.Row) (string, bool
return string(resultStr), false, nil
}

type tidbEncodeSQLDigestFunctionClass struct {
baseFunctionClass
}

func (c *tidbEncodeSQLDigestFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) {
if err := c.verifyArgs(args); err != nil {
return nil, err
}

argTps := []types.EvalType{types.ETString}
bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETString, argTps...)
if err != nil {
return nil, err
}
sig := &builtinTiDBEncodeSQLDigestSig{bf}
return sig, nil
}

type builtinTiDBEncodeSQLDigestSig struct {
baseBuiltinFunc
}

func (b *builtinTiDBEncodeSQLDigestSig) Clone() builtinFunc {
newSig := &builtinTiDBEncodeSQLDigestSig{}
newSig.cloneFrom(&b.baseBuiltinFunc)
return newSig
}

func (b *builtinTiDBEncodeSQLDigestSig) evalString(row chunk.Row) (string, bool, error) {
orgSQLStr, isNull, err := b.getArgs()[0].EvalString(b.ctx, row)
if err != nil {
return "", true, err
}
if isNull {
return "", true, nil
}
return parser.DigestHash(orgSQLStr).String(), false, nil
}

type tidbDecodePlanFunctionClass struct {
baseFunctionClass
}
Expand Down
1 change: 1 addition & 0 deletions parser/ast/functions.go
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,7 @@ const (
TiDBDecodePlan = "tidb_decode_plan"
TiDBDecodeBinaryPlan = "tidb_decode_binary_plan"
TiDBDecodeSQLDigests = "tidb_decode_sql_digests"
TiDBEncodeSQLDigest = "tidb_encode_sql_digest"
FormatBytes = "format_bytes"
FormatNanoTime = "format_nano_time"
CurrentResourceGroup = "current_resource_group"
Expand Down

0 comments on commit 6dd84b6

Please sign in to comment.