Merge branch 'main' into andy/dolt-docs

This commit is contained in:
AndyA
2022-07-15 13:27:59 -07:00
committed by GitHub
36 changed files with 1970 additions and 494 deletions
@@ -3,7 +3,7 @@
set -e
if [ "$#" -lt 9 ]; then
echo "Usage: ./get-dolt-dolt-job-json.sh <jobName> <fromServer> <fromVersion> <toServer> <toVersion> <timePrefix> <actorPrefix> <nomsBinFormat> <issueNumber>"
echo "Usage: ./get-dolt-dolt-job-json.sh <jobName> <fromServer> <fromVersion> <toServer> <toVersion> <timePrefix> <actorPrefix> <nomsBinFormat> <format> <issueNumber>"
exit 1
fi
@@ -15,7 +15,8 @@ toVersion="$5"
timePrefix="$6"
actorPrefix="$7"
nomsBinFormat="$8"
issueNumber="$9"
format="$9"
issueNumber="${10}"
echo '
{
@@ -57,8 +58,9 @@ echo '
"--results-prefix='$actorPrefix'",
"--mysql-schema-file=schema.sql",
"--nbf='$nomsBinFormat'",
"--results-schema=results-schema.sql",
"--results-schema=/results-schema.sql",
"--issue-number='$issueNumber'",
"--output='$format'",
"--fileNames=100k-sorted.csv",
"--fileNames=100k-random.csv",
"--fileNames=1m-sorted.csv",
@@ -3,7 +3,7 @@
set -e
if [ "$#" -lt 9 ]; then
echo "Usage: ./get-mysql-dolt-job-json.sh <jobName> <fromServer> <fromVersion> <toServer> <toVersion> <timePrefix> <actorPrefix> <nomsBinFormat> <issueNumber>"
echo "Usage: ./get-mysql-dolt-job-json.sh <jobName> <fromServer> <fromVersion> <toServer> <toVersion> <timePrefix> <actorPrefix> <nomsBinFormat> <format> <issueNumber>"
exit 1
fi
@@ -15,7 +15,8 @@ toVersion="$5"
timePrefix="$6"
actorPrefix="$7"
nomsBinFormat="$8"
issueNumber="$9"
format="$9"
issueNumber="${10}"
echo '
{
@@ -58,8 +59,9 @@ echo '
"--mysql-exec=/usr/sbin/mysqld",
"--mysql-schema-file=schema.sql",
"--nbf='$nomsBinFormat'",
"--results-schema=results-schema.sql",
"--results-schema=/results-schema.sql",
"--issue-number='$issueNumber'",
"--output='$format'",
"--fileNames=100k-sorted.csv",
"--fileNames=100k-random.csv",
"--fileNames=1m-sorted.csv",
@@ -43,6 +43,11 @@ timeprefix=$(date +%Y/%m/%d)
actorprefix="$MODE/$ACTOR/$actorShort"
format="markdown"
if [[ "$MODE" = "release" || "$MODE" = "nightly" ]]; then
format="html"
fi
# set value to ISSUE_NUMBER environment variable
# or default to -1
issuenumber=${ISSUE_NUMBER:-"-1"}
@@ -57,6 +62,7 @@ source \
"$timeprefix" \
"$actorprefix" \
"$NOMS_BIN_FORMAT" \
"$format" \
"$issuenumber" > job.json
out=$(KUBECONFIG="$KUBECONFIG" kubectl apply -f job.json || true)
@@ -96,3 +96,4 @@ jobs:
REPO_ACCESS_TOKEN: ${{ secrets.REPO_ACCESS_TOKEN }}
KUBECONFIG: "./kubeconfig"
TEMPLATE_SCRIPT: "./.github/scripts/import-benchmarking/get-dolt-dolt-job-json.sh"
NOMS_BIN_FORMAT: "__LD_1__"
+1 -1
View File
@@ -370,7 +370,7 @@ func getInitialDBStateWithDefaultBranch(ctx context.Context, db dsqle.SqlDatabas
// NewSqlEngineForEnv returns a SqlEngine configured for the environment provided, with a single root user
func NewSqlEngineForEnv(ctx context.Context, dEnv *env.DoltEnv) (*SqlEngine, error) {
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
return nil, err
}
+1 -1
View File
@@ -228,7 +228,7 @@ func rebaseSqlEngine(ctx context.Context, dEnv *env.DoltEnv, cm *doltdb.Commit)
opts := editor.Options{Deaf: dEnv.DbEaFactory(), Tempdir: dEnv.TempTableFilesDir()}
db := dsqle.NewDatabase(dbName, dEnv.DbData(), opts)
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
return nil, nil, err
}
+127 -43
View File
@@ -36,6 +36,7 @@ import (
"github.com/dolthub/vitess/go/vt/vterrors"
"github.com/fatih/color"
"github.com/flynn-archive/go-shlex"
"gopkg.in/src-d/go-errors.v1"
"github.com/dolthub/dolt/go/cmd/dolt/cli"
"github.com/dolthub/dolt/go/cmd/dolt/commands/engine"
@@ -68,32 +69,39 @@ Multiple SQL statements must be separated by semicolons. Use {{.EmphasisLeft}}-b
Queries can be saved to the query catalog with {{.EmphasisLeft}}-s{{.EmphasisRight}}. Alternatively {{.EmphasisLeft}}-x{{.EmphasisRight}} can be used to execute a saved query by name.
By default this command uses the dolt database in the current working directory, as well as any dolt databases that are found in the current directory. Any databases created with CREATE DATABASE are placed in the current directory as well. Running with {{.EmphasisLeft}}--multi-db-dir <directory>{{.EmphasisRight}} uses each of the subdirectories of the supplied directory (each subdirectory must be a valid dolt data repository) as databases. Subdirectories starting with '.' are ignored.`,
By default this command uses the dolt database in the current working directory, as well as any dolt databases that are found in the current directory. Any databases created with CREATE DATABASE are placed in the current directory as well. Running with {{.EmphasisLeft}}--data-dir <directory>{{.EmphasisRight}} uses each of the subdirectories of the supplied directory (each subdirectory must be a valid dolt data repository) as databases. Subdirectories starting with '.' are ignored.`,
Synopsis: []string{
"",
"< script.sql",
"[--multi-db-dir {{.LessThan}}directory{{.GreaterThan}}] [-r {{.LessThan}}result format{{.GreaterThan}}]",
"[--data-dir {{.LessThan}}directory{{.GreaterThan}}] [-r {{.LessThan}}result format{{.GreaterThan}}]",
"-q {{.LessThan}}query{{.GreaterThan}} [-r {{.LessThan}}result format{{.GreaterThan}}] [-s {{.LessThan}}name{{.GreaterThan}} -m {{.LessThan}}message{{.GreaterThan}}] [-b]",
"-q {{.LessThan}}query{{.GreaterThan}} --multi-db-dir {{.LessThan}}directory{{.GreaterThan}} [-r {{.LessThan}}result format{{.GreaterThan}}] [-b]",
"-q {{.LessThan}}query{{.GreaterThan}} --data-dir {{.LessThan}}directory{{.GreaterThan}} [-r {{.LessThan}}result format{{.GreaterThan}}] [-b]",
"-x {{.LessThan}}name{{.GreaterThan}}",
"--list-saved",
},
}
var ErrMultipleDoltCfgDirs = errors.NewKind("multiple .doltcfg directories detected: '%s' and '%s'; pass one of the directories using option --doltcfg-dir")
const (
QueryFlag = "query"
FormatFlag = "result-format"
saveFlag = "save"
executeFlag = "execute"
listSavedFlag = "list-saved"
messageFlag = "message"
BatchFlag = "batch"
multiDBDirFlag = "multi-db-dir"
continueFlag = "continue"
fileInputFlag = "file"
privilegeFilePathFlag = "privilege-file"
welcomeMsg = `# Welcome to the DoltSQL shell.
QueryFlag = "query"
FormatFlag = "result-format"
saveFlag = "save"
executeFlag = "execute"
listSavedFlag = "list-saved"
messageFlag = "message"
BatchFlag = "batch"
DataDirFlag = "data-dir"
MultiDBDirFlag = "multi-db-dir"
CfgDirFlag = "doltcfg-dir"
DefaultCfgDirName = ".doltcfg"
PrivsFilePathFlag = "privilege-file"
DefaultPrivsName = "privileges.db"
continueFlag = "continue"
fileInputFlag = "file"
welcomeMsg = `# Welcome to the DoltSQL shell.
# Statements must be terminated with ';'.
# "exit" or "quit" (or Ctrl-D) to exit.`
)
@@ -140,10 +148,12 @@ func (cmd SqlCmd) ArgParser() *argparser.ArgParser {
ap.SupportsFlag(listSavedFlag, "l", "List all saved queries")
ap.SupportsString(messageFlag, "m", "saved query description", "Used with --query and --save, saves the query with the descriptive message given. See also --name")
ap.SupportsFlag(BatchFlag, "b", "Use to enable more efficient batch processing for large SQL import scripts consisting of only INSERT statements. Other statements types are not guaranteed to work in this mode.")
ap.SupportsString(multiDBDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within ")
ap.SupportsString(DataDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within. Defaults the the current directory.")
ap.SupportsString(MultiDBDirFlag, "", "directory", "DEPRECATED: Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within. Defaults the the current directory.")
ap.SupportsString(CfgDirFlag, "", "directory", "Defines a directory that contains configuration files for dolt. Defaults to $data-dir/.doltcfg.")
ap.SupportsFlag(continueFlag, "c", "Continue running queries on an error. Used for batch mode only.")
ap.SupportsString(fileInputFlag, "", "input file", "Execute statements from the file given")
ap.SupportsString(privilegeFilePathFlag, "", "privilege file", "Path to a file to load and store users and grants. Without this flag, the database has a single user with all permissions, and more cannot be added.")
ap.SupportsString(PrivsFilePathFlag, "", "privilege file", "Path to a file to load and store users and grants. Defaults to $doltcfg-dir/privileges.db")
return ap
}
@@ -153,7 +163,7 @@ func (cmd SqlCmd) EventType() eventsapi.ClientEventType {
}
// RequiresRepo indicates that this command does not have to be run from within a dolt data repository directory.
// In this case it is because this command supports the multiDBDirFlag which can pass in a directory. In the event that
// In this case it is because this command supports the DataDirFlag which can pass in a directory. In the event that
// that parameter is not provided there is additional error handling within this command to make sure that this was in
// fact run from within a dolt data repository directory.
func (cmd SqlCmd) RequiresRepo() bool {
@@ -173,8 +183,6 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
}
privsFp, _ := apr.GetValue(privilegeFilePathFlag)
// We need a username and password for many SQL commands, so set defaults if they don't exist
dEnv.Config.SetFailsafes(env.DefaultFailsafeConfig)
@@ -183,6 +191,71 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE
return HandleVErrAndExitCode(verr, usage)
}
var cfgDirPath string
var dataDir string
if multiDbDir, ok := apr.GetValue(MultiDBDirFlag); ok {
dataDir = multiDbDir
} else if dataDirPath, ok := apr.GetValue(DataDirFlag); ok {
dataDir = dataDirPath
}
cfgDir, cfgDirSpecified := apr.GetValue(CfgDirFlag)
if cfgDirSpecified {
if exists, _ := dEnv.FS.Exists(cfgDir); !exists {
if err := dEnv.FS.MkDirs(cfgDir); err != nil {
absPath, _ := dEnv.FS.Abs(cfgDir)
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(fmt.Errorf("couldn't create directory at %s", absPath)), usage)
}
}
cfgDirPath = cfgDir
} else if len(dataDir) != 0 {
path := filepath.Join(dataDir, DefaultCfgDirName)
if exists, _ := dEnv.FS.Exists(path); !exists {
if err := dEnv.FS.MkDirs(path); err != nil {
absPath, _ := dEnv.FS.Abs(path)
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(fmt.Errorf("couldn't create directory at %s", absPath)), usage)
}
}
cfgDirPath = path
} else {
// Look in parent directory for doltcfg
path := filepath.Join("..", DefaultCfgDirName)
if exists, isDir := dEnv.FS.Exists(path); exists && isDir {
cfgDirPath = path
}
// Look in data directory (which is necessarily current directory) for doltcfg, create one here if none found
path = filepath.Join(dataDir, DefaultCfgDirName)
if exists, isDir := dEnv.FS.Exists(path); exists && isDir {
if len(cfgDirPath) != 0 {
p1, err := dEnv.FS.Abs(cfgDirPath)
if err != nil {
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
}
p2, err := dEnv.FS.Abs(path)
if err != nil {
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
}
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(ErrMultipleDoltCfgDirs.New(p1, p2)), usage)
}
cfgDirPath = path
} else if len(cfgDirPath) == 0 {
if err := dEnv.FS.MkDirs(path); err != nil {
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
}
cfgDirPath = path
}
}
// If no privilege filepath specified, default to doltcfg directory
privsFp, hasPrivsFp := apr.GetValue(PrivsFilePathFlag)
if !hasPrivsFp {
privsFp, err = dEnv.FS.Abs(filepath.Join(cfgDirPath, DefaultPrivsName))
if err != nil {
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
}
}
initialRoots, err := mrEnv.GetWorkingRoots(ctx)
if err != nil {
return HandleVErrAndExitCode(errhand.VerboseErrorFromError(err), usage)
@@ -205,7 +278,7 @@ func (cmd SqlCmd) Exec(ctx context.Context, commandStr string, args []string, dE
}
if query, queryOK := apr.GetValue(QueryFlag); queryOK {
return queryMode(ctx, mrEnv, initialRoots, apr, query, currentDb, format, usage)
return queryMode(ctx, mrEnv, initialRoots, apr, query, currentDb, format, usage, privsFp)
} else if savedQueryName, exOk := apr.GetValue(executeFlag); exOk {
return savedQueryMode(ctx, mrEnv, initialRoots, savedQueryName, currentDb, format, usage, privsFp)
} else if apr.Contains(listSavedFlag) {
@@ -309,6 +382,7 @@ func queryMode(
currentDb string,
format engine.PrintResultFormat,
usage cli.UsagePrinter,
privsFp string,
) int {
// query mode has 3 sub modes:
@@ -320,7 +394,6 @@ func queryMode(
_, continueOnError := apr.GetValue(continueFlag)
privsFp, _ := apr.GetValue(privilegeFilePathFlag)
if saveName != "" {
verr := execQuery(ctx, mrEnv, query, format, currentDb, privsFp)
if verr != nil {
@@ -358,20 +431,22 @@ func queryMode(
// getMultiRepoEnv returns an appropriate MultiRepoEnv for this invocation of the command
func getMultiRepoEnv(ctx context.Context, apr *argparser.ArgParseResults, dEnv *env.DoltEnv, cmd SqlCmd) (*env.MultiRepoEnv, errhand.VerboseError) {
var mrEnv *env.MultiRepoEnv
multiDir, multiDbMode := apr.GetValue(multiDBDirFlag)
if multiDbMode {
var err error
mrEnv, err = env.LoadMultiEnvFromDir(ctx, env.GetCurrentUserHomeDir, dEnv.Config.WriteableConfig(), dEnv.FS, multiDir, cmd.VersionStr, dEnv.IgnoreLockFile)
if err != nil {
return nil, errhand.VerboseErrorFromError(err)
}
} else {
var err error
mrEnv, err = env.DoltEnvAsMultiEnv(ctx, dEnv)
if err != nil {
return nil, errhand.VerboseErrorFromError(err)
}
var err error
fs := dEnv.FS
if dataDir, ok := apr.GetValue(MultiDBDirFlag); ok {
fs, err = fs.WithWorkingDir(dataDir)
} else if dataDir, ok := apr.GetValue(DataDirFlag); ok {
fs, err = fs.WithWorkingDir(dataDir)
}
if err != nil {
return nil, errhand.VerboseErrorFromError(err)
}
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), fs, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
return nil, errhand.VerboseErrorFromError(err)
}
return mrEnv, nil
@@ -635,12 +710,17 @@ func validateSqlArgs(apr *argparser.ArgParseResults) error {
_, batch := apr.GetValue(BatchFlag)
_, list := apr.GetValue(listSavedFlag)
_, execute := apr.GetValue(executeFlag)
_, multiDB := apr.GetValue(multiDBDirFlag)
_, dataDir := apr.GetValue(DataDirFlag)
_, multiDbDir := apr.GetValue(MultiDBDirFlag)
if len(apr.Args) > 0 && !query {
return errhand.BuildDError("Invalid Argument: use --query or -q to pass inline SQL queries").Build()
}
if dataDir && multiDbDir {
return errhand.BuildDError("Invalid Argument: --data-dir is not compatible with --multi-db-dir").Build()
}
if execute {
if list {
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --list-saved").Build()
@@ -650,8 +730,8 @@ func validateSqlArgs(apr *argparser.ArgParseResults) error {
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --message|-m").Build()
} else if save {
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --save|-s").Build()
} else if multiDB {
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --multi-db-dir").Build()
} else if dataDir || multiDbDir {
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --data-dir").Build()
}
}
@@ -664,13 +744,13 @@ func validateSqlArgs(apr *argparser.ArgParseResults) error {
return errhand.BuildDError("Invalid Argument: --list-saved is not compatible with --message|-m").Build()
} else if save {
return errhand.BuildDError("Invalid Argument: --list-saved is not compatible with --save|-s").Build()
} else if multiDB {
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --multi-db-dir").Build()
} else if dataDir || multiDbDir {
return errhand.BuildDError("Invalid Argument: --execute|-x is not compatible with --data-dir").Build()
}
}
if save && multiDB {
return errhand.BuildDError("Invalid Argument: --multi-db-dir queries cannot be saved").Build()
if save && (dataDir || multiDbDir) {
return errhand.BuildDError("Invalid Argument: --data-dir queries cannot be saved").Build()
}
if batch {
@@ -692,6 +772,10 @@ func validateSqlArgs(apr *argparser.ArgParseResults) error {
}
}
if multiDbDir {
cli.PrintErrln("WARNING: --multi-db-dir is deprecated, use --data-dir instead")
}
return nil
}
+18 -18
View File
@@ -85,30 +85,23 @@ func Serve(
}
var mrEnv *env.MultiRepoEnv
dbNamesAndPaths := serverConfig.DatabaseNamesAndPaths()
var err error
fs := dEnv.FS
dbNamesAndPaths := serverConfig.DatabaseNamesAndPaths()
if len(dbNamesAndPaths) == 0 {
if len(serverConfig.DataDir()) > 0 && serverConfig.DataDir() != "." {
fs, err := dEnv.FS.WithWorkingDir(serverConfig.DataDir())
if err != nil {
return err, nil
}
// TODO: this should be the global config, probably?
mrEnv, err = env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), fs, dEnv.Version, dEnv.IgnoreLockFile)
if err != nil {
return err, nil
}
} else {
var err error
mrEnv, err = env.DoltEnvAsMultiEnv(ctx, dEnv)
fs, err = dEnv.FS.WithWorkingDir(serverConfig.DataDir())
if err != nil {
return err, nil
}
}
mrEnv, err = env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), fs, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
return err, nil
}
} else {
var err error
fs := dEnv.FS
if len(serverConfig.DataDir()) > 0 {
fs, err = fs.WithWorkingDir(serverConfig.DataDir())
if err != nil {
@@ -116,8 +109,15 @@ func Serve(
}
}
// TODO: this should be the global config, probably?
mrEnv, err = env.LoadMultiEnv(ctx, env.GetCurrentUserHomeDir, dEnv.Config.WriteableConfig(), fs, version, dEnv.IgnoreLockFile, dbNamesAndPaths...)
mrEnv, err = env.MultiEnvForPaths(
ctx,
env.GetCurrentUserHomeDir,
dEnv.Config.WriteableConfig(),
fs,
version,
dEnv.IgnoreLockFile,
dbNamesAndPaths...,
)
if err != nil {
return err, nil
@@ -47,6 +47,8 @@ const (
defaultQueryParallelism = 2
defaultPersistenceBahavior = loadPerisistentGlobals
defaultDataDir = "."
defaultCfgDir = "./.doltcfg"
defaultPrivilegeFilePath = "./.doltcfg/privileges.db"
defaultMetricsHost = ""
defaultMetricsPort = -1
)
@@ -102,6 +104,8 @@ type ServerConfig interface {
DatabaseNamesAndPaths() []env.EnvNameAndPath
// DataDir is the path to a directory to use as the data dir, both to create new databases and locate existing ones.
DataDir() string
// CfgDir is the path to a directory to use to store the dolt configuration files.
CfgDir() string
// MaxConnections returns the maximum number of simultaneous connections the server will allow. The default is 1
MaxConnections() uint64
// QueryParallelism returns the parallelism that should be used by the go-mysql-server analyzer
@@ -139,6 +143,7 @@ type commandLineServerConfig struct {
logLevel LogLevel
dbNamesAndPaths []env.EnvNameAndPath
dataDir string
cfgDir string
autoCommit bool
maxConnections uint64
queryParallelism int
@@ -258,6 +263,10 @@ func (cfg *commandLineServerConfig) DataDir() string {
return cfg.dataDir
}
func (cfg *commandLineServerConfig) CfgDir() string {
return cfg.cfgDir
}
// withHost updates the host and returns the called `*commandLineServerConfig`, which is useful for chaining calls.
func (cfg *commandLineServerConfig) withHost(host string) *commandLineServerConfig {
cfg.host = host
@@ -323,6 +332,11 @@ func (cfg *commandLineServerConfig) withDataDir(dataDir string) *commandLineServ
return cfg
}
func (cfg *commandLineServerConfig) withCfgDir(cfgDir string) *commandLineServerConfig {
cfg.cfgDir = cfgDir
return cfg
}
func (cfg *commandLineServerConfig) withPersistenceBehavior(persistenceBehavior string) *commandLineServerConfig {
cfg.persistenceBehavior = persistenceBehavior
return cfg
@@ -348,6 +362,8 @@ func DefaultServerConfig() *commandLineServerConfig {
queryParallelism: defaultQueryParallelism,
persistenceBehavior: defaultPersistenceBahavior,
dataDir: defaultDataDir,
cfgDir: defaultCfgDir,
privilegeFilePath: defaultPrivilegeFilePath,
}
}
+6 -1
View File
@@ -51,7 +51,7 @@ You may also start a dolt server and automatically connect to it using this clie
Similar to {{.EmphasisLeft}}dolt sql-server{{.EmphasisRight}}, this command may use a YAML configuration file or command line arguments. For more information on the YAML file, refer to the documentation on {{.EmphasisLeft}}dolt sql-server{{.EmphasisRight}}.`,
Synopsis: []string{
"[-d] --config {{.LessThan}}file{{.GreaterThan}}",
"[-d] [-H {{.LessThan}}host{{.GreaterThan}}] [-P {{.LessThan}}port{{.GreaterThan}}] [-u {{.LessThan}}user{{.GreaterThan}}] [-p {{.LessThan}}password{{.GreaterThan}}] [-t {{.LessThan}}timeout{{.GreaterThan}}] [-l {{.LessThan}}loglevel{{.GreaterThan}}] [--multi-db-dir {{.LessThan}}directory{{.GreaterThan}}] [--query-parallelism {{.LessThan}}num-go-routines{{.GreaterThan}}] [-r]",
"[-d] [-H {{.LessThan}}host{{.GreaterThan}}] [-P {{.LessThan}}port{{.GreaterThan}}] [-u {{.LessThan}}user{{.GreaterThan}}] [-p {{.LessThan}}password{{.GreaterThan}}] [-t {{.LessThan}}timeout{{.GreaterThan}}] [-l {{.LessThan}}loglevel{{.GreaterThan}}] [--data-dir {{.LessThan}}directory{{.GreaterThan}}] [--query-parallelism {{.LessThan}}num-go-routines{{.GreaterThan}}] [-r]",
},
}
@@ -112,6 +112,11 @@ func (cmd SqlClientCmd) Exec(ctx context.Context, commandStr string, args []stri
cli.PrintErrln(err.Error())
return 1
}
if err = SetupDoltConfig(dEnv, apr, serverConfig); err != nil {
cli.PrintErrln(color.RedString("Bad Configuration"))
cli.PrintErrln(err.Error())
return 1
}
cli.PrintErrf("Starting server with Config %v\n", ConfigInfo(serverConfig))
serverController = NewServerController()
+116 -16
View File
@@ -18,6 +18,7 @@ import (
"context"
"errors"
"fmt"
"path/filepath"
"strconv"
"strings"
@@ -25,6 +26,7 @@ import (
"github.com/fatih/color"
"github.com/dolthub/dolt/go/cmd/dolt/cli"
"github.com/dolthub/dolt/go/cmd/dolt/commands"
eventsapi "github.com/dolthub/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
"github.com/dolthub/dolt/go/libraries/doltcore/env"
"github.com/dolthub/dolt/go/libraries/utils/argparser"
@@ -39,13 +41,11 @@ const (
timeoutFlag = "timeout"
readonlyFlag = "readonly"
logLevelFlag = "loglevel"
multiDBDirFlag = "multi-db-dir"
noAutoCommitFlag = "no-auto-commit"
configFileFlag = "config"
queryParallelismFlag = "query-parallelism"
maxConnectionsFlag = "max-connections"
persistenceBehaviorFlag = "persistence-behavior"
privilegeFilePathFlag = "privilege-file"
)
func indentLines(s string) string {
@@ -102,7 +102,7 @@ SUPPORTED CONFIG FILE FIELDS:
If a config file is not provided many of these settings may be configured on the command line.`,
Synopsis: []string{
"--config {{.LessThan}}file{{.GreaterThan}}",
"[-H {{.LessThan}}host{{.GreaterThan}}] [-P {{.LessThan}}port{{.GreaterThan}}] [-u {{.LessThan}}user{{.GreaterThan}}] [-p {{.LessThan}}password{{.GreaterThan}}] [-t {{.LessThan}}timeout{{.GreaterThan}}] [-l {{.LessThan}}loglevel{{.GreaterThan}}] [--multi-db-dir {{.LessThan}}directory{{.GreaterThan}}] [--query-parallelism {{.LessThan}}num-go-routines{{.GreaterThan}}] [-r]",
"[-H {{.LessThan}}host{{.GreaterThan}}] [-P {{.LessThan}}port{{.GreaterThan}}] [-u {{.LessThan}}user{{.GreaterThan}}] [-p {{.LessThan}}password{{.GreaterThan}}] [-t {{.LessThan}}timeout{{.GreaterThan}}] [-l {{.LessThan}}loglevel{{.GreaterThan}}] [--data-dir {{.LessThan}}directory{{.GreaterThan}}] [--query-parallelism {{.LessThan}}num-go-routines{{.GreaterThan}}] [-r]",
},
}
@@ -137,12 +137,14 @@ func (cmd SqlServerCmd) ArgParser() *argparser.ArgParser {
ap.SupportsInt(timeoutFlag, "t", "connection timeout", fmt.Sprintf("Defines the timeout, in seconds, used for connections\nA value of `0` represents an infinite timeout (default `%v`)", serverConfig.ReadTimeout()))
ap.SupportsFlag(readonlyFlag, "r", "Disable modification of the database")
ap.SupportsString(logLevelFlag, "l", "log level", fmt.Sprintf("Defines the level of logging provided\nOptions are: `trace', `debug`, `info`, `warning`, `error`, `fatal` (default `%v`)", serverConfig.LogLevel()))
ap.SupportsString(multiDBDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases.")
ap.SupportsString(commands.DataDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within. Defaults the the current directory.")
ap.SupportsString(commands.MultiDBDirFlag, "", "directory", "Defines a directory whose subdirectories should all be dolt data repositories accessible as independent databases within. Defaults the the current directory. This is deprecated, you should use --data-dir instead.")
ap.SupportsString(commands.CfgDirFlag, "", "directory", "Defines a directory that contains configuration files for dolt. Defaults to $data-dir/.doltcfg.")
ap.SupportsFlag(noAutoCommitFlag, "", "Set @@autocommit = off for the server")
ap.SupportsInt(queryParallelismFlag, "", "num-go-routines", fmt.Sprintf("Set the number of go routines spawned to handle each query (default `%d`)", serverConfig.QueryParallelism()))
ap.SupportsInt(maxConnectionsFlag, "", "max-connections", fmt.Sprintf("Set the number of connections handled by the server (default `%d`)", serverConfig.MaxConnections()))
ap.SupportsString(persistenceBehaviorFlag, "", "persistence-behavior", fmt.Sprintf("Indicate whether to `load` or `ignore` persisted global variables (default `%s`)", serverConfig.PersistenceBehavior()))
ap.SupportsString(privilegeFilePathFlag, "", "privilege file", "Path to a file to load and store users and grants. Without this flag, the database has a single user with all permissions, and more cannot be added.")
ap.SupportsString(commands.PrivsFilePathFlag, "", "privilege file", "Path to a file to load and store users and grants. Defaults to $doltcfg-dir/privileges.db")
return ap
}
@@ -152,7 +154,7 @@ func (cmd SqlServerCmd) EventType() eventsapi.ClientEventType {
}
// RequiresRepo indicates that this command does not have to be run from within a dolt data repository directory.
// In this case it is because this command supports the multiDBDirFlag which can pass in a directory. In the event that
// In this case it is because this command supports the dataDirFlag which can pass in a directory. In the event that
// that parameter is not provided there is additional error handling within this command to make sure that this was in
// fact run from within a dolt data repository directory.
func (cmd SqlServerCmd) RequiresRepo() bool {
@@ -171,6 +173,14 @@ func (cmd SqlServerCmd) Exec(ctx context.Context, commandStr string, args []stri
return startServer(newCtx, cmd.VersionStr, commandStr, args, dEnv, controller)
}
func validateSqlServerArgs(apr *argparser.ArgParseResults) error {
_, multiDbDir := apr.GetValue(commands.MultiDBDirFlag)
if multiDbDir {
cli.PrintErrln("WARNING: --multi-db-dir is deprecated, use --data-dir instead")
}
return nil
}
func startServer(ctx context.Context, versionStr, commandStr string, args []string, dEnv *env.DoltEnv, serverController *ServerController) int {
ap := SqlServerCmd{}.ArgParser()
help, _ := cli.HelpAndUsagePrinters(cli.CommandDocsForCommandString(commandStr, sqlServerDocs, ap))
@@ -179,8 +189,10 @@ func startServer(ctx context.Context, versionStr, commandStr string, args []stri
dEnv.Config.SetFailsafes(env.DefaultFailsafeConfig)
apr := cli.ParseArgsOrDie(ap, args, help)
if err := validateSqlServerArgs(apr); err != nil {
return 1
}
serverConfig, err := GetServerConfig(dEnv, apr)
if err != nil {
if serverController != nil {
serverController.StopServer()
@@ -191,6 +203,16 @@ func startServer(ctx context.Context, versionStr, commandStr string, args []stri
cli.PrintErrln(err.Error())
return 1
}
if err = SetupDoltConfig(dEnv, apr, serverConfig); err != nil {
if serverController != nil {
serverController.StopServer()
serverController.serverStopped(err)
}
cli.PrintErrln(color.RedString("Failed to start server. Bad Configuration"))
cli.PrintErrln(err.Error())
return 1
}
cli.PrintErrf("Starting server with Config %v\n", ConfigInfo(serverConfig))
@@ -216,6 +238,79 @@ func GetServerConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResults) (ServerC
return getCommandLineServerConfig(dEnv, apr)
}
// SetupDoltConfig updates the given server config with where to create .doltcfg directory
func SetupDoltConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResults, config ServerConfig) error {
if _, ok := apr.GetValue(configFileFlag); ok {
return nil
}
serverConfig := config.(*commandLineServerConfig)
_, dataDirFlag1 := apr.GetValue(commands.MultiDBDirFlag)
_, dataDirFlag2 := apr.GetValue(commands.DataDirFlag)
dataDirSpecified := dataDirFlag1 || dataDirFlag2
var cfgDirPath string
dataDir := serverConfig.DataDir()
cfgDir, cfgDirSpecified := apr.GetValue(commands.CfgDirFlag)
if cfgDirSpecified {
if exists, _ := dEnv.FS.Exists(cfgDir); !exists {
if err := dEnv.FS.MkDirs(cfgDir); err != nil {
return err
}
}
cfgDirPath = cfgDir
} else if dataDirSpecified {
path := filepath.Join(dataDir, commands.DefaultCfgDirName)
if exists, _ := dEnv.FS.Exists(path); !exists {
if err := dEnv.FS.MkDirs(path); err != nil {
return err
}
}
cfgDirPath = path
} else {
// Look in parent directory for doltcfg
path := filepath.Join("..", commands.DefaultCfgDirName)
if exists, isDir := dEnv.FS.Exists(path); exists && isDir {
cfgDirPath = path
}
// Look in data directory (which is necessarily current directory) for doltcfg, create one here if none found
path = filepath.Join(dataDir, commands.DefaultCfgDirName)
if exists, isDir := dEnv.FS.Exists(path); exists && isDir {
if len(cfgDirPath) != 0 {
p1, err := dEnv.FS.Abs(cfgDirPath)
if err != nil {
return err
}
p2, err := dEnv.FS.Abs(path)
if err != nil {
return err
}
return commands.ErrMultipleDoltCfgDirs.New(p1, p2)
}
cfgDirPath = path
} else if len(cfgDirPath) == 0 {
if err := dEnv.FS.MkDirs(path); err != nil {
return err
}
cfgDirPath = path
}
}
serverConfig.withCfgDir(cfgDirPath)
if privsFp, ok := apr.GetValue(commands.PrivsFilePathFlag); ok {
serverConfig.withPrivilegeFilePath(privsFp)
} else {
path, err := dEnv.FS.Abs(filepath.Join(cfgDirPath, commands.DefaultPrivsName))
if err != nil {
return err
}
serverConfig.withPrivilegeFilePath(path)
}
return nil
}
// getCommandLineServerConfig sets server config variables and persisted global variables with values defined on command line.
// If not defined, it sets variables to default values.
func getCommandLineServerConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResults) (ServerConfig, error) {
@@ -268,16 +363,24 @@ func getCommandLineServerConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResult
serverConfig.withLogLevel(LogLevel(logLevel))
}
if multiDBDir, ok := apr.GetValue(multiDBDirFlag); ok {
dbNamesAndPaths, err := env.DBNamesAndPathsFromDir(dEnv.FS, multiDBDir)
if dataDir, ok := apr.GetValue(commands.MultiDBDirFlag); ok {
dbNamesAndPaths, err := env.DBNamesAndPathsFromDir(dEnv.FS, dataDir)
if err != nil {
return nil, errors.New("failed to read databases in path specified by --multi-db-dir. error: " + err.Error())
return nil, errors.New("failed to read databases in path specified by --data-dir. error: " + err.Error())
}
// We set datadir to multi-db-dir here too
// TODO: rename multi-db-dir to data_dir
serverConfig.withDBNamesAndPaths(dbNamesAndPaths).withDataDir(multiDBDir)
serverConfig.withDBNamesAndPaths(dbNamesAndPaths).withDataDir(dataDir)
}
if dataDir, ok := apr.GetValue(commands.DataDirFlag); ok {
dbNamesAndPaths, err := env.DBNamesAndPathsFromDir(dEnv.FS, dataDir)
if err != nil {
return nil, errors.New("failed to read databases in path specified by --data-dir. error: " + err.Error())
}
serverConfig.withDBNamesAndPaths(dbNamesAndPaths).withDataDir(dataDir)
}
if queryParallelism, ok := apr.GetInt(queryParallelismFlag); ok {
@@ -293,9 +396,6 @@ func getCommandLineServerConfig(dEnv *env.DoltEnv, apr *argparser.ArgParseResult
}
serverConfig.autoCommit = !apr.Contains(noAutoCommitFlag)
if privilegeFilePath, ok := apr.GetValue(privilegeFilePathFlag); ok {
serverConfig.withPrivilegeFilePath(privilegeFilePath)
}
return serverConfig, nil
}
@@ -121,6 +121,7 @@ type YAMLConfig struct {
DatabaseConfig []DatabaseYAMLConfig `yaml:"databases"`
PerformanceConfig PerformanceYAMLConfig `yaml:"performance"`
DataDirStr *string `yaml:"data_dir"`
CfgDirStr *string `yaml:"cfg_dir"`
MetricsConfig MetricsYAMLConfig `yaml:"metrics"`
PrivilegeFile *string `yaml:"privilege_file"`
Vars []UserSessionVars `yaml:"user_session_vars"`
@@ -381,3 +382,10 @@ func (cfg YAMLConfig) DataDir() string {
}
return ""
}
func (cfg YAMLConfig) CfgDir() string {
if cfg.CfgDirStr != nil {
return *cfg.DataDirStr
}
return ""
}
+1 -1
View File
@@ -58,7 +58,7 @@ require (
)
require (
github.com/dolthub/go-mysql-server v0.12.1-0.20220713232319-7ff7cdf2c557
github.com/dolthub/go-mysql-server v0.12.1-0.20220714001054-da066833dd8f
github.com/google/flatbuffers v2.0.6+incompatible
github.com/gosuri/uilive v0.0.4
github.com/kch42/buzhash v0.0.0-20160816060738-9bdec3dec7c6
+2 -3
View File
@@ -173,8 +173,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dolthub/fslock v0.0.3 h1:iLMpUIvJKMKm92+N1fmHVdxJP5NdyDK5bK7z7Ba2s2U=
github.com/dolthub/fslock v0.0.3/go.mod h1:QWql+P17oAAMLnL4HGB5tiovtDuAjdDTPbuqx7bYfa0=
github.com/dolthub/go-mysql-server v0.12.1-0.20220713232319-7ff7cdf2c557 h1:1nkWy/hLg1MecgiI7N6Y61I/mbw2Yer1hEDGvPIeyvU=
github.com/dolthub/go-mysql-server v0.12.1-0.20220713232319-7ff7cdf2c557/go.mod h1:fhyVDvV0K59cdk9N7TQsPjr2Hp/Qseej8+R9tVqPDCg=
github.com/dolthub/go-mysql-server v0.12.1-0.20220714001054-da066833dd8f h1:ELaJt6/rpR1bIafRJriYeLjIv+P6Gg3DV2IaKRQ8RQY=
github.com/dolthub/go-mysql-server v0.12.1-0.20220714001054-da066833dd8f/go.mod h1:fhyVDvV0K59cdk9N7TQsPjr2Hp/Qseej8+R9tVqPDCg=
github.com/dolthub/ishell v0.0.0-20220112232610-14e753f0f371 h1:oyPHJlzumKta1vnOQqUnfdz+pk3EmnHS3Nd0cCT0I2g=
github.com/dolthub/ishell v0.0.0-20220112232610-14e753f0f371/go.mod h1:dhGBqcCEfK5kuFmeO5+WOx3hqc1k3M29c1oS/R7N4ms=
github.com/dolthub/jsonpath v0.0.0-20210609232853-d49537a30474 h1:xTrR+l5l+1Lfq0NvhiEsctylXinUMFhhsqaEcl414p8=
@@ -236,7 +236,6 @@ github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+1 -1
View File
@@ -43,7 +43,7 @@ var DoltDataDir = filepath.Join(DoltDir, DataDir)
type FileFactory struct {
}
// CreateDB creates an local filesys backed database
// CreateDB creates a local filesys backed database
func (fact FileFactory) CreateDB(ctx context.Context, nbf *types.NomsBinFormat, urlObj *url.URL, params map[string]interface{}) (datas.Database, types.ValueReadWriter, tree.NodeStore, error) {
path, err := url.PathUnescape(urlObj.Path)
+27 -104
View File
@@ -17,7 +17,6 @@ package env
import (
"context"
"fmt"
"net/url"
"os"
"path/filepath"
"strings"
@@ -25,7 +24,6 @@ import (
"gopkg.in/src-d/go-errors.v1"
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
"github.com/dolthub/dolt/go/libraries/doltcore/dbfactory"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
"github.com/dolthub/dolt/go/libraries/utils/config"
@@ -228,80 +226,6 @@ func getRepoRootDir(path, pathSeparator string) string {
return name
}
// DoltEnvAsMultiEnv returns a MultiRepoEnv which wraps the DoltEnv and names it based on the directory DoltEnv refers
// to. If the env given doesn't contain a valid dolt database, creates a MultiEnvRepo from any databases found in the
// directory at the root of the filesystem and returns that.
func DoltEnvAsMultiEnv(ctx context.Context, dEnv *DoltEnv) (*MultiRepoEnv, error) {
if !dEnv.Valid() {
cfg := dEnv.Config.WriteableConfig()
return MultiEnvForDirectory(ctx, cfg, dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile)
}
dbName := "dolt"
if dEnv.RSLoadErr != nil {
return nil, fmt.Errorf("error loading environment: %s", dEnv.RSLoadErr.Error())
} else if dEnv.DBLoadError != nil {
return nil, fmt.Errorf("error loading environment: %s", dEnv.DBLoadError.Error())
} else if dEnv.CfgLoadErr != nil {
return nil, fmt.Errorf("error loading environment: %s", dEnv.CfgLoadErr.Error())
}
u, err := earl.Parse(dEnv.urlStr)
if err == nil {
if u.Scheme == dbfactory.FileScheme {
path, err := url.PathUnescape(u.Path)
if err == nil {
path, err = dEnv.FS.Abs(path)
if err == nil {
dirName := getRepoRootDir(path, string(os.PathSeparator))
if dirName != "" {
dbName = dirToDBName(dirName)
}
}
}
}
}
// TODO: revisit this, callers should specify which config they want to use in a multi-DB environment
localCfg := dEnv.Config.WriteableConfig()
mrEnv := &MultiRepoEnv{
envs: make([]NamedEnv, 0),
fs: dEnv.FS,
cfg: localCfg,
}
mrEnv.AddEnv(dbName, dEnv)
// If there are other directories in the same root, try to load them as additional databases
dEnv.FS.Iter(".", false, func(path string, size int64, isDir bool) (stop bool) {
if !isDir {
return false
}
dir := filepath.Base(path)
newFs, err := dEnv.FS.WithWorkingDir(dir)
if err != nil {
return false
}
newEnv := Load(ctx, GetCurrentUserHomeDir, newFs, doltdb.LocalDirDoltDB, dEnv.Version)
if newEnv.Valid() {
mrEnv.AddEnv(dirToDBName(dir), newEnv)
}
return false
})
return mrEnv, nil
}
// MultiEnvForDirectory returns a MultiRepoEnv for the directory rooted at the file system given
func MultiEnvForDirectory(
ctx context.Context,
@@ -309,6 +233,7 @@ func MultiEnvForDirectory(
fs filesys.Filesys,
version string,
ignoreLockFile bool,
oldDEnv *DoltEnv, // TODO: eventually get rid of this
) (*MultiRepoEnv, error) {
mrEnv := &MultiRepoEnv{
envs: make([]NamedEnv, 0),
@@ -317,6 +242,29 @@ func MultiEnvForDirectory(
ignoreLockFile: ignoreLockFile,
}
// Load current fs and put into mr env
var dEnv *DoltEnv
var dbName string
// Only directly copy the oldDEnv for in-memory filesystems; something is wrong with loading them
if _, ok := fs.(*filesys.InMemFS); ok {
dbName = "dolt"
dEnv = oldDEnv
} else {
path, err := fs.Abs("")
if err != nil {
return nil, err
}
envName := getRepoRootDir(path, string(os.PathSeparator))
dbName = dirToDBName(envName)
dEnv = oldDEnv
// TODO: idk how or why, but this breaks docs.bats
//dEnv = Load(ctx, GetCurrentUserHomeDir, fs, doltdb.LocalDirDoltDB, version)
}
if dEnv.Valid() {
mrEnv.AddEnv(dbName, dEnv)
}
// If there are other directories in the directory, try to load them as additional databases
fs.Iter(".", false, func(path string, size int64, isDir bool) (stop bool) {
if !isDir {
@@ -330,7 +278,7 @@ func MultiEnvForDirectory(
return false
}
newEnv := Load(ctx, GetCurrentUserHomeDir, newFs, doltdb.LocalDirDoltDB, version)
newEnv := Load(ctx, GetCurrentUserHomeDir, newFs, doltdb.LocalDirDoltDB, dEnv.Version)
if newEnv.Valid() {
mrEnv.AddEnv(dirToDBName(dir), newEnv)
}
@@ -341,9 +289,9 @@ func MultiEnvForDirectory(
return mrEnv, nil
}
// LoadMultiEnv takes a variable list of EnvNameAndPath objects loads each of the environments, and returns a new
// MultiEnvForPaths takes a variable list of EnvNameAndPath objects loads each of the environments, and returns a new
// MultiRepoEnv
func LoadMultiEnv(
func MultiEnvForPaths(
ctx context.Context,
hdp HomeDirProvider,
cfg config.ReadWriteConfig,
@@ -427,31 +375,6 @@ func DBNamesAndPathsFromDir(fs filesys.Filesys, path string) ([]EnvNameAndPath,
return envNamesAndPaths, nil
}
// LoadMultiEnvFromDir looks at each subfolder of the given path as a Dolt repository and attempts to return a MultiRepoEnv
// with initialized environments for each of those subfolder data repositories. subfolders whose name starts with '.' are
// skipped.
func LoadMultiEnvFromDir(
ctx context.Context,
hdp HomeDirProvider,
cfg config.ReadWriteConfig,
fs filesys.Filesys,
path, version string,
ignoreLockFile bool,
) (*MultiRepoEnv, error) {
envNamesAndPaths, err := DBNamesAndPathsFromDir(fs, path)
if err != nil {
return nil, err
}
multiDbDirFs, err := fs.WithWorkingDir(path)
if err != nil {
return nil, errhand.VerboseErrorFromError(err)
}
return LoadMultiEnv(ctx, hdp, cfg, multiDbDirFs, version, ignoreLockFile, envNamesAndPaths...)
}
func dirToDBName(dirName string) string {
dbName := strings.TrimSpace(dirName)
dbName = strings.Map(func(r rune) rune {
+25 -34
View File
@@ -96,7 +96,7 @@ func initRepoWithRelativePath(t *testing.T, envPath string, hdp HomeDirProvider)
return Load(context.Background(), hdp, fs, urlStr, "test")
}
func TestDoltEnvAsMultiEnv(t *testing.T) {
func TestMultiEnvForDirectory(t *testing.T) {
rootPath, err := test.ChangeToTestDir("TestDoltEnvAsMultiEnv")
require.NoError(t, err)
@@ -104,17 +104,34 @@ func TestDoltEnvAsMultiEnv(t *testing.T) {
envPath := filepath.Join(rootPath, " test---name _ 123")
dEnv := initRepoWithRelativePath(t, envPath, hdp)
mrEnv, err := DoltEnvAsMultiEnv(context.Background(), dEnv)
mrEnv, err := MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
require.NoError(t, err)
assert.Len(t, mrEnv.envs, 1)
for _, e := range mrEnv.envs {
assert.Equal(t, "test_name_123", e.name)
assert.Equal(t, dEnv, e.env)
type envCmp struct {
name string
doltDir string
}
expected := []envCmp{
{
name: "test_name_123",
doltDir: dEnv.GetDoltDir(),
},
}
var actual []envCmp
for _, env := range mrEnv.envs {
actual = append(actual, envCmp{
name: env.name,
doltDir: env.env.GetDoltDir(),
})
}
assert.Equal(t, expected, actual)
}
func TestDoltEnvAsMultiEnvWithMultipleRepos(t *testing.T) {
func TestMultiEnvForDirectoryWithMultipleRepos(t *testing.T) {
rootPath, err := test.ChangeToTestDir("TestDoltEnvAsMultiEnvWithMultipleRepos")
require.NoError(t, err)
@@ -124,7 +141,7 @@ func TestDoltEnvAsMultiEnvWithMultipleRepos(t *testing.T) {
subEnv1 := initRepoWithRelativePath(t, filepath.Join(envPath, "abc"), hdp)
subEnv2 := initRepoWithRelativePath(t, filepath.Join(envPath, "def"), hdp)
mrEnv, err := DoltEnvAsMultiEnv(context.Background(), dEnv)
mrEnv, err := MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
require.NoError(t, err)
assert.Len(t, mrEnv.envs, 3)
@@ -183,7 +200,7 @@ func TestLoadMultiEnv(t *testing.T) {
envNamesAndPaths[i] = EnvNameAndPath{name, filepath.Join(rootPath, name)}
}
mrEnv, err := LoadMultiEnv(context.Background(), hdp, config.NewEmptyMapConfig(), filesys.LocalFS, "test", false, envNamesAndPaths...)
mrEnv, err := MultiEnvForPaths(context.Background(), hdp, config.NewEmptyMapConfig(), filesys.LocalFS, "test", false, envNamesAndPaths...)
require.NoError(t, err)
for _, name := range names {
@@ -191,29 +208,3 @@ func TestLoadMultiEnv(t *testing.T) {
assert.NotNil(t, e)
}
}
func TestLoadMultiEnvFromDir(t *testing.T) {
dirNameToDBName := map[string]string{
"env 1": "env_1",
" env 2": "env_2",
"env-3": "env_3",
}
names := make([]string, 0, len(dirNameToDBName))
for k := range dirNameToDBName {
names = append(names, k)
}
rootPath, hdp, envs := initMultiEnv(t, "TestLoadMultiEnvFromDir", names)
mrEnv, err := LoadMultiEnvFromDir(context.Background(), hdp, config.NewEmptyMapConfig(), filesys.LocalFS, rootPath, "test", false)
require.NoError(t, err)
assert.Len(t, mrEnv.envs, len(names))
for _, dirName := range names {
dbName := dirNameToDBName[dirName]
_, ok := envs[dirName]
require.True(t, ok)
e := mrEnv.GetEnv(dbName)
require.NotNil(t, e)
}
}
@@ -344,7 +344,7 @@ func setupConcurrencyTest(t *testing.T, ctx context.Context) (dEnv *env.DoltEnv)
}
func engineFromEnvironment(ctx context.Context, dEnv *env.DoltEnv) (eng *engine.SqlEngine) {
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
panic(err)
}
@@ -39,7 +39,7 @@ type sqlEngineTableReader struct {
}
func NewSqlEngineReader(ctx context.Context, dEnv *env.DoltEnv, tableName string) (*sqlEngineTableReader, error) {
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
return nil, err
}
@@ -65,7 +65,7 @@ type SqlEngineTableWriter struct {
}
func NewSqlEngineTableWriter(ctx context.Context, dEnv *env.DoltEnv, createTableSchema, rowOperationSchema schema.Schema, options *MoverOptions, statsCB noms.StatsCB) (*SqlEngineTableWriter, error) {
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
return nil, err
}
@@ -73,7 +73,7 @@ var _ enginetest.ValidatingHarness = (*DoltHarness)(nil)
func newDoltHarness(t *testing.T) *DoltHarness {
dEnv := dtestutils.CreateTestEnv()
mrEnv, err := env.DoltEnvAsMultiEnv(context.Background(), dEnv)
mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
require.NoError(t, err)
b := env.GetDefaultInitBranch(dEnv.Config)
pro := sqle.NewDoltDatabaseProvider(b, mrEnv.FileSystem())
@@ -322,7 +322,7 @@ func (d *DoltHarness) NewDatabaseProvider(dbs ...sql.Database) sql.MutableDataba
// NewDatabases must be called before NewDatabaseProvider, we grab the DoltEnvs
// previously created by NewDatabases and re-add them to the new MultiRepoEnv.
dEnv := dtestutils.CreateTestEnv()
mrEnv, err := env.DoltEnvAsMultiEnv(context.Background(), dEnv)
mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
require.NoError(d.t, err)
d.multiRepoEnv = mrEnv
for _, db := range dbs {
@@ -94,7 +94,7 @@ func setupIndexes(t *testing.T, tableName, insertQuery string) (*sqle.Engine, *e
cols: idxv2v1Cols,
}
mrEnv, err := env.DoltEnvAsMultiEnv(context.Background(), dEnv)
mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
require.NoError(t, err)
b := env.GetDefaultInitBranch(dEnv.Config)
pro := dsqle.NewDoltDatabaseProvider(b, mrEnv.FileSystem(), db)
@@ -308,7 +308,7 @@ func schemaToSchemaString(sch sql.Schema) (string, error) {
func sqlNewEngine(dEnv *env.DoltEnv) (*sqle.Engine, error) {
opts := editor.Options{Deaf: dEnv.DbEaFactory(), Tempdir: dEnv.TempTableFilesDir()}
db := dsql.NewDatabase("dolt", dEnv.DbData(), opts)
mrEnv, err := env.DoltEnvAsMultiEnv(context.Background(), dEnv)
mrEnv, err := env.MultiEnvForDirectory(context.Background(), dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
if err != nil {
return nil, err
}
@@ -32,63 +32,18 @@ type Persister struct {
var _ mysql_db.MySQLDbPersistence = &Persister{}
func NewPersister(fp string) *Persister {
// Create file if it does not exist, panic if something goes wrong
if len(fp) > 0 {
_, err := os.Stat(fp)
if err != nil && errors.Is(err, os.ErrNotExist) {
err = ioutil.WriteFile(fp, []byte{}, 0644)
}
if err != nil {
panic(err)
}
}
return &Persister{
privsFilePath: fp,
fileMutex: &sync.Mutex{},
}
}
func (p *Persister) ValidateCanPersist() error {
if len(p.privsFilePath) == 0 {
return errors.New("no privilege file specified, to persist users/grants run with --privilege-file=<file_path>")
}
return nil
}
func (p *Persister) Persist(ctx *sql.Context, data []byte) error {
p.fileMutex.Lock()
defer p.fileMutex.Unlock()
if err := p.ValidateCanPersist(); err != nil {
return err
}
return ioutil.WriteFile(p.privsFilePath, data, 0777)
}
// SetPrivilegeFilePath sets the file path that will be used for loading privileges.
// TODO: this is probably not needed
func (p Persister) SetPrivilegeFilePath(fp string) {
// do nothing for empty file path
if len(fp) == 0 {
return
}
p.fileMutex.Lock()
defer p.fileMutex.Unlock()
// Create file if it does not exist, panic if something goes wrong
_, err := os.Stat(fp)
if err != nil && errors.Is(err, os.ErrNotExist) {
err = ioutil.WriteFile(fp, []byte{}, 0644)
}
if err != nil {
panic(err)
}
p.privsFilePath = fp
}
// LoadData reads the mysql.db file, returns nil if empty or not found
func (p Persister) LoadData() ([]byte, error) {
// do nothing if no filepath specified
+1 -1
View File
@@ -85,7 +85,7 @@ func (fs localFS) WithWorkingDir(path string) (Filesys, error) {
var errStopMarker = errors.New("stop")
// Iter iterates over the files and subdirectories within a given directory (Optionally recursively.
// Iter iterates over the files and subdirectories within a given directory (Optionally recursively).
func (fs *localFS) Iter(path string, recursive bool, cb FSIterCB) error {
var err error
path, err = fs.Abs(path)
@@ -111,7 +111,7 @@ func setupBenchmark(t *testing.B, dEnv *env.DoltEnv) (*sql.Context, *engine.SqlE
Autocommit: true,
}
mrEnv, err := env.DoltEnvAsMultiEnv(ctx, dEnv)
mrEnv, err := env.MultiEnvForDirectory(ctx, dEnv.Config.WriteableConfig(), dEnv.FS, dEnv.Version, dEnv.IgnoreLockFile, dEnv)
require.NoError(t, err)
eng, err := engine.NewSqlEngine(ctx, mrEnv, engine.FormatNull, config)
-1
View File
@@ -132,4 +132,3 @@ TXT
[[ "$output" =~ "- 0. You just DO WHAT THE FUCK YOU WANT TO" ]] || false
[[ "$output" =~ "+ 0. You just DO WHAT THE F*CK YOU WANT TO" ]] || false
}
@@ -164,7 +164,7 @@ behavior:
start_multi_db_server() {
DEFAULT_DB="$1"
let PORT="$$ % (65536-1024) + 1024"
dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt --multi-db-dir ./ &
dolt sql-server --host 0.0.0.0 --port=$PORT --user dolt --data-dir ./ &
SERVER_PID=$!
wait_for_connection $PORT 5000
}
+12 -12
View File
@@ -61,18 +61,18 @@ teardown() {
cd dbs1/repo1
dolt config --local --add sqlserver.global.dolt_replicate_to_remote unknown
cd ../..
run dolt sql --multi-db-dir=dbs1 -b -q "select @@GLOBAL.dolt_replicate_to_remote"
run dolt sql --data-dir=dbs1 -b -q "select @@GLOBAL.dolt_replicate_to_remote"
[ "$status" -eq 0 ]
[[ "$output" =~ "remote1" ]] || false
}
@test "replication-multidb: push on sqlengine commit" {
dolt config --global --add sqlserver.global.dolt_replicate_to_remote remote1
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
clone_helper $TMPDIRS
run dolt sql --multi-db-dir=dbs2 -b -q "use repo1; show tables" -r csv
run dolt sql --data-dir=dbs2 -b -q "use repo1; show tables" -r csv
[ "$status" -eq 0 ]
[ "${#lines[@]}" -eq 4 ]
[[ "$output" =~ "t1" ]] || false
@@ -80,15 +80,15 @@ teardown() {
@test "replication-multidb: pull on read" {
push_helper $TMPDIRS
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
clone_helper $TMPDIRS
push_helper $TMPDIRS
dolt config --global --add sqlserver.global.dolt_read_replica_remote remote1
dolt config --global --add sqlserver.global.dolt_replicate_heads main
run dolt sql --multi-db-dir=dbs2 -b -q "use repo1; show tables" -r csv
run dolt sql --data-dir=dbs2 -b -q "use repo1; show tables" -r csv
[ "$status" -eq 0 ]
[ "${#lines[@]}" -eq 4 ]
[[ "$output" =~ "t1" ]] || false
@@ -96,7 +96,7 @@ teardown() {
@test "replication-multidb: missing database config" {
dolt config --global --add sqlserver.global.dolt_replicate_to_remote unknown
run dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
run dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
[ "$status" -eq 1 ]
[[ ! "$output" =~ "panic" ]] || false
[[ "$output" =~ "remote not found: 'unknown'" ]] || false
@@ -105,7 +105,7 @@ teardown() {
@test "replication-multidb: missing database config quiet warning" {
dolt config --global --add sqlserver.global.dolt_replicate_to_remote unknown
dolt config --global --add sqlserver.global.dolt_skip_replication_errors 1
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
}
@test "replication-multidb: sql-server push on commit" {
@@ -118,7 +118,7 @@ teardown() {
multi_query repo1 1 "select dolt_commit('-am', 'cm')"
clone_helper $TMPDIRS
run dolt sql --multi-db-dir=dbs2 -b -q "use repo1; show tables" -r csv
run dolt sql --data-dir=dbs2 -b -q "use repo1; show tables" -r csv
[ "$status" -eq 0 ]
[ "${#lines[@]}" -eq 4 ]
[[ "$output" =~ "t1" ]] || false
@@ -126,8 +126,8 @@ teardown() {
@test "replication-multidb: sql-server pull on read" {
push_helper $TMPDIRS
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
dolt sql --multi-db-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
dolt sql --data-dir=dbs1 -b -q "use repo1; create table t1 (a int primary key)"
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
clone_helper $TMPDIRS
push_helper $TMPDIRS
@@ -97,12 +97,12 @@ SQL
[ ! -d mydb ]
}
@test "sql-create-database: with multi-db-dir" {
@test "sql-create-database: with data-dir" {
skiponwindows "failing with file in use error"
mkdir db_dir
dolt sql --multi-db-dir db_dir <<SQL
dolt sql --data-dir db_dir <<SQL
create database mydb1;
create database mydb2;
use mydb1;
@@ -129,22 +129,22 @@ SQL
cd ../../
dolt sql --multi-db-dir db_dir -q "drop database mydb1"
dolt sql --data-dir db_dir -q "drop database mydb1"
[ ! -d db_dir/mydb1 ]
[ -d db_dir/mydb2 ]
run dolt sql --multi-db-dir db_dir -q "show databases"
run dolt sql --data-dir db_dir -q "show databases"
[ "$status" -eq 0 ]
[[ "$output" =~ "mydb2" ]] || false
[[ ! "$output" =~ "mydb1" ]] || false
[[ ! "$output" =~ "dolt_repo_$$" ]] || false
# multi-db-dir with abs path
# data-dir with abs path
absdir="/tmp/$$/db_dir"
mkdir -p "$absdir"
dolt sql --multi-db-dir "$absdir" <<SQL
dolt sql --data-dir "$absdir" <<SQL
create database mydb1;
create database mydb2;
use mydb1;
@@ -159,7 +159,7 @@ SQL
[ -d "$absdir/mydb1" ]
[ -d "$absdir/mydb2" ]
dolt sql --multi-db-dir "$absdir" -q "drop database mydb1"
dolt sql --data-dir "$absdir" -q "drop database mydb1"
[ ! -d "$absdir/mydb1" ]
[ -d "$absdir/mydb2" ]
@@ -359,7 +359,7 @@ SQL
cd workspace
dolt init
cd ..
dolt sql --multi-db-dir ./ -b -q "USE workspace;CREATE TABLE mytable LIKE otherdb.othertable;"
dolt sql --data-dir ./ -b -q "USE workspace;CREATE TABLE mytable LIKE otherdb.othertable;"
cd workspace
run dolt schema show mytable
[ "$status" -eq 0 ]
@@ -705,7 +705,7 @@ SQL
cd repo2
dolt init
cd ..
run dolt sql --multi-db-dir ./ -b -q "USE repo2;CREATE TEMPORARY TABLE temp2 LIKE repo1.tableone;"
run dolt sql --data-dir ./ -b -q "USE repo2;CREATE TEMPORARY TABLE temp2 LIKE repo1.tableone;"
[ "$status" -eq 0 ]
cd repo2
+13 -13
View File
@@ -20,7 +20,7 @@ teardown() {
}
seed_repos_with_tables_with_use_statements() {
dolt sql -r csv --multi-db-dir ./ -b -q "
dolt sql -r csv --data-dir ./ -b -q "
USE repo1;
CREATE TABLE r1_t1 (pk BIGINT, PRIMARY KEY(pk));
INSERT INTO r1_t1 (pk) values (0),(1),(2);
@@ -31,7 +31,7 @@ seed_repos_with_tables_with_use_statements() {
@test "sql-multi-db: sql multi-db test show databases" {
EXPECTED=$(echo -e "Database\ninformation_schema\nrepo1\nrepo2")
run dolt sql -r csv --multi-db-dir ./ -q "SHOW DATABASES"
run dolt sql -r csv --data-dir ./ -q "SHOW DATABASES"
[ "$status" -eq 0 ]
[[ "$output" =~ "$EXPECTED" ]] || false
}
@@ -40,26 +40,26 @@ seed_repos_with_tables_with_use_statements() {
seed_repos_with_tables_with_use_statements
EXPECTED_R1T1=$(echo -e "pk\n0\n1\n2")
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo1; SELECT * FROM r1_t1;"
run dolt sql -r csv --data-dir ./ -b -q "USE repo1; SELECT * FROM r1_t1;"
[ "$status" -eq 0 ]
[[ "$output" =~ "$EXPECTED_R1T1" ]] || false
EXPECTED_R2T1=$(echo -e "pk,c1\n2,200\n3,300\n4,400")
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo2; SELECT * FROM r2_t1;"
run dolt sql -r csv --data-dir ./ -b -q "USE repo2; SELECT * FROM r2_t1;"
[ "$status" -eq 0 ]
[[ "$output" =~ "$EXPECTED_R2T1" ]] || false
# test tables of other database inaccessible without database qualifier
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo1; SELECT * FROM r2_t1;"
run dolt sql -r csv --data-dir ./ -b -q "USE repo1; SELECT * FROM r2_t1;"
[ ! "$status" -eq 0 ]
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo2; SELECT * FROM r1_t1;"
run dolt sql -r csv --data-dir ./ -b -q "USE repo2; SELECT * FROM r1_t1;"
[ ! "$status" -eq 0 ]
# test tables in other databases accessible when qualified
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo1; SELECT * FROM repo2.r2_t1;"
run dolt sql -r csv --data-dir ./ -b -q "USE repo1; SELECT * FROM repo2.r2_t1;"
[ "$status" -eq 0 ]
[[ "$output" =~ "$EXPECTED_R2T1" ]] || false
run dolt sql -r csv --multi-db-dir ./ -b -q "USE repo2; SELECT * FROM repo1.r1_t1;"
run dolt sql -r csv --data-dir ./ -b -q "USE repo2; SELECT * FROM repo1.r1_t1;"
[ "$status" -eq 0 ]
[[ "$output" =~ "$EXPECTED_R1T1" ]] || false
}
@@ -67,7 +67,7 @@ seed_repos_with_tables_with_use_statements() {
@test "sql-multi-db: sql test use invalid db name" {
seed_repos_with_tables_with_use_statements
run dolt sql -r csv --multi-db-dir ./ -q "USE invalid_db_name;"
run dolt sql -r csv --data-dir ./ -q "USE invalid_db_name;"
[ ! "$status" -eq 0 ]
echo $output
[[ "$output" =~ "database not found: invalid_db_name" ]] || false
@@ -77,7 +77,7 @@ seed_repos_with_tables_with_use_statements() {
seed_repos_with_tables_with_use_statements
EXPECTED=$(echo -e "pk,c1\n2,200")
run dolt sql -r csv --multi-db-dir ./ -b -q "
run dolt sql -r csv --data-dir ./ -b -q "
USE repo1;
SELECT r1_t1.pk as pk, repo2.r2_t1.c1 as c1 FROM r1_t1 JOIN repo2.r2_t1 ON r1_t1.pk=repo2.r2_t1.pk;"
echo \"\"\"$output\"\"\"
@@ -87,11 +87,11 @@ seed_repos_with_tables_with_use_statements() {
@test "sql-multi-db: join on multiple databases with same name" {
seed_repos_with_tables_with_use_statements
dolt sql --multi-db-dir ./ -b -q "
dolt sql --data-dir ./ -b -q "
USE repo1;
CREATE TABLE r2_t1 (pk BIGINT, c1 BIGINT, PRIMARY KEY(pk));
INSERT INTO r2_t1 (pk, c1) values (2,200),(3,300),(4,400);"
run dolt sql --multi-db-dir ./ -q "select * from repo1.r2_t1 join repo2.r2_t1 on repo1.r2_t1.pk=repo2.r2_t1.pk"
run dolt sql --data-dir ./ -q "select * from repo1.r2_t1 join repo2.r2_t1 on repo1.r2_t1.pk=repo2.r2_t1.pk"
skip "Fails on Not unique table/alias"
[ "$status" -eq 0 ]
[[ ! $output =~ "Not unique table/alias" ]] || false
@@ -109,7 +109,7 @@ seed_repos_with_tables_with_use_statements() {
dolt clone file://../remote1 repo2
cd ..
run dolt sql --multi-db-dir ./subremotes -b -q "
run dolt sql --data-dir ./subremotes -b -q "
USE repo2;
select dolt_fetch() as f;" -r csv
[ "$status" -eq 0 ]
+284 -110
View File
@@ -2,151 +2,325 @@
load $BATS_TEST_DIRNAME/helper/common.bash
load $BATS_TEST_DIRNAME/helper/query-server-common.bash
make_repo() {
mkdir "$1"
cd "$1"
dolt init
cd ..
# working dir will be test_db
make_test_repo() {
rm -rf test_db
mkdir test_db
cd test_db
dolt init
}
show_users() {
dolt sql-client --host=0.0.0.0 --port=$PORT --user=dolt <<SQL
SELECT user from mysql.user order by user;
SQL
# working dir will be test_db
make_multi_test_repo() {
rm -rf test_db
mkdir test_db
cd test_db
mkdir db_dir
cd db_dir
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
}
create_user() {
dolt sql-client --host=0.0.0.0 --port=$PORT --user=dolt <<SQL
CREATE USER new_user;
SQL
# working dir will be dolt_repo$$
delete_test_repo() {
stop_sql_server
cd ..
rm -rf test_db
}
setup() {
setup_no_dolt_init
make_repo repo1
}
teardown() {
stop_sql_server
delete_test_repo
teardown_common
}
@test "sql-privs: no mysql.db, throws error when attempting to persist" {
skiponwindows "redirecting SQL to sql-client returns nothing after welcome messages"
cd repo1
@test "sql-privs: default options" {
make_test_repo
start_sql_server repo1
start_sql_server test_db
# expect only dolt user
run show_users
[ "$status" -eq 0 ]
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
[ "${lines[3]}" = '+------+' ]
[ "${lines[4]}" = '| User |' ]
[ "${lines[5]}" = '+------+' ]
[ "${lines[6]}" = '| dolt |' ]
[ "${lines[7]}" = '+------+' ]
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt"
# create user, expect error
run create_user
[[ "$output" =~ "no privilege file specified, to persist users/grants run with --privilege-file=<file_path>" ]] || false
# check for config directory
run ls -a
[[ "$output" =~ ".doltcfg" ]] || false
# create user
server_query test_db 1 "create user new_user" ""
# expect dolt user and new_user
run show_users
[ "$status" -eq 0 ]
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
[ "${lines[3]}" = '+------+' ]
[ "${lines[4]}" = '| User |' ]
[ "${lines[5]}" = '+------+' ]
[ "${lines[6]}" = '| dolt |' ]
[ "${lines[7]}" = '+------+' ]
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
}
# restart server
stop_sql_server
start_sql_server repo1
@test "sql-privs: multiple doltcfg directories causes error" {
# setup repo
rm -rf test_db
mkdir test_db
cd test_db
# expect only dolt user
run show_users
[ "$status" -eq 0 ]
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
[ "${lines[3]}" = '+------+' ]
[ "${lines[4]}" = '| User |' ]
[ "${lines[5]}" = '+------+' ]
[ "${lines[6]}" = '| dolt |' ]
[ "${lines[7]}" = '+------+' ]
mkdir .doltcfg
# remove mysql.db and privs.json if they exist
rm -f mysql.db
mkdir inner_db
cd inner_db
mkdir .doltcfg
# expect start server to fail
run start_sql_server inner_db
[ "$status" -eq 1 ]
[[ "$output" =~ "multiple .doltcfg directories detected" ]] || false
# leave the directory
cd ..
}
@test "sql-privs: has mysql.db, reads from mysql.db" {
skiponwindows "redirecting SQL to sql-client returns nothing after welcome messages"
cd repo1
@test "sql-privs: sql-server specify data-dir" {
make_multi_test_repo
# remove/replace mysql.db if they exist
rm -f mysql.db
cp $BATS_TEST_DIRNAME/mysql.db .
start_sql_server_with_args --host 0.0.0.0 --user=dolt --data-dir=db_dir
start_sql_server_with_args --privilege-file=mysql.db repo1
# show databases, expect all
server_query db1 1 "show databases" "Database\ndb1\ndb2\ndb3\ninformation_schema"
# expect dolt and mysql_user
run show_users
[ "$status" -eq 0 ]
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
[ "${lines[3]}" = '+------------+' ]
[ "${lines[4]}" = '| User |' ]
[ "${lines[5]}" = '+------------+' ]
[ "${lines[6]}" = '| dolt |' ]
[ "${lines[7]}" = '| mysql_user |' ]
[ "${lines[8]}" = '+------------+' ]
# show users, expect just root user
server_query db1 1 "select user from mysql.user order by user" "User\ndolt"
# expect no .doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
# expect .doltcfg in $datadir
run ls -a db_dir
[[ "$output" =~ ".doltcfg" ]] || false
# create new user
server_query db1 1 "create user new_user" ""
# show users, expect root user and new_user
server_query db1 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
# expect no privileges.db in current directory
run ls
! [[ "$output" =~ "privileges.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
# expect privileges.db in $datadir/.doltcfg
run ls db_dir/.doltcfg
[[ "$output" =~ "privileges.db" ]] || false
}
@test "sql-privs: specify doltcfg directory" {
make_test_repo
start_sql_server_with_args --host 0.0.0.0 --user=dolt --doltcfg-dir=doltcfgdir
# show users, expect just root user
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt"
# expect only custom doltcfgdir
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# create new_user
server_query test_db 1 "create user new_user" ""
# show users, expect root user and new_user
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
# expect privileges file in doltcfgdir
run ls doltcfgdir
[[ "$output" =~ "privileges.db" ]] || false
}
@test "sql-privs: specify privilege file" {
make_test_repo
start_sql_server_with_args --host 0.0.0.0 --user=dolt --privilege-file=privs.db
# show users, expect just root user
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt"
# expect default doltcfg directory
run ls -a
[[ "$output" =~ ".doltcfg" ]] || false
# create new_user
server_query test_db 1 "create user new_user" ""
# show users, expect root user and new_user
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
# expect custom privilege file current directory
run ls
[[ "$output" =~ "privs.db" ]] || false
}
@test "sql-privs: specify data-dir and doltcfg-dir" {
make_multi_test_repo
start_sql_server_with_args --host 0.0.0.0 --user=dolt --data-dir=db_dir --doltcfg-dir=doltcfgdir
# show databases, expect all
server_query db1 1 "show databases" "Database\ndb1\ndb2\ndb3\ninformation_schema"
# show users, expect just root user
server_query db1 1 "select user from mysql.user order by user" "User\ndolt"
# expect custom doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# expect no .doltcfg in $datadir
run ls -a db_dir
! [[ "$output" =~ ".doltcfg" ]] || false
# create new user
server_query db1 1 "create user new_user" ""
# show users, expect root user and new_user
server_query db1 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
# expect no privileges.db in current directory
run ls
! [[ "$output" =~ "privileges.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
# expect privileges.db in $doltcfg directory
run ls doltcfgdir
[[ "$output" =~ "privileges.db" ]] || false
}
@test "sql-privs: specify data-dir and privilege-file" {
make_multi_test_repo
start_sql_server_with_args --host 0.0.0.0 --user=dolt --data-dir=db_dir --privilege-file=privs.db
# show databases, expect all
server_query db1 1 "show databases" "Database\ndb1\ndb2\ndb3\ninformation_schema"
# show users, expect just root user
server_query db1 1 "select user from mysql.user order by user" "User\ndolt"
# expect no .doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
# expect .doltcfg in $datadir
run ls -a db_dir
[[ "$output" =~ ".doltcfg" ]] || false
# create new user
server_query db1 1 "create user new_user" ""
# show users, expect root user and new_user
server_query db1 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
# expect privs.db in current directory
run ls
[[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privs.db" ]] || false
# expect no privs.db in $doltcfg directory
run ls db_dir/.doltcfg
! [[ "$output" =~ "privs.db" ]] || false
}
@test "sql-privs: specify doltcfg-dir and privilege-file" {
make_test_repo
start_sql_server_with_args --host 0.0.0.0 --user=dolt --doltcfg-dir=doltcfgdir --privilege-file=privs.db
# expect only dolt user
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt"
# expect custom doltcfgdir
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# create user
run create_user
[ "$status" -eq 0 ]
server_query test_db 1 "create user new_user" ""
# expect dolt, new_user, and mysql_user
run show_users
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
[ "${lines[3]}" = '+------------+' ]
[ "${lines[4]}" = '| User |' ]
[ "${lines[5]}" = '+------------+' ]
[ "${lines[6]}" = '| dolt |' ]
[ "${lines[7]}" = '| mysql_user |' ]
[ "${lines[8]}" = '| new_user |' ]
[ "${lines[9]}" = '+------------+' ]
# expect dolt user and new_user
server_query test_db 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
stop_sql_server
start_sql_server_with_args --privilege-file=mysql.db repo1
# expect privileges file
run ls
[[ "$output" =~ "privs.db" ]] || false
# expect dolt, new_user, and mysql_user
run show_users
[ "${lines[0]}" = '# Welcome to the Dolt MySQL client.' ]
[ "${lines[1]}" = "# Statements must be terminated with ';'." ]
[ "${lines[2]}" = '# "exit" or "quit" (or Ctrl-D) to exit.' ]
[ "${lines[3]}" = '+------------+' ]
[ "${lines[4]}" = '| User |' ]
[ "${lines[5]}" = '+------------+' ]
[ "${lines[6]}" = '| dolt |' ]
[ "${lines[7]}" = '| mysql_user |' ]
[ "${lines[8]}" = '| new_user |' ]
[ "${lines[9]}" = '+------------+' ]
# expect no privileges file in doltcfgdir
run ls doltcfgdir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
}
# remove mysql.db if they exist
rm -f mysql.db
@test "sql-privs: specify data-dir, doltcfg-dir, and privileges-file" {
make_multi_test_repo
# leave the directory
cd ..
start_sql_server_with_args --host 0.0.0.0 --user=dolt --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db
# show databases, expect all
server_query db1 1 "show databases" "Database\ndb1\ndb2\ndb3\ninformation_schema"
# show users, expect just root user
server_query db1 1 "select user from mysql.user order by user" "User\ndolt"
# expect custom doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# expect no .doltcfg in $datadir
run ls -a db_dir
! [[ "$output" =~ ".doltcfg" ]] || false
# create new user
server_query db1 1 "create user new_user" ""
# show users, expect root user and new_user
server_query db1 1 "select user from mysql.user order by user" "User\ndolt\nnew_user"
# expect privs.db in current directory
run ls
! [[ "$output" =~ "privileges.db" ]] || false
[[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $doltcfg directory
run ls doltcfgdir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
}
+3 -3
View File
@@ -1202,12 +1202,12 @@ END""")
multi_query "" 1 "use test2; drop database TEST2; select database();" "null"
}
@test "sql-server: create and drop database with --multi-db-dir" {
@test "sql-server: create and drop database with --data-dir" {
skiponwindows "Missing dependencies"
mkdir no_dolt && cd no_dolt
mkdir db_dir
start_sql_server_with_args --host 0.0.0.0 --user dolt --multi-db-dir=db_dir
start_sql_server_with_args --host 0.0.0.0 --user dolt --data-dir=db_dir
server_query "" 1 "create database test1"
server_query "" 1 "show databases" "Database\ninformation_schema\ntest1"
@@ -1237,7 +1237,7 @@ END""")
# make sure the databases exist on restart
stop_sql_server
start_sql_server_with_args --host 0.0.0.0 --user dolt --multi-db-dir=db_dir
start_sql_server_with_args --host 0.0.0.0 --user dolt --data-dir=db_dir
server_query "" 1 "show databases" "Database\ninformation_schema\ntest3"
}
+635 -30
View File
@@ -42,63 +42,668 @@ teardown() {
[[ "$output" =~ "+---------------------" ]] || false
}
@test "sql-shell: dolt sql shell has mysql db" {
# mysql database exists and has privilege tables
run dolt sql <<< "show tables from mysql;"
[ "$status" -eq 0 ]
[[ "$output" =~ "user" ]] || false
[[ "$output" =~ "role_edges" ]] || false
@test "sql-shell: default datadir, doltcfg, and privs" {
# remove config files
rm -rf .doltcfg
# show users, expect just root user
# show users, expect just root user
run dolt sql <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# create a new user, fails when no privilege file is specified
run dolt sql <<< "create user new_user;"
[ "$status" -eq 1 ]
[[ "$output" =~ "no privilege file specified, to persist users/grants run with --privilege-file=<file_path>" ]] || false
# check for config directory
run ls -a
[[ "$output" =~ ".doltcfg" ]] || false
# there shouldn't be any mysql.db files
run ls .dolt
! [[ "$output" =~ "mysql.db" ]] || false
# check for no privileges.db file
run ls .doltcfg
! [[ "$output" =~ "privileges.db" ]] || false
# remove mysql.db just in case
rm -f .dolt/mysql.db
# create new_user
run dolt sql <<< "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# check for config directory
run ls -a
[[ "$output" =~ ".doltcfg" ]] || false
# check for no privileges.db file
run ls .doltcfg
[[ "$output" =~ "privileges.db" ]] || false
# remove existing .doltcfg
rm -rf .doltcfg
}
@test "sql-shell: dolt sql shell can create users" {
# remove existing privs.db
rm -f privs.db
@test "sql-shell: specify data-dir" {
# remove config files
rm -rf .doltcfg
rm -rf db_dir
# mysql database exists and has privilege tables
run dolt sql <<< "show tables from mysql;"
# create data dir
mkdir db_dir
cd db_dir
# create databases
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
# show databases, expect all
run dolt sql --data-dir=db_dir <<< "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "user" ]] || false
[[ "$output" =~ "role_edges" ]] || false
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect root user
run dolt sql <<< "select user from mysql.user;"
# show users, expect just root user
run dolt sql --data-dir=db_dir <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# create a new user
run dolt sql --privilege-file=privs.db <<< "create user new_user;"
# expect no .doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
# expect .doltcfg in $datadir
run ls -a db_dir
[[ "$output" =~ ".doltcfg" ]] || false
# create new user
run dolt sql --data-dir=db_dir <<< "create user new_user"
[ "$status" -eq 0 ]
# there is now a privs.db file
# show users, expect root user and new_user
run dolt sql --data-dir=db_dir <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect no privileges.db in current directory
run ls
[[ "$output" =~ "privs.db" ]] || false
! [[ "$output" =~ "privileges.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
# expect privileges.db in $datadir/.doltcfg
run ls db_dir/.doltcfg
[[ "$output" =~ "privileges.db" ]] || false
# test relative to $datadir
cd db_dir
# show databases, expect all
run dolt sql <<< "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# expect to find same users when in $datadir
run dolt sql <<< "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove config files
rm -rf .doltcfg
rm -rf db_dir
}
@test "sql-shell: specify doltcfg directory" {
# remove any previous config directories
rm -rf .doltcfg
rm -rf doltcfgdir
# show users, expect just root user
run dolt sql --doltcfg-dir=doltcfgdir <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect only custom doltcfgdir
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# create new_user
run dolt sql --doltcfg-dir=doltcfgdir <<< "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --doltcfg-dir=doltcfgdir <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect privileges files in doltcfgdir
run ls doltcfgdir
[[ "$output" =~ "privileges.db" ]] || false
# remove config directory just in case
rm -rf .doltcfg
rm -rf doltcfgdir
}
@test "sql-shell: specify privilege file" {
# remove config files
rm -rf .doltcfg
rm -f privs.db
# show users, expect just root user
run dolt sql --privilege-file=privs.db <<< "select user from mysql.user;"
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect default doltcfg directory
run ls -a
[[ "$output" =~ ".doltcfg" ]] || false
# create new_user
run dolt sql --privilege-file=privs.db <<< "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --privilege-file=privs.db <<< "select user from mysql.user;"
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# remove mysql.db just in case
# expect custom privilege file current directory
run ls
[[ "$output" =~ "privs.db" ]] || false
# expect to not see new_user when privs.db not specified
run dolt sql <<< "select user from mysql.user"
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# remove config files
rm -rf .doltcfg
rm -f privs.db
}
@test "sql-shell: specify data-dir and doltcfg-dir" {
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf doltcfgdir
# create data dir
mkdir db_dir
cd db_dir
# create databases
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
# show databases, expect all
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir <<< "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect just root user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect custom doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# expect no .doltcfg in $datadir
run ls -a db_dir
! [[ "$output" =~ ".doltcfg" ]] || false
# create new user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir <<< "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect no privileges.db in current directory
run ls
! [[ "$output" =~ "privileges.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
# expect privileges.db in $doltcfg directory
run ls doltcfgdir
[[ "$output" =~ "privileges.db" ]] || false
# test relative to $datadir
cd db_dir
# show databases, expect all
run dolt sql <<< "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect root
run dolt sql <<< "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# show users, expect root and new_user
run dolt sql --doltcfg-dir=../doltcfgdir <<< "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf doltcfgdir
}
@test "sql-shell: specify data-dir and privilege-file" {
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf privs.db
# create data dir
mkdir db_dir
cd db_dir
# create databases
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
# show databases, expect all
run dolt sql --data-dir=db_dir --privilege-file=privs.db <<< "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect just root user
run dolt sql --data-dir=db_dir --privilege-file=privs.db <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect no .doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
# expect .doltcfg in $datadir
run ls -a db_dir
[[ "$output" =~ ".doltcfg" ]] || false
# create new user
run dolt sql --data-dir=db_dir --privilege-file=privs.db <<< "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --data-dir=db_dir --privilege-file=privs.db <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect privs.db in current directory
run ls
[[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privs.db" ]] || false
# expect no privs.db in $doltcfg directory
run ls db_dir/.doltcfg
! [[ "$output" =~ "privs.db" ]] || false
# test relative to $datadir
cd db_dir
# show databases, expect all
run dolt sql <<< "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect root
run dolt sql <<< "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# show users, expect root and new_user
run dolt sql --privilege-file=../privs.db <<< "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf privs.db
}
@test "sql-shell: specify doltcfg-dir and privilege-file" {
# remove any previous config directories
rm -rf .doltcfg
rm -rf doltcfgdir
rm -rf privs.db
# show users, expect just root user
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect custom doltcfgdir
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# create new_user
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect privileges file
run ls
[[ "$output" =~ "privs.db" ]] || false
# expect no privileges file in doltcfgdir
run ls doltcfgdir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
# remove config directory just in case
rm -rf .doltcfg
rm -rf doltcfgdir
rm -rf privs.db
}
@test "sql-shell: specify data directory, cfg directory, and privilege file" {
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf doltcfgdir
rm -rf privs.db
# create data dir
mkdir db_dir
cd db_dir
# create databases
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
# show databases, expect all
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect just root user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect custom doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# expect no .doltcfg in $datadir
run ls -a db_dir
! [[ "$output" =~ ".doltcfg" ]] || false
# create new user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db <<< "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect privs.db in current directory
run ls
! [[ "$output" =~ "privileges.db" ]] || false
[[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $doltcfg directory
run ls doltcfgdir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
# test relative to $datadir
cd db_dir
# show databases, expect all
run dolt sql <<< "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect root
run dolt sql <<< "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# show users, expect root and new_user
run dolt sql --doltcfg-dir=../doltcfgdir <<< "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# show users, expect root and new_user
run dolt sql --privilege-file=../privs.db <<< "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf doltcfgdir
rm -rf privs.db
}
@test "sql-shell: .doltcfg in parent directory errors" {
# remove existing directories
rm -rf .doltcfg
rm -rf inner_db
mkdir .doltcfg
mkdir inner_db
cd inner_db
mkdir .doltcfg
run dolt sql <<< "show databases;"
[ "$status" -eq 1 ]
[[ "$output" =~ "multiple .doltcfg directories detected" ]] || false
# specifying datadir, resolves issue
run dolt sql --data-dir=. <<< "show databases;"
[ "$status" -eq 0 ]
# remove existing directories
rm -rf .doltcfg
rm -rf inner_db
}
@test "sql-shell: specify data directory outside of dolt repo" {
# remove files
rm -rf datadir
rm -rf .doltcfg
rm -rf new_repo
# initialize data directory and inner dbs
mkdir datadir
cd datadir
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
# save data path
DATADIR=$(pwd)
cd ..
# initialize new repo
mkdir new_repo
cd new_repo
run dolt sql --data-dir=$DATADIR <<< "show databases"
[ $status -eq 0 ]
[[ $output =~ "db1" ]] || false
[[ $output =~ "db2" ]] || false
[[ $output =~ "db3" ]] || false
run dolt sql --data-dir=$DATADIR <<< "create user new_user"
[ $status -eq 0 ]
run dolt sql --data-dir=$DATADIR <<< "use db1; select user from mysql.user"
[ $status -eq 0 ]
[[ $output =~ "new_user" ]] || false
run dolt sql --data-dir=$DATADIR <<< "use db2; select user from mysql.user"
[ $status -eq 0 ]
[[ $output =~ "new_user" ]] || false
run dolt sql --data-dir=$DATADIR <<< "use db3; select user from mysql.user"
[ $status -eq 0 ]
[[ $output =~ "new_user" ]] || false
# check that correct files exist
cd ..
run ls -a
[[ $output =~ "datadir" ]] || false
[[ $output =~ "new_repo" ]] || false
! [[ $output =~ ".doltcfg" ]] || false
run ls -a datadir
[[ $output =~ ".doltcfg" ]] || false
run ls -a datadir/.doltcfg
[[ $output =~ "privileges.db" ]] || false
# remove files
rm -rf new_repo
rm -rf datadir
}
@test "sql-shell: bad sql in sql shell should error" {
run dolt sql <<< "This is bad sql"
[ $status -eq 1 ]
+638 -32
View File
@@ -39,71 +39,576 @@ teardown() {
teardown_common
}
@test "sql: dolt sql -q without privilege file doesn't persist" {
# mysql database exists and has privilege tables
run dolt sql -q "show tables from mysql;"
@test "sql: check configurations with all default options" {
# remove any previous config directories
rm -rf .doltcfg
# show users, expect just root user
run dolt sql -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "user" ]] || false
[[ "$output" =~ "role_edges" ]] || false
# show users, expect just root user
run dolt sql -q "select user from mysql.user;"
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# create a new user, fails
run dolt sql -q "create user new_user;"
[ "$status" -eq 1 ]
[[ "$output" =~ "no privilege file specified, to persist users/grants run with --privilege-file=<file_path>" ]] || false
# check for config directory
run ls -a
[[ "$output" =~ ".doltcfg" ]] || false
# there shouldn't be a mysql.db file
run ls
! [[ "$output" =~ "privs.db" ]] || false
# check for no privileges.db file
run ls .doltcfg
! [[ "$output" =~ "privileges.db" ]] || false
# show users, expect just root user
# create new_user
run dolt sql -q "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
[[ "$output" =~ "new_user" ]] || false
# remove privs.db just in case
rm -f privs.db
# check for config directory
run ls -a
[[ "$output" =~ ".doltcfg" ]] || false
# check for no privileges.db file
run ls .doltcfg
[[ "$output" =~ "privileges.db" ]] || false
# remove config directory just in case
rm -rf .doltcfg
}
@test "sql: dolt sql -q with privilege file persists" {
# mysql database exists and has privilege tables
run dolt sql --privilege-file=privs.db -q "show tables from mysql;"
@test "sql: check configurations specify data directory" {
# remove config files
rm -rf .doltcfg
rm -rf db_dir
# create data dir
mkdir db_dir
cd db_dir
# create databases
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
# show databases, expect all
run dolt sql --data-dir=db_dir -q "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "user" ]] || false
[[ "$output" =~ "role_edges" ]] || false
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect just root user
run dolt sql --data-dir=db_dir -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect no .doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
# expect .doltcfg in $datadir
run ls -a db_dir
[[ "$output" =~ ".doltcfg" ]] || false
# create new user
run dolt sql --data-dir=db_dir -q "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --data-dir=db_dir -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect no privileges.db in current directory
run ls
! [[ "$output" =~ "privileges.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
# expect privileges.db in $datadir/.doltcfg
run ls db_dir/.doltcfg
[[ "$output" =~ "privileges.db" ]] || false
# test relative to $datadir
cd db_dir
# show databases, expect all
run dolt sql -q "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# expect to find same users when in $datadir
run dolt sql -q "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove config files
rm -rf .doltcfg
rm -rf db_dir
}
@test "sql: check configurations specify doltcfg directory" {
# remove any previous config directories
rm -rf .doltcfg
rm -rf doltcfgdir
# show users, expect just root user
run dolt sql --doltcfg-dir=doltcfgdir -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect only custom doltcfgdir
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# create new_user
run dolt sql --doltcfg-dir=doltcfgdir -q "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --doltcfg-dir=doltcfgdir -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect privileges files in doltcfgdir
run ls doltcfgdir
[[ "$output" =~ "privileges.db" ]] || false
# remove config directory just in case
rm -rf .doltcfg
rm -rf doltcfgdir
}
@test "sql: check configurations specify privilege file" {
# remove config files
rm -rf .doltcfg
rm -f privs.db
# show users, expect just root user
run dolt sql --privilege-file=privs.db -q "select user from mysql.user;"
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# create a new user, fails
run dolt sql --privilege-file=privs.db -q "create user new_user;"
# expect default doltcfg directory
run ls -a
[[ "$output" =~ ".doltcfg" ]] || false
# create new_user
run dolt sql --privilege-file=privs.db -q "create user new_user"
[ "$status" -eq 0 ]
# show users, expect just root user
# show users, expect root user and new_user
run dolt sql --privilege-file=privs.db -q "select user from mysql.user;"
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# there should now be a mysql.db file
# expect custom privilege file current directory
run ls
[[ "$output" =~ "privs.db" ]] || false
# show users, expect root and new_user
run dolt sql --privilege-file=privs.db -q "select user from mysql.user;"
# expect to not see new_user when privs.db not specified
run dolt sql -q "select user from mysql.user"
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# remove mysql.db
# remove config files
rm -rf .doltcfg
rm -f privs.db
}
@test "sql: check configurations specify data directory and doltcfg directory" {
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf doltcfgdir
# create data dir
mkdir db_dir
cd db_dir
# create databases
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
# show databases, expect all
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir -q "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect just root user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect custom doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# expect no .doltcfg in $datadir
run ls -a db_dir
! [[ "$output" =~ ".doltcfg" ]] || false
# create new user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir -q "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect no privileges.db in current directory
run ls
! [[ "$output" =~ "privileges.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
# expect privileges.db in $doltcfg directory
run ls doltcfgdir
[[ "$output" =~ "privileges.db" ]] || false
# test relative to $datadir
cd db_dir
# show databases, expect all
run dolt sql -q "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect root
run dolt sql -q "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# show users, expect root and new_user
run dolt sql --doltcfg-dir=../doltcfgdir -q "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf doltcfgdir
}
@test "sql: check configurations specify data directory and privilege file" {
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf privs.db
# create data dir
mkdir db_dir
cd db_dir
# create databases
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
# show databases, expect all
run dolt sql --data-dir=db_dir --privilege-file=privs.db -q "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect just root user
run dolt sql --data-dir=db_dir --privilege-file=privs.db -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect no .doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
# expect .doltcfg in $datadir
run ls -a db_dir
[[ "$output" =~ ".doltcfg" ]] || false
# create new user
run dolt sql --data-dir=db_dir --privilege-file=privs.db -q "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --data-dir=db_dir --privilege-file=privs.db -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect privs.db in current directory
run ls
[[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privs.db" ]] || false
# expect no privs.db in $doltcfg directory
run ls db_dir/.doltcfg
! [[ "$output" =~ "privs.db" ]] || false
# test relative to $datadir
cd db_dir
# show databases, expect all
run dolt sql -q "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect root
run dolt sql -q "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# show users, expect root and new_user
run dolt sql --privilege-file=../privs.db -q "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf privs.db
}
@test "sql: dcheck configurations specify doltcfg directory and privilege file" {
# remove any previous config directories
rm -rf .doltcfg
rm -rf doltcfgdir
rm -rf privs.db
# show users, expect just root user
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect custom doltcfgdir
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# create new_user
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect privileges file
run ls
[[ "$output" =~ "privs.db" ]] || false
# expect no privileges file in doltcfgdir
run ls doltcfgdir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
# remove config directory just in case
rm -rf .doltcfg
rm -rf doltcfgdir
rm -rf privs.db
}
@test "sql: check configurations specify data directory, doltcfg directory, and privilege file" {
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf doltcfgdir
rm -rf privs.db
# create data dir
mkdir db_dir
cd db_dir
# create databases
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
cd ..
# show databases, expect all
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect just root user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# expect custom doltcfg in current directory
run ls -a
! [[ "$output" =~ ".doltcfg" ]] || false
[[ "$output" =~ "doltcfgdir" ]] || false
# expect no .doltcfg in $datadir
run ls -a db_dir
! [[ "$output" =~ ".doltcfg" ]] || false
# create new user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "create user new_user"
[ "$status" -eq 0 ]
# show users, expect root user and new_user
run dolt sql --data-dir=db_dir --doltcfg-dir=doltcfgdir --privilege-file=privs.db -q "select user from mysql.user;"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
# expect privs.db in current directory
run ls
! [[ "$output" =~ "privileges.db" ]] || false
[[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $datadir directory
run ls db_dir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
# expect no privileges.db in $doltcfg directory
run ls doltcfgdir
! [[ "$output" =~ "privileges.db" ]] || false
! [[ "$output" =~ "privs.db" ]] || false
# test relative to $datadir
cd db_dir
# show databases, expect all
run dolt sql -q "show databases;"
[ "$status" -eq 0 ]
[[ "$output" =~ "db1" ]] || false
[[ "$output" =~ "db2" ]] || false
[[ "$output" =~ "db3" ]] || false
# show users, expect root
run dolt sql -q "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# show users, expect root and new_user
run dolt sql --doltcfg-dir=../doltcfgdir -q "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
! [[ "$output" =~ "new_user" ]] || false
# show users, expect root and new_user
run dolt sql --privilege-file=../privs.db -q "select user from mysql.user"
[ "$status" -eq 0 ]
[[ "$output" =~ "root" ]] || false
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove config files
rm -rf .doltcfg
rm -rf db_dir
rm -rf doltcfgdir
rm -rf privs.db
}
@test "sql: dolt sql -q create database and specify privilege file" {
# remove existing directories
rm -rf .doltcfg
rm -rf inner_db
rm -f privs.db
run dolt sql --privilege-file=privs.db -q "create database inner_db;"
[ "$status" -eq 0 ]
@@ -123,9 +628,110 @@ teardown() {
[[ "$output" =~ "new_user" ]] || false
cd ..
# remove existing directories
rm -rf .doltcfg
rm -rf inner_db
rm -f privs.db
}
@test "sql: dolt sql -q .doltcfg in parent directory errors" {
# remove existing directories
rm -rf .doltcfg
rm -rf inner_db
mkdir .doltcfg
mkdir inner_db
cd inner_db
mkdir .doltcfg
run dolt sql -q "show databases;"
[ "$status" -eq 1 ]
[[ "$output" =~ "multiple .doltcfg directories detected" ]] || false
# specifying datadir, resolves issue
run dolt sql --data-dir=. -q "show databases;"
[ "$status" -eq 0 ]
# remove existing directories
rm -rf .doltcfg
rm -rf inner_db
}
@test "sql: dolt sql -q specify data directory outside of dolt repo" {
# remove files
rm -rf datadir
rm -rf .doltcfg
rm -rf new_repo
# initialize data directory and inner dbs
mkdir datadir
cd datadir
mkdir db1
cd db1
dolt init
cd ..
mkdir db2
cd db2
dolt init
cd ..
mkdir db3
cd db3
dolt init
cd ..
# save data path
DATADIR=$(pwd)
cd ..
# initialize new repo
mkdir new_repo
cd new_repo
run dolt sql --data-dir=$DATADIR -q "show databases"
[ $status -eq 0 ]
[[ $output =~ "db1" ]] || false
[[ $output =~ "db2" ]] || false
[[ $output =~ "db3" ]] || false
run dolt sql --data-dir=$DATADIR -q "create user new_user"
[ $status -eq 0 ]
run dolt sql --data-dir=$DATADIR -q "use db1; select user from mysql.user"
[ $status -eq 0 ]
[[ $output =~ "new_user" ]] || false
run dolt sql --data-dir=$DATADIR -q "use db2; select user from mysql.user"
[ $status -eq 0 ]
[[ $output =~ "new_user" ]] || false
run dolt sql --data-dir=$DATADIR -q "use db3; select user from mysql.user"
[ $status -eq 0 ]
[[ $output =~ "new_user" ]] || false
# check that correct files exist
cd ..
run ls -a
[[ $output =~ "datadir" ]] || false
[[ $output =~ "new_repo" ]] || false
! [[ $output =~ ".doltcfg" ]] || false
run ls -a datadir
[[ $output =~ ".doltcfg" ]] || false
run ls -a datadir/.doltcfg
[[ $output =~ "privileges.db" ]] || false
# remove files
rm -rf new_repo
rm -rf datadir
}
@test "sql: errors do not write incomplete rows" {
dolt sql <<"SQL"
CREATE TABLE test (