@@ -17,6 +17,7 @@ package enginetest
17
17
import (
18
18
"context"
19
19
"fmt"
20
+ "io"
20
21
"net"
21
22
"strings"
22
23
"testing"
@@ -5392,6 +5393,115 @@ func TestPrepared(t *testing.T, harness Harness) {
5392
5393
}
5393
5394
}
5394
5395
5396
+ func TestTypesOverWire (t * testing.T , h Harness , sessionBuilder server.SessionBuilder ) {
5397
+ harness , ok := h .(ClientHarness )
5398
+ if ! ok {
5399
+ t .Skip ("Cannot run TestTypesOverWire as the harness must implement ClientHarness" )
5400
+ }
5401
+ harness .Setup (setup .MydbData )
5402
+
5403
+ port := getEmptyPort (t )
5404
+ for _ , script := range queries .TypeWireTests {
5405
+ t .Run (script .Name , func (t * testing.T ) {
5406
+ ctx := NewContextWithClient (harness , sql.Client {
5407
+ User : "root" ,
5408
+ Address : "localhost" ,
5409
+ })
5410
+ serverConfig := server.Config {
5411
+ Protocol : "tcp" ,
5412
+ Address : fmt .Sprintf ("localhost:%d" , port ),
5413
+ MaxConnections : 1000 ,
5414
+ }
5415
+
5416
+ engine := mustNewEngine (t , harness )
5417
+ defer engine .Close ()
5418
+ engine .Analyzer .Catalog .MySQLDb .AddRootAccount ()
5419
+ for _ , statement := range script .SetUpScript {
5420
+ if sh , ok := harness .(SkippingHarness ); ok {
5421
+ if sh .SkipQueryTest (statement ) {
5422
+ t .Skip ()
5423
+ }
5424
+ }
5425
+ RunQueryWithContext (t , engine , harness , ctx , statement )
5426
+ }
5427
+
5428
+ s , err := server .NewServer (serverConfig , engine , sessionBuilder , nil )
5429
+ require .NoError (t , err )
5430
+ go func () {
5431
+ err := s .Start ()
5432
+ require .NoError (t , err )
5433
+ }()
5434
+ defer func () {
5435
+ require .NoError (t , s .Close ())
5436
+ }()
5437
+
5438
+ conn , err := dbr .Open ("mysql" , fmt .Sprintf ("root:@tcp(localhost:%d)/" , port ), nil )
5439
+ require .NoError (t , err )
5440
+ _ , err = conn .Exec ("USE mydb;" )
5441
+ require .NoError (t , err )
5442
+ for queryIdx , query := range script .Queries {
5443
+ r , err := conn .Query (query )
5444
+ if assert .NoError (t , err ) {
5445
+ sch , engineIter , err := engine .Query (ctx , query )
5446
+ require .NoError (t , err )
5447
+ expectedRowSet := script .Results [queryIdx ]
5448
+ expectedRowIdx := 0
5449
+ var engineRow sql.Row
5450
+ for engineRow , err = engineIter .Next (ctx ); err == nil ; engineRow , err = engineIter .Next (ctx ) {
5451
+ if ! assert .True (t , r .Next ()) {
5452
+ break
5453
+ }
5454
+ expectedRow := expectedRowSet [expectedRowIdx ]
5455
+ expectedRowIdx ++
5456
+ connRow := make ([]* string , len (engineRow ))
5457
+ interfaceRow := make ([]any , len (connRow ))
5458
+ for i := range connRow {
5459
+ interfaceRow [i ] = & connRow [i ]
5460
+ }
5461
+ err = r .Scan (interfaceRow ... )
5462
+ if ! assert .NoError (t , err ) {
5463
+ break
5464
+ }
5465
+ expectedEngineRow := make ([]* string , len (engineRow ))
5466
+ for i := range engineRow {
5467
+ sqlVal , err := sch [i ].Type .SQL (nil , engineRow [i ])
5468
+ if ! assert .NoError (t , err ) {
5469
+ break
5470
+ }
5471
+ if ! sqlVal .IsNull () {
5472
+ str := sqlVal .ToString ()
5473
+ expectedEngineRow [i ] = & str
5474
+ }
5475
+ }
5476
+
5477
+ for i := range expectedEngineRow {
5478
+ expectedVal := expectedEngineRow [i ]
5479
+ connVal := connRow [i ]
5480
+ if ! assert .Equal (t , expectedVal == nil , connVal == nil ) {
5481
+ continue
5482
+ }
5483
+ if expectedVal != nil {
5484
+ assert .Equal (t , * expectedVal , * connVal )
5485
+ if script .Name == "JSON" {
5486
+ // Different integrators may return their JSON strings with different spacing, so we
5487
+ // special case the test since the spacing is not significant
5488
+ * connVal = strings .Replace (* connVal , `, ` , `,` , - 1 )
5489
+ * connVal = strings .Replace (* connVal , `: "` , `:"` , - 1 )
5490
+ }
5491
+ assert .Equal (t , expectedRow [i ], * connVal )
5492
+ }
5493
+ }
5494
+ }
5495
+ assert .True (t , err == io .EOF )
5496
+ assert .False (t , r .Next ())
5497
+ require .NoError (t , r .Close ())
5498
+ }
5499
+ }
5500
+ require .NoError (t , conn .Close ())
5501
+ })
5502
+ }
5503
+ }
5504
+
5395
5505
type memoryPersister struct {
5396
5506
users []* mysql_db.User
5397
5507
roles []* mysql_db.RoleEdge
0 commit comments