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:
stephanie
2023-07-25 10:31:31 -07:00
committed by GitHub
15 changed files with 176 additions and 87 deletions
+7 -3
View File
@@ -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
View File
@@ -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()
+1 -1
View File
@@ -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
+2 -1
View File
@@ -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",
},
},
},
+79
View File
@@ -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
}
+1 -1
View File
@@ -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=