@@ -702,8 +702,11 @@ func (mc *okHandler) handleOkPacket(data []byte) error {
702
702
703
703
// Read Packets as Field Packets until EOF-Packet or an Error appears
704
704
// 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 ) {
706
706
columns := make ([]mysqlField , count )
707
+ if len (old ) != count {
708
+ old = nil
709
+ }
707
710
708
711
for i := range count {
709
712
data , err := mc .readPacket ()
@@ -731,7 +734,12 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
731
734
return nil , err
732
735
}
733
736
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
+ }
735
743
} else {
736
744
n , err = skipLengthEncodedString (data [pos :])
737
745
if err != nil {
@@ -752,7 +760,12 @@ func (mc *mysqlConn) readColumns(count int) ([]mysqlField, error) {
752
760
if err != nil {
753
761
return nil , err
754
762
}
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
+ }
756
769
pos += n
757
770
758
771
// Original name [len coded string]
0 commit comments