Skip to content

Commit

Permalink
expression: implement functionClass and builtinFunction for info func…
Browse files Browse the repository at this point in the history
…s. (pingcap#2385)
  • Loading branch information
hanfei1991 authored Jan 4, 2017
1 parent 65f1a0b commit 6d1df4f
Showing 1 changed file with 188 additions and 0 deletions.
188 changes: 188 additions & 0 deletions expression/builtin_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,50 @@ import (
"github.com/pingcap/tidb/util/types"
)

var (
_ functionClass = &databaseFunctionClass{}
_ functionClass = &foundRowsFunctionClass{}
_ functionClass = &currentUserFunctionClass{}
_ functionClass = &userFunctionClass{}
_ functionClass = &connectionIDFunctionClass{}
_ functionClass = &lastInsertIDFunctionClass{}
_ functionClass = &versionFunctionClass{}
)

var (
_ builtinFunc = &builtinDatabaseSig{}
_ builtinFunc = &builtinFoundRowsSig{}
_ builtinFunc = &builtinCurrentUserSig{}
_ builtinFunc = &builtinUserSig{}
_ builtinFunc = &builtinConnectionIDSig{}
_ builtinFunc = &builtinLastInsertIDSig{}
_ builtinFunc = &builtinVersionSig{}
)

type databaseFunctionClass struct {
baseFunctionClass
}

func (c *databaseFunctionClass) getFunction(args []Expression, ctx context.Context) (builtinFunc, error) {
return &builtinDatabaseSig{newBaseBuiltinFunc(args, ctx)}, errors.Trace(c.verifyArgs(args))
}

type builtinDatabaseSig struct {
baseBuiltinFunc
}

func (b *builtinDatabaseSig) eval(row []types.Datum) (types.Datum, error) {
args, err := b.evalArgs(row)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
return builtinDatabase(args, b.ctx)
}

func (b *builtinDatabaseSig) isDeterministic() bool {
return false
}

// See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html
func builtinDatabase(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
currentDB := ctx.GetSessionVars().CurrentDB
Expand All @@ -34,6 +78,30 @@ func builtinDatabase(args []types.Datum, ctx context.Context) (d types.Datum, er
return d, nil
}

type foundRowsFunctionClass struct {
baseFunctionClass
}

func (c *foundRowsFunctionClass) getFunction(args []Expression, ctx context.Context) (builtinFunc, error) {
return &builtinFoundRowsSig{newBaseBuiltinFunc(args, ctx)}, errors.Trace(c.verifyArgs(args))
}

type builtinFoundRowsSig struct {
baseBuiltinFunc
}

func (b *builtinFoundRowsSig) eval(row []types.Datum) (types.Datum, error) {
args, err := b.evalArgs(row)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
return builtinFoundRows(args, b.ctx)
}

func (b *builtinFoundRowsSig) isDeterministic() bool {
return false
}

func builtinFoundRows(arg []types.Datum, ctx context.Context) (d types.Datum, err error) {
data := ctx.GetSessionVars()
if data == nil {
Expand All @@ -44,6 +112,30 @@ func builtinFoundRows(arg []types.Datum, ctx context.Context) (d types.Datum, er
return d, nil
}

type currentUserFunctionClass struct {
baseFunctionClass
}

func (c *currentUserFunctionClass) getFunction(args []Expression, ctx context.Context) (builtinFunc, error) {
return &builtinCurrentUserSig{newBaseBuiltinFunc(args, ctx)}, errors.Trace(c.verifyArgs(args))
}

type builtinCurrentUserSig struct {
baseBuiltinFunc
}

func (b *builtinCurrentUserSig) eval(row []types.Datum) (types.Datum, error) {
args, err := b.evalArgs(row)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
return builtinCurrentUser(args, b.ctx)
}

func (b *builtinCurrentUserSig) isDeterministic() bool {
return false
}

// See https://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_current-user
// TODO: The value of CURRENT_USER() can differ from the value of USER(). We will finish this after we support grant tables.
func builtinCurrentUser(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
Expand All @@ -56,6 +148,30 @@ func builtinCurrentUser(args []types.Datum, ctx context.Context) (d types.Datum,
return d, nil
}

type userFunctionClass struct {
baseFunctionClass
}

func (c *userFunctionClass) getFunction(args []Expression, ctx context.Context) (builtinFunc, error) {
return &builtinUserSig{newBaseBuiltinFunc(args, ctx)}, errors.Trace(c.verifyArgs(args))
}

type builtinUserSig struct {
baseBuiltinFunc
}

func (b *builtinUserSig) eval(row []types.Datum) (types.Datum, error) {
args, err := b.evalArgs(row)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
return builtinUser(args, b.ctx)
}

func (b *builtinUserSig) isDeterministic() bool {
return false
}

func builtinUser(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
data := ctx.GetSessionVars()
if data == nil {
Expand All @@ -66,6 +182,30 @@ func builtinUser(args []types.Datum, ctx context.Context) (d types.Datum, err er
return d, nil
}

type connectionIDFunctionClass struct {
baseFunctionClass
}

func (c *connectionIDFunctionClass) getFunction(args []Expression, ctx context.Context) (builtinFunc, error) {
return &builtinConnectionIDSig{newBaseBuiltinFunc(args, ctx)}, errors.Trace(c.verifyArgs(args))
}

type builtinConnectionIDSig struct {
baseBuiltinFunc
}

func (b *builtinConnectionIDSig) eval(row []types.Datum) (types.Datum, error) {
args, err := b.evalArgs(row)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
return builtinConnectionID(args, b.ctx)
}

func (b *builtinConnectionIDSig) isDeterministic() bool {
return false
}

func builtinConnectionID(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
data := ctx.GetSessionVars()
if data == nil {
Expand All @@ -76,6 +216,30 @@ func builtinConnectionID(args []types.Datum, ctx context.Context) (d types.Datum
return d, nil
}

type lastInsertIDFunctionClass struct {
baseFunctionClass
}

func (c *lastInsertIDFunctionClass) getFunction(args []Expression, ctx context.Context) (builtinFunc, error) {
return &builtinLastInsertIDSig{newBaseBuiltinFunc(args, ctx)}, errors.Trace(c.verifyArgs(args))
}

type builtinLastInsertIDSig struct {
baseBuiltinFunc
}

func (b *builtinLastInsertIDSig) eval(row []types.Datum) (types.Datum, error) {
args, err := b.evalArgs(row)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
return builtinLastInsertID(args, b.ctx)
}

func (b *builtinLastInsertIDSig) isDeterministic() bool {
return false
}

// See http://dev.mysql.com/doc/refman/5.7/en/information-functions.html#function_last-insert-id
func builtinLastInsertID(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
if len(args) == 1 {
Expand All @@ -90,6 +254,30 @@ func builtinLastInsertID(args []types.Datum, ctx context.Context) (d types.Datum
return
}

type versionFunctionClass struct {
baseFunctionClass
}

func (c *versionFunctionClass) getFunction(args []Expression, ctx context.Context) (builtinFunc, error) {
return &builtinVersionSig{newBaseBuiltinFunc(args, ctx)}, errors.Trace(c.verifyArgs(args))
}

type builtinVersionSig struct {
baseBuiltinFunc
}

func (b *builtinVersionSig) eval(row []types.Datum) (types.Datum, error) {
args, err := b.evalArgs(row)
if err != nil {
return types.Datum{}, errors.Trace(err)
}
return builtinVersion(args, b.ctx)
}

func (b *builtinVersionSig) isDeterministic() bool {
return false
}

func builtinVersion(args []types.Datum, ctx context.Context) (d types.Datum, err error) {
d.SetString(mysql.ServerVersion)
return d, nil
Expand Down

0 comments on commit 6d1df4f

Please sign in to comment.