mirror of
https://github.com/dolthub/dolt.git
synced 2026-05-04 11:30:14 -05:00
Merge pull request #6374 from dolthub/steph/db-branch
adds support for `db/branch` syntax with `--use-db` global arg
This commit is contained in:
@@ -37,6 +37,7 @@ import (
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/commands"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/commands/engine"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/argparser"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/filesys"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/iohelp"
|
||||
@@ -475,17 +476,20 @@ func (c ConnectionQueryist) Query(ctx *sql.Context, query string) (sql.Schema, s
|
||||
|
||||
// BuildConnectionStringQueryist returns a Queryist that connects to the server specified by the given server config. Presence in this
|
||||
// module isn't ideal, but it's the only way to get the server config into the queryist.
|
||||
func BuildConnectionStringQueryist(ctx context.Context, cwdFS filesys.Filesys, creds *cli.UserPassword, apr *argparser.ArgParseResults, host string, port int, useTLS bool, database string) (cli.LateBindQueryist, error) {
|
||||
func BuildConnectionStringQueryist(ctx context.Context, cwdFS filesys.Filesys, creds *cli.UserPassword, apr *argparser.ArgParseResults, host string, port int, useTLS bool, dbRev string) (cli.LateBindQueryist, error) {
|
||||
clientConfig, err := GetClientConfig(cwdFS, creds, apr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
parsedMySQLConfig, err := mysqlDriver.ParseDSN(ConnectionString(clientConfig, database))
|
||||
// ParseDSN currently doesn't support `/` in the db name
|
||||
dbName, _ := dsess.SplitRevisionDbName(dbRev)
|
||||
parsedMySQLConfig, err := mysqlDriver.ParseDSN(ConnectionString(clientConfig, dbName))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
parsedMySQLConfig.DBName = dbRev
|
||||
parsedMySQLConfig.Addr = fmt.Sprintf("%s:%d", host, port)
|
||||
|
||||
if useTLS {
|
||||
@@ -503,7 +507,7 @@ func BuildConnectionStringQueryist(ctx context.Context, cwdFS filesys.Filesys, c
|
||||
|
||||
var lateBind cli.LateBindQueryist = func(ctx context.Context) (cli.Queryist, *sql.Context, func(), error) {
|
||||
sqlCtx := sql.NewContext(ctx)
|
||||
sqlCtx.SetCurrentDatabase(database)
|
||||
sqlCtx.SetCurrentDatabase(dbRev)
|
||||
return queryist, sqlCtx, func() { conn.Conn(ctx) }, nil
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -623,9 +623,10 @@ func buildLateBinder(ctx context.Context, cwdFS filesys.Filesys, mrEnv *env.Mult
|
||||
}
|
||||
|
||||
if hasUseDb {
|
||||
targetEnv = mrEnv.GetEnv(useDb)
|
||||
dbName, _ := dsess.SplitRevisionDbName(useDb)
|
||||
targetEnv = mrEnv.GetEnv(dbName)
|
||||
if targetEnv == nil {
|
||||
return nil, fmt.Errorf("The provided --use-db %s does not exist or is not a directory.", useDb)
|
||||
return nil, fmt.Errorf("The provided --use-db %s does not exist.", dbName)
|
||||
}
|
||||
} else {
|
||||
useDb = mrEnv.GetFirstDatabase()
|
||||
|
||||
@@ -19,7 +19,7 @@ require (
|
||||
github.com/dustin/go-humanize v1.0.0
|
||||
github.com/fatih/color v1.13.0
|
||||
github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568
|
||||
github.com/go-sql-driver/mysql v1.6.0
|
||||
github.com/go-sql-driver/mysql v1.7.2-0.20230713085235-0b18dac46f7f
|
||||
github.com/gocraft/dbr/v2 v2.7.2
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/golang/snappy v0.0.4
|
||||
|
||||
@@ -255,8 +255,9 @@ github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhO
|
||||
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
|
||||
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-sql-driver/mysql v1.7.2-0.20230713085235-0b18dac46f7f h1:4+t8Qb99xUG/Ea00cQAiQl+gsjpK8ZYtAO8E76gRzQI=
|
||||
github.com/go-sql-driver/mysql v1.7.2-0.20230713085235-0b18dac46f7f/go.mod h1:6gYm/zDt3ahdnMVTPeT/LfoBFsws1qZm5yI6FmVjB14=
|
||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
|
||||
github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
||||
|
||||
@@ -48,13 +48,13 @@ func TestBinlogReplicationForAllTypes(t *testing.T) {
|
||||
waitForReplicaToCatchUp(t)
|
||||
rows, err := replicaDatabase.Queryx("select * from db01.alltypes order by pk asc;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "1", row["pk"])
|
||||
assertValues(t, 0, row)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "2", row["pk"])
|
||||
assertValues(t, 1, row)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "3", row["pk"])
|
||||
assertNullValues(t, row)
|
||||
require.False(t, rows.Next())
|
||||
@@ -70,13 +70,13 @@ func TestBinlogReplicationForAllTypes(t *testing.T) {
|
||||
replicaDatabase.MustExec("use db01;")
|
||||
rows, err = replicaDatabase.Queryx("select * from db01.alltypes order by pk asc;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "1", row["pk"])
|
||||
assertNullValues(t, row)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "2", row["pk"])
|
||||
assertValues(t, 0, row)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "3", row["pk"])
|
||||
assertValues(t, 1, row)
|
||||
require.False(t, rows.Next())
|
||||
@@ -516,7 +516,7 @@ func assertValues(t *testing.T, assertionIndex int, row map[string]interface{})
|
||||
|
||||
actualValue := ""
|
||||
if row[typeDesc.ColumnName()] != nil {
|
||||
actualValue = row[typeDesc.ColumnName()].(string)
|
||||
actualValue = fmt.Sprintf("%v", row[typeDesc.ColumnName()])
|
||||
}
|
||||
if typeDesc.TypeDefinition == "json" {
|
||||
// LD_1 and DOLT storage formats return JSON strings slightly differently; DOLT removes spaces
|
||||
|
||||
@@ -56,7 +56,7 @@ func TestBinlogReplicationFilters_ignoreTablesOnly(t *testing.T) {
|
||||
// Verify that all changes from t1 were applied on the replica
|
||||
rows, err := replicaDatabase.Queryx("SELECT COUNT(pk) as count, MIN(pk) as min, MAX(pk) as max from db01.t1;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "10", row["count"])
|
||||
require.Equal(t, "0", row["min"])
|
||||
require.Equal(t, "9", row["max"])
|
||||
@@ -65,7 +65,7 @@ func TestBinlogReplicationFilters_ignoreTablesOnly(t *testing.T) {
|
||||
// Verify that no changes from t2 were applied on the replica
|
||||
rows, err = replicaDatabase.Queryx("SELECT COUNT(pk) as count, MIN(pk) as min, MAX(pk) as max from db01.t2;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "0", row["count"])
|
||||
require.Equal(t, nil, row["min"])
|
||||
require.Equal(t, nil, row["max"])
|
||||
@@ -107,7 +107,7 @@ func TestBinlogReplicationFilters_doTablesOnly(t *testing.T) {
|
||||
// Verify that all changes from t1 were applied on the replica
|
||||
rows, err := replicaDatabase.Queryx("SELECT COUNT(pk) as count, MIN(pk) as min, MAX(pk) as max from db01.t1;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "10", row["count"])
|
||||
require.Equal(t, "0", row["min"])
|
||||
require.Equal(t, "9", row["max"])
|
||||
@@ -116,7 +116,7 @@ func TestBinlogReplicationFilters_doTablesOnly(t *testing.T) {
|
||||
// Verify that no changes from t2 were applied on the replica
|
||||
rows, err = replicaDatabase.Queryx("SELECT COUNT(pk) as count, MIN(pk) as min, MAX(pk) as max from db01.t2;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "0", row["count"])
|
||||
require.Equal(t, nil, row["min"])
|
||||
require.Equal(t, nil, row["max"])
|
||||
@@ -159,7 +159,7 @@ func TestBinlogReplicationFilters_doTablesAndIgnoreTables(t *testing.T) {
|
||||
// Verify that all changes from t1 were applied on the replica
|
||||
rows, err := replicaDatabase.Queryx("SELECT COUNT(pk) as count, MIN(pk) as min, MAX(pk) as max from db01.t1;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "10", row["count"])
|
||||
require.Equal(t, "0", row["min"])
|
||||
require.Equal(t, "9", row["max"])
|
||||
@@ -168,7 +168,7 @@ func TestBinlogReplicationFilters_doTablesAndIgnoreTables(t *testing.T) {
|
||||
// Verify that no changes from t2 were applied on the replica
|
||||
rows, err = replicaDatabase.Queryx("SELECT COUNT(pk) as count, MIN(pk) as min, MAX(pk) as max from db01.t2;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "0", row["count"])
|
||||
require.Equal(t, nil, row["min"])
|
||||
require.Equal(t, nil, row["max"])
|
||||
|
||||
@@ -48,13 +48,13 @@ func TestBinlogReplicationMultiDb(t *testing.T) {
|
||||
waitForReplicaToCatchUp(t)
|
||||
rows, err := replicaDatabase.Queryx("select * from db01.t01 order by pk asc;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "1", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "3", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "5", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "7", row["pk"])
|
||||
require.False(t, rows.Next())
|
||||
require.NoError(t, rows.Close())
|
||||
@@ -64,19 +64,19 @@ func TestBinlogReplicationMultiDb(t *testing.T) {
|
||||
replicaDatabase.MustExec("use db01;")
|
||||
rows, err = replicaDatabase.Queryx("select * from db01.dolt_diff;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t01", row["table_name"])
|
||||
require.EqualValues(t, "1", row["data_change"])
|
||||
require.EqualValues(t, "0", row["schema_change"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t01", row["table_name"])
|
||||
require.EqualValues(t, "1", row["data_change"])
|
||||
require.EqualValues(t, "0", row["schema_change"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t01", row["table_name"])
|
||||
require.EqualValues(t, "1", row["data_change"])
|
||||
require.EqualValues(t, "0", row["schema_change"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t01", row["table_name"])
|
||||
require.EqualValues(t, "0", row["data_change"])
|
||||
require.EqualValues(t, "1", row["schema_change"])
|
||||
@@ -88,13 +88,13 @@ func TestBinlogReplicationMultiDb(t *testing.T) {
|
||||
replicaDatabase.MustExec("use db02;")
|
||||
rows, err = replicaDatabase.Queryx("select * from db02.t02 order by pk asc;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "2", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "4", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "6", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "8", row["pk"])
|
||||
require.False(t, rows.Next())
|
||||
require.NoError(t, rows.Close())
|
||||
@@ -102,19 +102,19 @@ func TestBinlogReplicationMultiDb(t *testing.T) {
|
||||
// Verify db02.dolt_diff
|
||||
rows, err = replicaDatabase.Queryx("select * from db02.dolt_diff;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t02", row["table_name"])
|
||||
require.Equal(t, "1", row["data_change"])
|
||||
require.Equal(t, "0", row["schema_change"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t02", row["table_name"])
|
||||
require.Equal(t, "1", row["data_change"])
|
||||
require.Equal(t, "0", row["schema_change"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t02", row["table_name"])
|
||||
require.Equal(t, "1", row["data_change"])
|
||||
require.Equal(t, "0", row["schema_change"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t02", row["table_name"])
|
||||
require.Equal(t, "0", row["data_change"])
|
||||
require.Equal(t, "1", row["schema_change"])
|
||||
@@ -148,13 +148,13 @@ func TestBinlogReplicationMultiDbTransactions(t *testing.T) {
|
||||
waitForReplicaToCatchUp(t)
|
||||
rows, err := replicaDatabase.Queryx("select * from db01.t01 order by pk asc;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "1", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "3", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "5", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "7", row["pk"])
|
||||
require.False(t, rows.Next())
|
||||
require.NoError(t, rows.Close())
|
||||
@@ -163,11 +163,11 @@ func TestBinlogReplicationMultiDbTransactions(t *testing.T) {
|
||||
replicaDatabase.MustExec("use db01;")
|
||||
rows, err = replicaDatabase.Queryx("select * from db01.dolt_diff;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t01", row["table_name"])
|
||||
require.EqualValues(t, "1", row["data_change"])
|
||||
require.EqualValues(t, "0", row["schema_change"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t01", row["table_name"])
|
||||
require.EqualValues(t, "0", row["data_change"])
|
||||
require.EqualValues(t, "1", row["schema_change"])
|
||||
@@ -179,13 +179,13 @@ func TestBinlogReplicationMultiDbTransactions(t *testing.T) {
|
||||
replicaDatabase.MustExec("use db02;")
|
||||
rows, err = replicaDatabase.Queryx("select * from db02.t02 order by pk asc;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "2", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "4", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "6", row["pk"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "8", row["pk"])
|
||||
require.False(t, rows.Next())
|
||||
require.NoError(t, rows.Close())
|
||||
@@ -193,11 +193,11 @@ func TestBinlogReplicationMultiDbTransactions(t *testing.T) {
|
||||
// Verify db02.dolt_diff
|
||||
rows, err = replicaDatabase.Queryx("select * from db02.dolt_diff;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t02", row["table_name"])
|
||||
require.Equal(t, "1", row["data_change"])
|
||||
require.Equal(t, "0", row["schema_change"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "t02", row["table_name"])
|
||||
require.Equal(t, "0", row["data_change"])
|
||||
require.Equal(t, "1", row["schema_change"])
|
||||
|
||||
@@ -62,7 +62,7 @@ func TestBinlogReplicationAutoReconnect(t *testing.T) {
|
||||
rows, err := replicaDatabase.Queryx("select min(pk) as min, max(pk) as max, count(pk) as count from db01.reconnect_test;")
|
||||
require.NoError(t, err)
|
||||
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "0", row["min"])
|
||||
require.Equal(t, "999", row["max"])
|
||||
require.Equal(t, "1000", row["count"])
|
||||
@@ -145,7 +145,7 @@ func showReplicaStatus(t *testing.T) map[string]interface{} {
|
||||
rows, err := replicaDatabase.Queryx("show replica status;")
|
||||
require.NoError(t, err)
|
||||
defer rows.Close()
|
||||
return convertByteArraysToStrings(readNextRow(t, rows))
|
||||
return convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
}
|
||||
|
||||
func configureToxiProxy(t *testing.T) {
|
||||
@@ -184,15 +184,19 @@ func turnOnLimitDataToxic(t *testing.T) {
|
||||
t.Logf("Toxiproxy proxy with limit_data toxic (1KB) started on port %d", proxyPort)
|
||||
}
|
||||
|
||||
// convertByteArraysToStrings converts each []byte value in the specified map |m| into a string.
|
||||
// convertMapScanResultToStrings converts each value in the specified map |m| into a string.
|
||||
// This is necessary because MapScan doesn't honor (or know about) the correct underlying SQL types – it
|
||||
// gets all results back as strings, typed as []byte.
|
||||
// gets results back as strings, typed as []byte. Results also get returned as int64, which are converted to strings
|
||||
// for ease of testing.
|
||||
// More info at the end of this issue: https://github.com/jmoiron/sqlx/issues/225
|
||||
func convertByteArraysToStrings(m map[string]interface{}) map[string]interface{} {
|
||||
func convertMapScanResultToStrings(m map[string]interface{}) map[string]interface{} {
|
||||
for key, value := range m {
|
||||
if bytes, ok := value.([]byte); ok {
|
||||
if bytes, ok := value.([]uint8); ok {
|
||||
m[key] = string(bytes)
|
||||
}
|
||||
if i, ok := value.(int64); ok {
|
||||
m[key] = strconv.FormatInt(i, 10)
|
||||
}
|
||||
}
|
||||
|
||||
return m
|
||||
|
||||
@@ -75,8 +75,8 @@ func TestBinlogReplicationServerRestart(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
replicaRows, err := replicaDatabase.Queryx(countMaxQuery)
|
||||
require.NoError(t, err)
|
||||
primaryRow := convertByteArraysToStrings(readNextRow(t, primaryRows))
|
||||
replicaRow := convertByteArraysToStrings(readNextRow(t, replicaRows))
|
||||
primaryRow := convertMapScanResultToStrings(readNextRow(t, primaryRows))
|
||||
replicaRow := convertMapScanResultToStrings(readNextRow(t, replicaRows))
|
||||
require.Equal(t, primaryRow["count"], replicaRow["count"])
|
||||
require.Equal(t, primaryRow["max"], replicaRow["max"])
|
||||
require.NoError(t, replicaRows.Close())
|
||||
|
||||
@@ -169,7 +169,7 @@ func TestResetReplica(t *testing.T) {
|
||||
|
||||
rows, err = replicaDatabase.Queryx("SHOW REPLICA STATUS;")
|
||||
require.NoError(t, err)
|
||||
status := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
status := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "0", status["Last_Errno"])
|
||||
require.Equal(t, "", status["Last_Error"])
|
||||
require.Equal(t, "0", status["Last_IO_Errno"])
|
||||
@@ -320,7 +320,7 @@ func TestDoltCommits(t *testing.T) {
|
||||
waitForReplicaToCatchUp(t)
|
||||
rows, err := replicaDatabase.Queryx("select count(*) as count from db01.dolt_log;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "5", row["count"])
|
||||
require.NoError(t, rows.Close())
|
||||
|
||||
@@ -331,31 +331,31 @@ func TestDoltCommits(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
// Fourth transaction
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "1", row["data_change"])
|
||||
require.Equal(t, "0", row["schema_change"])
|
||||
require.Equal(t, "t1", row["table_name"])
|
||||
commitId := row["commit_hash"]
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "1", row["data_change"])
|
||||
require.Equal(t, "0", row["schema_change"])
|
||||
require.Equal(t, "t2", row["table_name"])
|
||||
require.Equal(t, commitId, row["commit_hash"])
|
||||
|
||||
// Third transaction
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "1", row["data_change"])
|
||||
require.Equal(t, "0", row["schema_change"])
|
||||
require.Equal(t, "t2", row["table_name"])
|
||||
|
||||
// Second transaction
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "0", row["data_change"])
|
||||
require.Equal(t, "1", row["schema_change"])
|
||||
require.Equal(t, "t2", row["table_name"])
|
||||
|
||||
// First transaction
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "0", row["data_change"])
|
||||
require.Equal(t, "1", row["schema_change"])
|
||||
require.Equal(t, "t1", row["table_name"])
|
||||
@@ -405,13 +405,13 @@ func TestForeignKeyChecks(t *testing.T) {
|
||||
waitForReplicaToCatchUp(t)
|
||||
rows, err := replicaDatabase.Queryx("select * from db01.t1 order by pk;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "1", row["pk"])
|
||||
require.Equal(t, "red", row["color"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "2", row["pk"])
|
||||
require.Equal(t, "still-not-a-color", row["color"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "3", row["pk"])
|
||||
require.Equal(t, "not-a-color", row["color"])
|
||||
require.False(t, rows.Next())
|
||||
@@ -419,9 +419,9 @@ func TestForeignKeyChecks(t *testing.T) {
|
||||
|
||||
rows, err = replicaDatabase.Queryx("select * from db01.colors order by name;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "blue", row["name"])
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "green", row["name"])
|
||||
require.False(t, rows.Next())
|
||||
require.NoError(t, rows.Close())
|
||||
@@ -441,14 +441,14 @@ func TestCharsetsAndCollations(t *testing.T) {
|
||||
waitForReplicaToCatchUp(t)
|
||||
rows, err := replicaDatabase.Queryx("show create table db01.t1;")
|
||||
require.NoError(t, err)
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Contains(t, row["Create Table"], "ascii_general_ci")
|
||||
require.Contains(t, row["Create Table"], "utf16_general_ci")
|
||||
require.NoError(t, rows.Close())
|
||||
|
||||
rows, err = replicaDatabase.Queryx("select * from db01.t1;")
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row = convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, "one", row["c1"])
|
||||
require.Equal(t, "\x00o\x00n\x00e", row["c2"])
|
||||
require.NoError(t, rows.Close())
|
||||
@@ -515,7 +515,7 @@ func waitForReplicaToReachGtid(t *testing.T, target int) {
|
||||
func assertWarning(t *testing.T, database *sqlx.DB, code int, message string) {
|
||||
rows, err := database.Queryx("SHOW WARNINGS;")
|
||||
require.NoError(t, err)
|
||||
warning := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
warning := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
require.Equal(t, strconv.Itoa(code), warning["Code"])
|
||||
require.Equal(t, message, warning["Message"])
|
||||
require.False(t, rows.Next())
|
||||
@@ -526,7 +526,7 @@ func queryGtid(t *testing.T, database *sqlx.DB) string {
|
||||
rows, err := database.Queryx("SELECT @@global.gtid_executed as gtid_executed;")
|
||||
require.NoError(t, err)
|
||||
defer rows.Close()
|
||||
row := convertByteArraysToStrings(readNextRow(t, rows))
|
||||
row := convertMapScanResultToStrings(readNextRow(t, rows))
|
||||
if row["gtid_executed"] == nil {
|
||||
t.Fatal("no value for @@GLOBAL.gtid_executed")
|
||||
}
|
||||
@@ -550,7 +550,7 @@ func readAllRows(t *testing.T, rows *sqlx.Rows) []map[string]interface{} {
|
||||
}
|
||||
err := rows.MapScan(row)
|
||||
require.NoError(t, err)
|
||||
row = convertByteArraysToStrings(row)
|
||||
row = convertMapScanResultToStrings(row)
|
||||
result = append(result, row)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ var DoltBranchMultiSessionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
{
|
||||
Query: "/* client b */ CALL DOLT_BRANCH('-d', 'branch1');",
|
||||
ExpectedErrStr: "Error 1105: unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
ExpectedErrStr: "Error 1105 (HY000): unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ CALL DOLT_CHECKOUT('branch2');",
|
||||
@@ -67,7 +67,7 @@ var DoltBranchMultiSessionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
{
|
||||
Query: "/* client b */ CALL DOLT_BRANCH('-d', 'branch2');",
|
||||
ExpectedErrStr: "Error 1105: unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
ExpectedErrStr: "Error 1105 (HY000): unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
},
|
||||
{
|
||||
Query: "/* client b */ CALL DOLT_BRANCH('-df', 'branch2');",
|
||||
@@ -96,7 +96,7 @@ var DoltBranchMultiSessionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
{
|
||||
Query: "/* client b */ CALL DOLT_BRANCH('-m', 'branch1', 'movedBranch1');",
|
||||
ExpectedErrStr: "Error 1105: unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
ExpectedErrStr: "Error 1105 (HY000): unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
},
|
||||
{
|
||||
Query: "/* client b */ CALL DOLT_BRANCH('-mf', 'branch1', 'movedBranch1');",
|
||||
@@ -137,7 +137,7 @@ var DoltBranchMultiSessionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ CALL DOLT_BRANCH('-d', 'branch2');",
|
||||
ExpectedErrStr: "Error 1105: unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
ExpectedErrStr: "Error 1105 (HY000): unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ CALL DOLT_BRANCH('-df', 'branch2');",
|
||||
@@ -188,7 +188,7 @@ var DoltBranchMultiSessionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ CALL DOLT_BRANCH('-m', 'branch2', 'newName');",
|
||||
ExpectedErrStr: "Error 1105: unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
ExpectedErrStr: "Error 1105 (HY000): unsafe to delete or rename branches in use in other sessions; use --force to force the change",
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ CALL DOLT_BRANCH('-mf', 'branch2', 'newName');",
|
||||
@@ -239,11 +239,11 @@ var DoltBranchMultiSessionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ select name from dolt_branches;",
|
||||
ExpectedErrStr: "Error 1105: database not found: dolt/branch1",
|
||||
ExpectedErrStr: "Error 1105 (HY000): database not found: dolt/branch1",
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ CALL DOLT_CHECKOUT('main');",
|
||||
ExpectedErrStr: "Error 1105: database not found: dolt/branch1",
|
||||
ExpectedErrStr: "Error 1105 (HY000): database not found: dolt/branch1",
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ USE dolt/main;",
|
||||
@@ -288,12 +288,12 @@ var DoltBranchMultiSessionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ select name from dolt_branches;",
|
||||
ExpectedErrStr: "Error 1105: database not found: dolt/branch1",
|
||||
ExpectedErrStr: "Error 1105 (HY000): database not found: dolt/branch1",
|
||||
},
|
||||
{
|
||||
// TODO: this could be handled better, not the best experience. Maybe kill the session?
|
||||
Query: "/* client a */ CALL DOLT_CHECKOUT('main');",
|
||||
ExpectedErrStr: "Error 1105: database not found: dolt/branch1",
|
||||
ExpectedErrStr: "Error 1105 (HY000): database not found: dolt/branch1",
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ USE dolt/main;",
|
||||
@@ -415,7 +415,7 @@ var DropDatabaseMultiSessionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
{
|
||||
Query: "/* client b */ show tables;",
|
||||
ExpectedErrStr: "Error 1105: database not found: db01/branch1",
|
||||
ExpectedErrStr: "Error 1105 (HY000): database not found: db01/branch1",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
Executable
+79
@@ -0,0 +1,79 @@
|
||||
#!/usr/bin/env bats
|
||||
|
||||
load $BATS_TEST_DIRNAME/helper/common.bash
|
||||
|
||||
setup() {
|
||||
setup_common
|
||||
dolt sql <<SQL
|
||||
create database db1;
|
||||
use db1;
|
||||
create table t (pk int primary key);
|
||||
insert into t values (1);
|
||||
call dolt_commit('-Am', 'added table t');
|
||||
call dolt_branch('b1');
|
||||
call dolt_branch('b2');
|
||||
SQL
|
||||
}
|
||||
|
||||
teardown() {
|
||||
assert_feature_version
|
||||
teardown_common
|
||||
}
|
||||
|
||||
@test "global-args: can specify default branch with --use-db" {
|
||||
dolt --use-db db1 sql -q "insert into t values (2)"
|
||||
dolt --use-db db1 commit -Am "added row to t"
|
||||
|
||||
run dolt --use-db db1 sql -q "select * from t"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1" ]] || false
|
||||
[[ "$output" =~ "2" ]] || false
|
||||
mainOutput=$output
|
||||
|
||||
run dolt --use-db db1/main sql -q "select * from t"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$mainOutput" == "$output" ]] || false
|
||||
}
|
||||
|
||||
@test "global-args: can specify non-default branch with --use-db" {
|
||||
dolt sql <<SQL
|
||||
use db1;
|
||||
call dolt_checkout('b1');
|
||||
insert into t values (2);
|
||||
call dolt_commit('-Am', 'modified b1');
|
||||
SQL
|
||||
|
||||
run dolt --use-db db1 sql -q "select * from t"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1" ]] || false
|
||||
[[ ! "$output" =~ "2" ]] || false
|
||||
|
||||
run dolt --use-db db1/b1 sql -q "select * from t"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1" ]] || false
|
||||
[[ "$output" =~ "2" ]] || false
|
||||
}
|
||||
|
||||
@test "global-args: can specify multiple non-default branches with --use-db" {
|
||||
dolt sql <<SQL
|
||||
use db1;
|
||||
call dolt_checkout('b1');
|
||||
insert into t values (2);
|
||||
call dolt_commit('-Am', 'modified b1');
|
||||
call dolt_checkout('b2');
|
||||
insert into t values (3);
|
||||
call dolt_commit('-Am', 'modified b2');
|
||||
SQL
|
||||
|
||||
run dolt --use-db db1/b1 sql -q "select * from t"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1" ]] || false
|
||||
[[ "$output" =~ "2" ]] || false
|
||||
[[ ! "$output" =~ "3" ]] || false
|
||||
|
||||
run dolt --use-db db1/b2 sql -q "select * from t"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "1" ]] || false
|
||||
[[ ! "$output" =~ "2" ]] || false
|
||||
[[ "$output" =~ "3" ]] || false
|
||||
}
|
||||
@@ -2836,7 +2836,7 @@ SQL
|
||||
# Use of the use-db flag when we have a different DB specified by data-dir should error.
|
||||
run dolt --data-dir="$ROOT_DIR/dbb" --use-db=dba sql -q "show tables"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "provided --use-db dba does not exist or is not a directory" ]] || false
|
||||
[[ "$output" =~ "provided --use-db dba does not exist" ]] || false
|
||||
}
|
||||
|
||||
@test "sql: USE information schema and mysql databases" {
|
||||
|
||||
@@ -12,7 +12,7 @@ require (
|
||||
require (
|
||||
github.com/creasty/defaults v1.6.0 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/go-sql-driver/mysql v1.6.0 // indirect
|
||||
github.com/go-sql-driver/mysql v1.7.2-0.20230713085235-0b18dac46f7f // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
golang.org/x/sys v0.10.0 // indirect
|
||||
)
|
||||
|
||||
@@ -3,8 +3,8 @@ github.com/creasty/defaults v1.6.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbD
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
|
||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||
github.com/go-sql-driver/mysql v1.7.2-0.20230713085235-0b18dac46f7f h1:4+t8Qb99xUG/Ea00cQAiQl+gsjpK8ZYtAO8E76gRzQI=
|
||||
github.com/go-sql-driver/mysql v1.7.2-0.20230713085235-0b18dac46f7f/go.mod h1:6gYm/zDt3ahdnMVTPeT/LfoBFsws1qZm5yI6FmVjB14=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
|
||||
Reference in New Issue
Block a user