Skip to content

Commit cf0877b

Browse files
committed
Optimization: statements reuse previous column name
1 parent e4bc3f6 commit cf0877b

File tree

4 files changed

+22
-9
lines changed

4 files changed

+22
-9
lines changed

connection.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ func (mc *mysqlConn) Prepare(query string) (driver.Stmt, error) {
231231

232232
if columnCount > 0 {
233233
if mc.extCapabilities&clientCacheMetadata != 0 {
234-
if stmt.columns, err = mc.readColumns(int(columnCount)); err != nil {
234+
if stmt.columns, err = mc.readColumns(int(columnCount), nil); err != nil {
235235
return nil, err
236236
}
237237
} else {
@@ -448,7 +448,7 @@ func (mc *mysqlConn) query(query string, args []driver.Value) (*textRows, error)
448448
}
449449

450450
// Columns
451-
rows.rs.columns, err = mc.readColumns(resLen)
451+
rows.rs.columns, err = mc.readColumns(resLen, nil)
452452
return rows, err
453453
}
454454

packets.go

+16-3
Original file line numberDiff line numberDiff line change
@@ -702,8 +702,11 @@ func (mc *okHandler) handleOkPacket(data []byte) error {
702702

703703
// Read Packets as Field Packets until EOF-Packet or an Error appears
704704
// http://dev.mysql.com/doc/internals/en/com-query-response.html#packet-Protocol::ColumnDefinition41
705-
func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
705+
func (mc *mysqlConn) readColumns(count int, old []mysqlField) ([]mysqlField, error) {
706706
columns := make([]mysqlField, count)
707+
if len(old) != count {
708+
old = nil
709+
}
707710

708711
for i := range count {
709712
data, err := mc.readPacket()
@@ -731,7 +734,12 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
731734
return nil, err
732735
}
733736
pos += n
734-
columns[i].tableName = string(tableName)
737+
if old != nil && old[i].tableName == string(tableName) {
738+
// avoid allocating new string
739+
columns[i].tableName = old[i].tableName
740+
} else {
741+
columns[i].tableName = string(tableName)
742+
}
735743
} else {
736744
n, err = skipLengthEncodedString(data[pos:])
737745
if err != nil {
@@ -752,7 +760,12 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
752760
if err != nil {
753761
return nil, err
754762
}
755-
columns[i].name = string(name)
763+
if old != nil && old[i].name == string(name) {
764+
// avoid allocating new string
765+
columns[i].name = old[i].name
766+
} else {
767+
columns[i].name = string(name)
768+
}
756769
pos += n
757770

758771
// Original name [len coded string]

rows.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ func (rows *binaryRows) NextResultSet() error {
186186
return err
187187
}
188188

189-
rows.rs.columns, err = rows.mc.readColumns(resLen)
189+
rows.rs.columns, err = rows.mc.readColumns(resLen, nil)
190190
return err
191191
}
192192

@@ -208,7 +208,7 @@ func (rows *textRows) NextResultSet() (err error) {
208208
return err
209209
}
210210

211-
rows.rs.columns, err = rows.mc.readColumns(resLen)
211+
rows.rs.columns, err = rows.mc.readColumns(resLen, nil)
212212
return err
213213
}
214214

statement.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ func (stmt *mysqlStmt) Exec(args []driver.Value) (driver.Result, error) {
7474
// Columns
7575
if metadataFollows && stmt.mc.extCapabilities&clientCacheMetadata != 0 {
7676
// we can not skip column metadata because next stmt.Query() may use it.
77-
if stmt.columns, err = mc.readColumns(resLen); err != nil {
77+
if stmt.columns, err = mc.readColumns(resLen, stmt.columns); err != nil {
7878
return nil, err
7979
}
8080
} else {
@@ -125,7 +125,7 @@ func (stmt *mysqlStmt) query(args []driver.Value) (*binaryRows, error) {
125125
if resLen > 0 {
126126
rows.mc = mc
127127
if metadataFollows {
128-
if rows.rs.columns, err = mc.readColumns(resLen); err != nil {
128+
if rows.rs.columns, err = mc.readColumns(resLen, stmt.columns); err != nil {
129129
return nil, err
130130
}
131131
stmt.columns = rows.rs.columns

0 commit comments

Comments
 (0)