Skip to content

Commit 3661f81

Browse files
committed
Merge branch 'master' of github.com:go-sql-driver/mysql
2 parents 299afd7 + 527bcd5 commit 3661f81

File tree

7 files changed

+43
-7
lines changed

7 files changed

+43
-7
lines changed

AUTHORS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ Michael Woolnough <michael.woolnough at gmail.com>
3333
Nicola Peduzzi <thenikso at gmail.com>
3434
Runrioter Wung <runrioter at gmail.com>
3535
Soroush Pour <me at soroushjp.com>
36+
Stan Putrya <root.vagner at gmail.com>
3637
Xiaobing Jiang <s7v7nislands at gmail.com>
3738
Xiuming Chen <cc at cxm.cc>
3839

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ A MySQL-Driver for Go's [database/sql](http://golang.org/pkg/database/sql) packa
3030
## Features
3131
* Lightweight and [fast](https://github.com/go-sql-driver/sql-benchmark "golang MySQL-Driver performance")
3232
* Native Go implementation. No C-bindings, just pure Go
33-
* Connections over TCP/IPv4, TCP/IPv6 or Unix domain sockets
33+
* Connections over TCP/IPv4, TCP/IPv6, Unix domain sockets or [custom protocols](http://godoc.org/github.com/go-sql-driver/mysql#DialFunc)
3434
* Automatic handling of broken connections
3535
* Automatic Connection Pooling *(by database/sql package)*
3636
* Supports queries larger than 16MB

driver_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,6 +1246,30 @@ func TestCollation(t *testing.T) {
12461246
}
12471247
}
12481248

1249+
func TestColumnsWithAlias(t *testing.T) {
1250+
runTests(t, dsn+"&columnsWithAlias=true", func(dbt *DBTest) {
1251+
rows := dbt.mustQuery("SELECT 1 AS A")
1252+
defer rows.Close()
1253+
cols, _ := rows.Columns()
1254+
if len(cols) != 1 {
1255+
t.Fatalf("expected 1 column, got %d", len(cols))
1256+
}
1257+
if cols[0] != "A" {
1258+
t.Fatalf("expected column name \"A\", got \"%s\"", cols[0])
1259+
}
1260+
rows.Close()
1261+
1262+
rows = dbt.mustQuery("SELECT * FROM (SELECT 1 AS one) AS A")
1263+
cols, _ = rows.Columns()
1264+
if len(cols) != 1 {
1265+
t.Fatalf("expected 1 column, got %d", len(cols))
1266+
}
1267+
if cols[0] != "A.one" {
1268+
t.Fatalf("expected column name \"A.one\", got \"%s\"", cols[0])
1269+
}
1270+
})
1271+
}
1272+
12491273
func TestRawBytesResultExceedsBuffer(t *testing.T) {
12501274
runTests(t, dsn, func(dbt *DBTest) {
12511275
// defaultBufSize from buffer.go

infile.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,10 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) {
8686
var rdr io.Reader
8787
var data []byte
8888

89-
if strings.HasPrefix(name, "Reader::") { // io.Reader
90-
name = name[8:]
89+
if idx := strings.Index(name, "Reader::"); idx == 0 || (idx > 0 && name[idx-1] == '/') { // io.Reader
90+
// The server might return an an absolute path. See issue #355.
91+
name = name[idx+8:]
92+
9193
if handler, inMap := readerRegister[name]; inMap {
9294
rdr = handler()
9395
if rdr != nil {

rows.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,11 @@ func (rows *mysqlRows) Columns() []string {
4040
columns := make([]string, len(rows.columns))
4141
if rows.mc.cfg.columnsWithAlias {
4242
for i := range columns {
43-
columns[i] = rows.columns[i].tableName + "." + rows.columns[i].name
43+
if tableName := rows.columns[i].tableName; len(tableName) > 0 {
44+
columns[i] = tableName + "." + rows.columns[i].name
45+
} else {
46+
columns[i] = rows.columns[i].name
47+
}
4448
}
4549
} else {
4650
for i := range columns {

statement.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"database/sql/driver"
1313
"fmt"
1414
"reflect"
15+
"strconv"
1516
)
1617

1718
type mysqlStmt struct {
@@ -119,7 +120,7 @@ func (stmt *mysqlStmt) Query(args []driver.Value) (driver.Rows, error) {
119120

120121
type converter struct{}
121122

122-
func (converter) ConvertValue(v interface{}) (driver.Value, error) {
123+
func (c converter) ConvertValue(v interface{}) (driver.Value, error) {
123124
if driver.IsValue(v) {
124125
return v, nil
125126
}
@@ -131,15 +132,15 @@ func (converter) ConvertValue(v interface{}) (driver.Value, error) {
131132
if rv.IsNil() {
132133
return nil, nil
133134
}
134-
return driver.DefaultParameterConverter.ConvertValue(rv.Elem().Interface())
135+
return c.ConvertValue(rv.Elem().Interface())
135136
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
136137
return rv.Int(), nil
137138
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32:
138139
return int64(rv.Uint()), nil
139140
case reflect.Uint64:
140141
u64 := rv.Uint()
141142
if u64 >= 1<<63 {
142-
return fmt.Sprintf("%d", u64), nil
143+
return strconv.FormatUint(u64, 10), nil
143144
}
144145
return int64(u64), nil
145146
case reflect.Float32, reflect.Float64:

utils.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,10 @@ func skipLengthEncodedString(b []byte) (int, error) {
777777

778778
// returns the number read, whether the value is NULL and the number of bytes read
779779
func readLengthEncodedInteger(b []byte) (uint64, bool, int) {
780+
// See issue #349
781+
if len(b) == 0 {
782+
return 0, true, 1
783+
}
780784
switch b[0] {
781785

782786
// 251: NULL

0 commit comments

Comments
 (0)