Skip to content

Commit

Permalink
expression: handle ENUM in builtin function Values() (#9225) (#9280)
Browse files Browse the repository at this point in the history
  • Loading branch information
zz-jason authored Feb 12, 2019
1 parent d4f26b6 commit 58dacb6
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 14 deletions.
21 changes: 15 additions & 6 deletions expression/builtin_other.go
Original file line number Diff line number Diff line change
Expand Up @@ -615,13 +615,22 @@ func (b *builtinValuesStringSig) evalString(_ chunk.Row) (string, bool, error) {
if row.IsEmpty() {
return "", true, errors.New("Session current insert values is nil")
}
if b.offset < row.Len() {
if row.IsNull(b.offset) {
return "", true, nil
}
return row.GetString(b.offset), false, nil
if b.offset >= row.Len() {
return "", true, errors.Errorf("Session current insert values len %d and column's offset %v don't match", row.Len(), b.offset)
}
return "", true, errors.Errorf("Session current insert values len %d and column's offset %v don't match", row.Len(), b.offset)

if row.IsNull(b.offset) {
return "", true, nil
}

// Specially handle the ENUM/SET/BIT input value.
if retType := b.getRetTp(); retType.Hybrid() {
val := row.GetDatum(b.offset, retType)
res, err := val.ToString()
return res, err != nil, err
}

return row.GetString(b.offset), false, nil
}

type builtinValuesTimeSig struct {
Expand Down
12 changes: 4 additions & 8 deletions expression/column.go
Original file line number Diff line number Diff line change
Expand Up @@ -230,18 +230,14 @@ func (col *Column) EvalString(ctx sessionctx.Context, row chunk.Row) (string, bo
if row.IsNull(col.Index) {
return "", true, nil
}

// Specially handle the ENUM/SET/BIT input value.
if col.GetType().Hybrid() {
val := row.GetDatum(col.Index, col.RetType)
if val.IsNull() {
return "", true, nil
}
res, err := val.ToString()
resLen := len([]rune(res))
if ctx.GetSessionVars().StmtCtx.PadCharToFullLength && col.GetType().Tp == mysql.TypeString && resLen < col.RetType.Flen {
res = res + strings.Repeat(" ", col.RetType.Flen-resLen)
}
return res, err != nil, errors.Trace(err)
return res, err != nil, err
}

val := row.GetString(col.Index)
if ctx.GetSessionVars().StmtCtx.PadCharToFullLength && col.GetType().Tp == mysql.TypeString {
valLen := len([]rune(val))
Expand Down
11 changes: 11 additions & 0 deletions expression/integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3802,3 +3802,14 @@ func (s *testIntegrationSuite) TestValuesFloat32(c *C) {
tk.MustExec(`insert into t values (1, 0.02) on duplicate key update j = values (j);`)
tk.MustQuery(`select * from t;`).Check(testkit.Rows(`1 0.02`))
}

func (s *testIntegrationSuite) TestValuesEnum(c *C) {
tk := testkit.NewTestKit(c, s.store)
tk.MustExec("use test")
tk.MustExec(`drop table if exists t;`)
tk.MustExec(`create table t (a bigint primary key, b enum('a','b','c'));`)
tk.MustExec(`insert into t values (1, "a");`)
tk.MustQuery(`select * from t;`).Check(testkit.Rows(`1 a`))
tk.MustExec(`insert into t values (1, "b") on duplicate key update b = values(b);`)
tk.MustQuery(`select * from t;`).Check(testkit.Rows(`1 b`))
}

0 comments on commit 58dacb6

Please sign in to comment.