Skip to content

Commit 8e04ca9

Browse files
committed
Merge branch 'main' into jennifer/tbl-func-wrapper
2 parents 18f9e2b + b961afb commit 8e04ca9

17 files changed

+198
-92
lines changed

_example/main_test.go

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ package main
1717
import (
1818
"database/sql"
1919
"fmt"
20-
"net"
2120
"testing"
2221

2322
_ "github.com/go-sql-driver/mysql"
2423
"github.com/gocraft/dbr/v2"
2524
"github.com/stretchr/testify/assert"
2625
"github.com/stretchr/testify/require"
26+
27+
gms "github.com/dolthub/go-mysql-server/sql"
2728
)
2829

2930
var expectedResults = [][]string{
@@ -35,7 +36,8 @@ var expectedResults = [][]string{
3536

3637
func TestExampleUsersDisabled(t *testing.T) {
3738
enableUsers = false
38-
useUnusedPort(t)
39+
_, err := gms.GetEmptyPort()
40+
require.NoError(t, err)
3941
go func() {
4042
main()
4143
}()
@@ -53,7 +55,8 @@ func TestExampleUsersDisabled(t *testing.T) {
5355
func TestExampleRootUserEnabled(t *testing.T) {
5456
enableUsers = true
5557
pretendThatFileExists = false
56-
useUnusedPort(t)
58+
_, err := gms.GetEmptyPort()
59+
require.NoError(t, err)
5760
go func() {
5861
main()
5962
}()
@@ -74,7 +77,8 @@ func TestExampleRootUserEnabled(t *testing.T) {
7477
func TestExampleLoadedUser(t *testing.T) {
7578
enableUsers = true
7679
pretendThatFileExists = true
77-
useUnusedPort(t)
80+
_, err := gms.GetEmptyPort()
81+
require.NoError(t, err)
7882
go func() {
7983
main()
8084
}()
@@ -99,7 +103,8 @@ func TestExampleLoadedUser(t *testing.T) {
99103
func TestIssue1621(t *testing.T) {
100104
// This is an issue that is specific to using the example server, as this is not a logic issue but a setup issue
101105
enableUsers = true
102-
useUnusedPort(t)
106+
_, err := gms.GetEmptyPort()
107+
require.NoError(t, err)
103108
go func() {
104109
main()
105110
}()
@@ -141,11 +146,3 @@ func checkRows(t *testing.T, expectedRows [][]string, actualRows *sql.Rows) {
141146
}
142147
assert.NoError(t, actualRows.Close())
143148
}
144-
145-
func useUnusedPort(t *testing.T) {
146-
// Tests should grab an open port, otherwise they'll fail if some hardcoded port is already in use
147-
listener, err := net.Listen("tcp", ":0")
148-
require.NoError(t, err)
149-
port = listener.Addr().(*net.TCPAddr).Port
150-
require.NoError(t, listener.Close())
151-
}

enginetest/engine_only_test.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
sql2 "database/sql"
2020
"fmt"
2121
"io"
22-
"net"
2322
"runtime"
2423
"strings"
2524
"testing"
@@ -1051,7 +1050,7 @@ func TestAlterTableWithBadSchema(t *testing.T) {
10511050
ctx := harness.NewContext()
10521051
ctx.SetCurrentDatabase("mydb")
10531052
_, iter, _, err := engine.Query(ctx, tt.q)
1054-
// errors should be analyze time, not execution time
1053+
// errors should analyze time, not execution time
10551054
if tt.err {
10561055
require.Error(t, err)
10571056
} else {
@@ -1065,14 +1064,10 @@ func TestAlterTableWithBadSchema(t *testing.T) {
10651064

10661065
func newDatabase() (*sql2.DB, func()) {
10671066
// Grab an empty port so that tests do not fail if a specific port is already in use
1068-
listener, err := net.Listen("tcp", ":0")
1067+
port, err := sql.GetEmptyPort()
10691068
if err != nil {
10701069
panic(err)
10711070
}
1072-
port := listener.Addr().(*net.TCPAddr).Port
1073-
if err = listener.Close(); err != nil {
1074-
panic(err)
1075-
}
10761071

10771072
harness := enginetest.NewDefaultMemoryHarness()
10781073
pro := harness.Provider()

enginetest/enginetests.go

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
dsql "database/sql"
2121
"fmt"
2222
"io"
23-
"net"
2423
"os"
2524
"reflect"
2625
"strings"
@@ -2144,7 +2143,8 @@ func TestUserAuthentication(t *testing.T, h Harness) {
21442143
}
21452144
clientHarness.Setup(setup.MydbData, setup.MytableData)
21462145

2147-
port := getEmptyPort(t)
2146+
port, err := sql.GetEmptyPort()
2147+
require.NoError(t, err)
21482148
for _, script := range queries.ServerAuthTests {
21492149
t.Run(script.Name, func(t *testing.T) {
21502150
ctx := NewContextWithClient(clientHarness, sql.Client{
@@ -2240,14 +2240,6 @@ func TestUserAuthentication(t *testing.T, h Harness) {
22402240
}
22412241
}
22422242

2243-
func getEmptyPort(t *testing.T) int {
2244-
listener, err := net.Listen("tcp", ":0")
2245-
require.NoError(t, err)
2246-
port := listener.Addr().(*net.TCPAddr).Port
2247-
require.NoError(t, listener.Close())
2248-
return port
2249-
}
2250-
22512243
func TestComplexIndexQueries(t *testing.T, harness Harness) {
22522244
harness.Setup(setup.ComplexIndexSetup...)
22532245
e := mustNewEngine(t, harness)
@@ -5725,7 +5717,8 @@ func testCharsetCollationWire(t *testing.T, h Harness, sessionBuilder server.Ses
57255717
harness.Setup(setup.MydbData)
57265718
}
57275719

5728-
port := getEmptyPort(t)
5720+
port, err := sql.GetEmptyPort()
5721+
require.NoError(t, err)
57295722
for _, script := range tests {
57305723
t.Run(script.Name, func(t *testing.T) {
57315724
serverConfig := server.Config{
@@ -5829,7 +5822,8 @@ func extractCollationIdForField(r *dsql.Rows, i int) uint64 {
58295822
func TestTypesOverWire(t *testing.T, harness ClientHarness, sessionBuilder server.SessionBuilder) {
58305823
harness.Setup(setup.MydbData)
58315824

5832-
port := getEmptyPort(t)
5825+
port, err := sql.GetEmptyPort()
5826+
require.NoError(t, err)
58335827
for _, script := range queries.TypeWireTests {
58345828
t.Run(script.Name, func(t *testing.T) {
58355829
e := mustNewEngine(t, harness)

enginetest/queries/variable_queries.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,6 @@ import (
2222
)
2323

2424
var VariableQueries = []ScriptTest{
25-
{
26-
Name: "use string name for foreign_key checks",
27-
SetUpScript: []string{},
28-
Query: "select @@GLOBAL.unknown",
29-
ExpectedErr: sql.ErrUnknownSystemVariable,
30-
},
3125
{
3226
Name: "use string name for foreign_key checks",
3327
SetUpScript: []string{},
@@ -649,6 +643,10 @@ var VariableQueries = []ScriptTest{
649643
}
650644

651645
var VariableErrorTests = []QueryErrorTest{
646+
{
647+
Query: "select @@GLOBAL.unknown",
648+
ExpectedErr: sql.ErrUnknownSystemVariable,
649+
},
652650
{
653651
Query: "set @@does_not_exist = 100",
654652
ExpectedErr: sql.ErrUnknownSystemVariable,

enginetest/server_engine.go

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"errors"
2121
"fmt"
2222
"io"
23-
"net"
2423
"strconv"
2524
"strings"
2625
"testing"
@@ -61,7 +60,7 @@ func NewServerQueryEngine(t *testing.T, engine *sqle.Engine, builder server.Sess
6160
panic(err)
6261
}
6362

64-
p, err := findEmptyPort()
63+
p, err := sql.GetEmptyPort()
6564
if err != nil {
6665
return nil, err
6766
}
@@ -708,19 +707,6 @@ func prepareBindingArgs(ctx *sql.Context, bindings map[string]sqlparser.Expr) ([
708707
return args, nil
709708
}
710709

711-
func findEmptyPort() (int, error) {
712-
listener, err := net.Listen("tcp", ":0")
713-
if err != nil {
714-
return -1, err
715-
}
716-
port := listener.Addr().(*net.TCPAddr).Port
717-
if err = listener.Close(); err != nil {
718-
return -1, err
719-
720-
}
721-
return port, nil
722-
}
723-
724710
func (s *ServerQueryEngine) CloseSession(connID uint32) {
725711
// TODO
726712
}

enginetest/server_engine_test.go

Lines changed: 92 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
gosql "database/sql"
66
"fmt"
77
"math"
8-
"net"
8+
"os"
99
"testing"
1010

1111
"github.com/dolthub/vitess/go/mysql"
@@ -24,19 +24,6 @@ var (
2424
noUserFmt = "no_user:@tcp(%s:%d)/"
2525
)
2626

27-
func findEmptyPort() (int, error) {
28-
listener, err := net.Listen("tcp", ":0")
29-
if err != nil {
30-
return -1, err
31-
}
32-
port := listener.Addr().(*net.TCPAddr).Port
33-
if err = listener.Close(); err != nil {
34-
return -1, err
35-
36-
}
37-
return port, nil
38-
}
39-
4027
// initTestServer initializes an in-memory server with the given port, but does not start it.
4128
func initTestServer(port int) (*server.Server, error) {
4229
pro := memory.NewDBProvider()
@@ -57,7 +44,7 @@ func initTestServer(port int) (*server.Server, error) {
5744

5845
// TestSmoke checks that an in-memory server can be started and stopped without error.
5946
func TestSmoke(t *testing.T) {
60-
port, err := findEmptyPort()
47+
port, err := sql.GetEmptyPort()
6148
require.NoError(t, err)
6249

6350
s, err := initTestServer(port)
@@ -314,7 +301,7 @@ func TestServerPreparedStatements(t *testing.T) {
314301
},
315302
}
316303

317-
port, perr := findEmptyPort()
304+
port, perr := sql.GetEmptyPort()
318305
require.NoError(t, perr)
319306

320307
s, serr := initTestServer(port)
@@ -375,3 +362,92 @@ func TestServerPreparedStatements(t *testing.T) {
375362
})
376363
}
377364
}
365+
366+
func TestServerVariables(t *testing.T) {
367+
hostname, herr := os.Hostname()
368+
require.NoError(t, herr)
369+
370+
port, perr := sql.GetEmptyPort()
371+
require.NoError(t, perr)
372+
373+
s, serr := initTestServer(port)
374+
require.NoError(t, serr)
375+
376+
go s.Start()
377+
defer s.Close()
378+
379+
tests := []serverScriptTest{
380+
{
381+
name: "test that config system variables are properly set",
382+
setup: []string{},
383+
assertions: []serverScriptTestAssertion{
384+
{
385+
query: "select @@hostname, @@port, @@net_read_timeout, @@net_write_timeout",
386+
isExec: false,
387+
expectedRows: []any{
388+
sql.Row{hostname, port, 1, 1},
389+
},
390+
checkRows: func(t *testing.T, rows *gosql.Rows, expectedRows []any) (bool, error) {
391+
var resHostname string
392+
var resPort int
393+
var resNetReadTimeout int
394+
var resNetWriteTimeout int
395+
var rowNum int
396+
for rows.Next() {
397+
if err := rows.Scan(&resHostname, &resPort, &resNetReadTimeout, &resNetWriteTimeout); err != nil {
398+
return false, err
399+
}
400+
if rowNum >= len(expectedRows) {
401+
return false, nil
402+
}
403+
expectedRow := expectedRows[rowNum].(sql.Row)
404+
require.Equal(t, expectedRow[0].(string), resHostname)
405+
require.Equal(t, expectedRow[1].(int), resPort)
406+
}
407+
return true, nil
408+
},
409+
},
410+
},
411+
},
412+
}
413+
414+
for _, test := range tests {
415+
t.Run(test.name, func(t *testing.T) {
416+
conn, cerr := dbr.Open("mysql", fmt.Sprintf(noUserFmt, address, port), nil)
417+
require.NoError(t, cerr)
418+
defer conn.Close()
419+
commonSetup := []string{
420+
"create database test_db;",
421+
"use test_db;",
422+
}
423+
commonTeardown := []string{
424+
"drop database test_db",
425+
}
426+
for _, stmt := range append(commonSetup, test.setup...) {
427+
_, err := conn.Exec(stmt)
428+
require.NoError(t, err)
429+
}
430+
for _, assertion := range test.assertions {
431+
t.Run(assertion.query, func(t *testing.T) {
432+
if assertion.skip {
433+
t.Skip()
434+
}
435+
rows, err := conn.Query(assertion.query, assertion.args...)
436+
if assertion.expectErr {
437+
require.Error(t, err)
438+
return
439+
}
440+
require.NoError(t, err)
441+
442+
ok, err := assertion.checkRows(t, rows, assertion.expectedRows)
443+
require.NoError(t, err)
444+
require.True(t, ok)
445+
})
446+
}
447+
for _, stmt := range append(commonTeardown) {
448+
_, err := conn.Exec(stmt)
449+
require.NoError(t, err)
450+
}
451+
})
452+
}
453+
}

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ require (
66
github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad
77
github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71
88
github.com/dolthub/sqllogictest/go v0.0.0-20201107003712-816f3ae12d81
9-
github.com/dolthub/vitess v0.0.0-20250813175212-45844169a751
9+
github.com/dolthub/vitess v0.0.0-20250814204310-c749d213f235
1010
github.com/go-sql-driver/mysql v1.7.2-0.20231213112541-0004702b931d
1111
github.com/gocraft/dbr/v2 v2.7.2
1212
github.com/google/uuid v1.3.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ github.com/dolthub/vitess v0.0.0-20250730174048-497aebb8cea7 h1:l+mWO0xoh4eG1J9g
2222
github.com/dolthub/vitess v0.0.0-20250730174048-497aebb8cea7/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70=
2323
github.com/dolthub/vitess v0.0.0-20250813175212-45844169a751 h1:BBQKyvyODewdQxS+ICklMn1d/fFj2pVlkmMN1QFY4ms=
2424
github.com/dolthub/vitess v0.0.0-20250813175212-45844169a751/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70=
25+
github.com/dolthub/vitess v0.0.0-20250814204310-c749d213f235 h1:uXrK+xn8rCwz/8jWDKaDyqZG1HbZI9F4V4HJ7zXFPMY=
26+
github.com/dolthub/vitess v0.0.0-20250814204310-c749d213f235/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70=
2527
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
2628
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
2729
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=

0 commit comments

Comments
 (0)