@@ -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]
0 commit comments