Skip to content

Commit 93df998

Browse files
authored
add String() for FieldValue (#825)
* add String() for FieldValue Signed-off-by: lance6716 <[email protected]> * fix lint Signed-off-by: lance6716 <[email protected]> * escape Signed-off-by: lance6716 <[email protected]> --------- Signed-off-by: lance6716 <[email protected]>
1 parent 14f1817 commit 93df998

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

client/client_test.go

+68
Original file line numberDiff line numberDiff line change
@@ -423,3 +423,71 @@ func (s *clientTestSuite) TestStmt_Trans() {
423423
str, _ = r.GetString(0, 0)
424424
require.Equal(s.T(), `abc`, str)
425425
}
426+
427+
func (s *clientTestSuite) TestFieldValueString() {
428+
_, err := s.c.Execute(
429+
`
430+
CREATE TABLE field_value_test (
431+
c_int int,
432+
c_bit bit(8),
433+
c_tinyint_u tinyint unsigned,
434+
c_decimal decimal(10, 5),
435+
c_float float(10),
436+
c_date date,
437+
c_datetime datetime(3),
438+
c_timestamp timestamp(4),
439+
c_time time(5),
440+
c_year year,
441+
c_char char(10),
442+
c_varchar varchar(10),
443+
c_binary binary(10),
444+
c_varbinary varbinary(10),
445+
c_blob blob,
446+
c_enum enum('a', 'b', 'c'),
447+
c_set set('a', 'b', 'c'),
448+
c_json json,
449+
c_null int
450+
)`)
451+
require.NoError(s.T(), err)
452+
s.T().Cleanup(func() {
453+
_, _ = s.c.Execute(
454+
`DROP TABLE field_value_test`)
455+
})
456+
457+
_, err = s.c.Execute(`
458+
INSERT INTO field_value_test VALUES (
459+
1, 2, 3, 4.5, 6.7,
460+
'2019-01-01', '2019-01-01 01:01:01.123', '2019-01-01 01:01:01.1234', '01:01:01.12345', 2019,
461+
'cha\'r', 'varchar', 'binary', 'varbinary', 'blob', 'a', 'a,b', '{"a": 1}',
462+
NULL
463+
)`)
464+
require.NoError(s.T(), err)
465+
466+
result, err := s.c.Execute(`SELECT * FROM field_value_test`)
467+
require.NoError(s.T(), err)
468+
require.Len(s.T(), result.Values, 1)
469+
expected := []string{
470+
`1`, "'\x02'", `3`, `'4.50000'`, `6.7`,
471+
`'2019-01-01'`, `'2019-01-01 01:01:01.123'`, `'2019-01-01 01:01:01.1234'`, `'01:01:01.12345'`, `2019`,
472+
`'cha\'r'`, `'varchar'`, "'binary\x00\x00\x00\x00'", `'varbinary'`, `'blob'`, `'a'`, `'a,b'`, `'{"a": 1}'`,
473+
`NULL`,
474+
}
475+
for i, v := range result.Values[0] {
476+
require.Equal(s.T(), expected[i], v.String())
477+
}
478+
479+
// test can directly use to build a SQL, though it's not safe in most cases
480+
sql := fmt.Sprintf("INSERT INTO field_value_test VALUES (%s)", strings.Join(expected, ","))
481+
_, err = s.c.Execute(sql)
482+
require.NoError(s.T(), err)
483+
result, err = s.c.Execute(`SELECT * FROM field_value_test`)
484+
require.NoError(s.T(), err)
485+
// check again, everything is same
486+
require.Len(s.T(), result.Values, 2)
487+
for i, v := range result.Values[0] {
488+
require.Equal(s.T(), expected[i], v.String())
489+
}
490+
for i, v := range result.Values[1] {
491+
require.Equal(s.T(), expected[i], v.String())
492+
}
493+
}

mysql/field.go

+31
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ package mysql
22

33
import (
44
"encoding/binary"
5+
"fmt"
6+
"strconv"
7+
"strings"
58

69
"github.com/go-mysql-org/go-mysql/utils"
710
)
@@ -210,3 +213,31 @@ func (fv *FieldValue) Value() interface{} {
210213
return nil
211214
}
212215
}
216+
217+
// String returns a MySQL literal string that equals the value.
218+
func (fv *FieldValue) String() string {
219+
switch fv.Type {
220+
case FieldValueTypeNull:
221+
return "NULL"
222+
case FieldValueTypeUnsigned:
223+
return strconv.FormatUint(fv.AsUint64(), 10)
224+
case FieldValueTypeSigned:
225+
return strconv.FormatInt(fv.AsInt64(), 10)
226+
case FieldValueTypeFloat:
227+
return strconv.FormatFloat(fv.AsFloat64(), 'f', -1, 64)
228+
case FieldValueTypeString:
229+
b := strings.Builder{}
230+
b.Grow(len(fv.str) + 2)
231+
b.WriteByte('\'')
232+
for i := range fv.str {
233+
if fv.str[i] == '\'' {
234+
b.WriteByte('\\')
235+
}
236+
b.WriteByte(fv.str[i])
237+
}
238+
b.WriteByte('\'')
239+
return b.String()
240+
default:
241+
return fmt.Sprintf("unknown type %d of FieldValue", fv.Type)
242+
}
243+
}

0 commit comments

Comments
 (0)