@@ -96,6 +96,10 @@ func deferredClose(err *error, closer io.Closer) {
96
96
func (mc * mysqlConn ) handleInFileRequest (name string ) (err error ) {
97
97
var rdr io.Reader
98
98
var data []byte
99
+ packetSize := 16 * 1024 // 16KB is small enough for disk readahead and large enough for TCP
100
+ if mc .maxWriteSize < packetSize {
101
+ packetSize = mc .maxWriteSize
102
+ }
99
103
100
104
if idx := strings .Index (name , "Reader::" ); idx == 0 || (idx > 0 && name [idx - 1 ] == '/' ) { // io.Reader
101
105
// The server might return an an absolute path. See issue #355.
@@ -108,8 +112,6 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) {
108
112
if inMap {
109
113
rdr = handler ()
110
114
if rdr != nil {
111
- data = make ([]byte , 4 + mc .maxWriteSize )
112
-
113
115
if cl , ok := rdr .(io.Closer ); ok {
114
116
defer deferredClose (& err , cl )
115
117
}
@@ -134,12 +136,8 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) {
134
136
// get file size
135
137
if fi , err = file .Stat (); err == nil {
136
138
rdr = file
137
- if fileSize := int (fi .Size ()); fileSize <= mc .maxWriteSize {
138
- data = make ([]byte , 4 + fileSize )
139
- } else if fileSize <= mc .maxPacketAllowed {
140
- data = make ([]byte , 4 + mc .maxWriteSize )
141
- } else {
142
- err = fmt .Errorf ("local file '%s' too large: size: %d, max: %d" , name , fileSize , mc .maxPacketAllowed )
139
+ if fileSize := int (fi .Size ()); fileSize < packetSize {
140
+ packetSize = fileSize
143
141
}
144
142
}
145
143
}
@@ -150,6 +148,7 @@ func (mc *mysqlConn) handleInFileRequest(name string) (err error) {
150
148
151
149
// send content packets
152
150
if err == nil {
151
+ data := make ([]byte , 4 + packetSize )
153
152
var n int
154
153
for err == nil {
155
154
n , err = rdr .Read (data [4 :])
0 commit comments