@@ -27,15 +27,14 @@ import (
27
27
28
28
"github.com/stretchr/testify/assert"
29
29
30
+ "vitess.io/vitess/go/mysql"
30
31
"vitess.io/vitess/go/mysql/collations"
31
-
32
32
"vitess.io/vitess/go/sqltypes"
33
- "vitess.io/vitess/go/vt/dbconfigs"
34
- "vitess.io/vitess/go/vt/sqlparser"
35
-
36
- "vitess.io/vitess/go/mysql"
37
33
"vitess.io/vitess/go/test/endtoend/cluster"
34
+ "vitess.io/vitess/go/vt/dbconfigs"
38
35
"vitess.io/vitess/go/vt/mysqlctl"
36
+ querypb "vitess.io/vitess/go/vt/proto/query"
37
+ "vitess.io/vitess/go/vt/sqlparser"
39
38
)
40
39
41
40
const mysqlShutdownTimeout = 1 * time .Minute
@@ -160,7 +159,9 @@ func prepareMySQLWithSchema(params mysql.ConnParams, sql string) error {
160
159
return nil
161
160
}
162
161
163
- func compareVitessAndMySQLResults (t * testing.T , query string , vtConn * mysql.Conn , vtQr , mysqlQr * sqltypes.Result , compareColumns bool ) error {
162
+ func compareVitessAndMySQLResults (t * testing.T , query string , vtConn * mysql.Conn , vtQr , mysqlQr * sqltypes.Result , compareColumnNames bool ) error {
163
+ t .Helper ()
164
+
164
165
if vtQr == nil && mysqlQr == nil {
165
166
return nil
166
167
}
@@ -173,28 +174,29 @@ func compareVitessAndMySQLResults(t *testing.T, query string, vtConn *mysql.Conn
173
174
return errors .New ("MySQL result is 'nil' while Vitess' is not.\n " )
174
175
}
175
176
176
- var errStr string
177
- if compareColumns {
178
- vtColCount := len ( vtQr . Fields )
179
- myColCount := len ( mysqlQr . Fields )
180
- if vtColCount > 0 && myColCount > 0 {
181
- if vtColCount != myColCount {
182
- t . Errorf ( "column count does not match: %d vs %d" , vtColCount , myColCount )
183
- errStr += fmt . Sprintf ( "column count does not match: %d vs %d \n " , vtColCount , myColCount )
184
- }
185
-
186
- var vtCols [] string
187
- var myCols [] string
188
- for i , vtField := range vtQr . Fields {
189
- vtCols = append ( vtCols , vtField . Name )
190
- myCols = append (myCols , mysqlQr . Fields [ i ] .Name )
191
- }
192
- if ! assert . Equal ( t , myCols , vtCols , "column names do not match - the expected values are what mysql produced" ) {
193
- errStr += "column names do not match - the expected values are what mysql produced \n "
194
- errStr += fmt . Sprintf ( "Not equal: \n expected: %v \n actual: %v \n " , myCols , vtCols )
195
- }
177
+ vtColCount := len ( vtQr . Fields )
178
+ myColCount := len ( mysqlQr . Fields )
179
+
180
+ if vtColCount != myColCount {
181
+ t . Errorf ( "column count does not match: %d vs %d" , vtColCount , myColCount )
182
+ }
183
+
184
+ if vtColCount > 0 {
185
+ var vtCols [] string
186
+ var myCols [] string
187
+ for i , vtField := range vtQr . Fields {
188
+ myField := mysqlQr . Fields [ i ]
189
+ checkFields ( t , myField . Name , vtField , myField )
190
+
191
+ vtCols = append (vtCols , vtField .Name )
192
+ myCols = append ( myCols , myField . Name )
193
+ }
194
+
195
+ if compareColumnNames && ! assert . Equal ( t , myCols , vtCols , "column names do not match - the expected values are what mysql produced" ) {
196
+ t . Errorf ( "column names do not match - the expected values are what mysql produced \n Not equal: \n expected: %v \n actual: %v \n " , myCols , vtCols )
196
197
}
197
198
}
199
+
198
200
stmt , err := sqlparser .NewTestParser ().Parse (query )
199
201
if err != nil {
200
202
t .Error (err )
@@ -209,7 +211,7 @@ func compareVitessAndMySQLResults(t *testing.T, query string, vtConn *mysql.Conn
209
211
return nil
210
212
}
211
213
212
- errStr + = "Query (" + query + ") results mismatched.\n Vitess Results:\n "
214
+ errStr : = "Query (" + query + ") results mismatched.\n Vitess Results:\n "
213
215
for _ , row := range vtQr .Rows {
214
216
errStr += fmt .Sprintf ("%s\n " , row )
215
217
}
@@ -229,6 +231,20 @@ func compareVitessAndMySQLResults(t *testing.T, query string, vtConn *mysql.Conn
229
231
return errors .New (errStr )
230
232
}
231
233
234
+ func checkFields (t * testing.T , columnName string , vtField , myField * querypb.Field ) {
235
+ t .Helper ()
236
+ if vtField .Type != myField .Type {
237
+ t .Errorf ("for column %s field types do not match\n Not equal: \n MySQL: %v\n Vitess: %v\n " , columnName , myField .Type .String (), vtField .Type .String ())
238
+ }
239
+
240
+ // starting in Vitess 20, decimal types are properly sized in their field information
241
+ if BinaryIsAtLeastAtVersion (20 , "vtgate" ) && vtField .Type == sqltypes .Decimal {
242
+ if vtField .Decimals != myField .Decimals {
243
+ t .Errorf ("for column %s field decimals count do not match\n Not equal: \n MySQL: %v\n Vitess: %v\n " , columnName , myField .Decimals , vtField .Decimals )
244
+ }
245
+ }
246
+ }
247
+
232
248
func compareVitessAndMySQLErrors (t * testing.T , vtErr , mysqlErr error ) {
233
249
if vtErr != nil && mysqlErr != nil || vtErr == nil && mysqlErr == nil {
234
250
return
0 commit comments