Skip to content

Instantly share code, notes, and snippets.

@lfkdsk
Created October 22, 2019 13:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lfkdsk/417b1e1971969be96856667f41d054ce to your computer and use it in GitHub Desktop.
Save lfkdsk/417b1e1971969be96856667f41d054ce to your computer and use it in GitHub Desktop.
udf test
type Fuck struct {
expression.BaseFunctionClass
}
func (c *Fuck) GetFunction(ctx sessionctx.Context, args []expression.Expression) (expression.BuiltinFunc, error) {
bf := expression.NewBaseBuiltinFuncWithTp(ctx, args, types.ETString, types.ETString)
argType := args[0].GetType()
bf.Tp.Flen = argType.Flen
expression.SetBinFlagOrBinStr(argType, bf.Tp)
sig := &BuiltinTrim1ArgSig{bf}
//sig.SetPbCode(ScalarFuncSig_Trim1Arg)
return sig, nil
}
type BuiltinTrim1ArgSig struct {
expression.BaseBuiltinFunc
}
func (b *BuiltinTrim1ArgSig) Clone() expression.BuiltinFunc {
newSig := &BuiltinTrim1ArgSig{}
newSig.CloneFrom(&b.BaseBuiltinFunc)
return newSig
}
const spaceChars = " "
// evalString evals a builtinTrim1ArgSig, corresponding to trim(str)
// See https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_trim
func (b *BuiltinTrim1ArgSig) evalString(row chunk.Row) (d string, isNull bool, err error) {
d, isNull, err = b.Args[0].EvalString(b.Ctx, row)
if isNull || err != nil {
return d, isNull, err
}
return strings.Trim(d, spaceChars), false, nil
}
func (s *testRangerSuite) TestUserDefineMethod(c *C) {
defer testleak.AfterTest(c)()
expression.AddUserDefinedFunction("fuck", &Fuck{expression.BaseFunctionClass{"fuck", 1, 1}})
dom, store, err := newDomainStoreWithBootstrap(c)
defer func() {
dom.Close()
store.Close()
}()
c.Assert(err, IsNil)
testKit := testkit.NewTestKit(c, store)
testKit.MustExec("use test")
testKit.MustExec("drop table if exists t")
testKit.MustExec("create table t(a int primary key, b int, c int, d int, e int, index idx(b,c,d))")
testKit.MustExec("insert into t values(1,1,1,1,2),(2,1,2,1,0)")
testKit.MustExec("analyze table t")
result := testKit.MustQuery(`select fuck(a) from t;`)
result.Check(testkit.Rows(`ffff`))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment