@@ -17,6 +17,7 @@ package enginetest
1717import (
1818 "context"
1919 "fmt"
20+ "io"
2021 "net"
2122 "strings"
2223 "testing"
@@ -5392,6 +5393,115 @@ func TestPrepared(t *testing.T, harness Harness) {
53925393 }
53935394}
53945395
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+
53955505type memoryPersister struct {
53965506 users []* mysql_db.User
53975507 roles []* mysql_db.RoleEdge
0 commit comments