mirror of
https://github.com/dolthub/dolt.git
synced 2026-05-06 11:20:30 -05:00
Removed deprecated dolt functions
This commit is contained in:
@@ -312,11 +312,11 @@ func TestServerSetDefaultBranch(t *testing.T) {
|
||||
expectedRes: []testBranch{{defaultBranch}},
|
||||
},
|
||||
{
|
||||
query: sess.Select("dolt_checkout('-b', 'new')"),
|
||||
query: sess.SelectBySql("call dolt_checkout('-b', 'new')"),
|
||||
expectedRes: []testBranch{{""}},
|
||||
},
|
||||
{
|
||||
query: sess.Select("dolt_checkout('main')"),
|
||||
query: sess.SelectBySql("call dolt_checkout('main')"),
|
||||
expectedRes: []testBranch{{""}},
|
||||
},
|
||||
}
|
||||
@@ -461,7 +461,7 @@ func TestReadReplica(t *testing.T) {
|
||||
|
||||
var res []int
|
||||
|
||||
q := sess.SelectBySql(fmt.Sprintf("select dolt_checkout('%s')", newBranch))
|
||||
q := sess.SelectBySql(fmt.Sprintf("call dolt_checkout('%s')", newBranch))
|
||||
_, err = q.LoadContext(context.Background(), &res)
|
||||
require.NoError(t, err)
|
||||
assert.ElementsMatch(t, res, []int{0})
|
||||
|
||||
@@ -1,82 +0,0 @@
|
||||
// Copyright 2020 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
)
|
||||
|
||||
const CommitFuncName = "commit"
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type CommitFunc struct {
|
||||
children []sql.Expression
|
||||
}
|
||||
|
||||
// NewCommitFunc creates a new CommitFunc expression.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewCommitFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &CommitFunc{children: args}, nil
|
||||
}
|
||||
|
||||
// Eval implements the Expression interface.
|
||||
func (cf *CommitFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, cf.Children())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, err
|
||||
}
|
||||
return DoDoltCommit(ctx, args)
|
||||
}
|
||||
|
||||
// String implements the Stringer interface.
|
||||
func (cf *CommitFunc) String() string {
|
||||
childrenStrings := make([]string, len(cf.children))
|
||||
|
||||
for i, child := range cf.children {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("COMMIT(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
// IsNullable implements the Expression interface.
|
||||
func (cf *CommitFunc) IsNullable() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (cf *CommitFunc) Resolved() bool {
|
||||
for _, child := range cf.Children() {
|
||||
if !child.Resolved() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (cf *CommitFunc) Children() []sql.Expression {
|
||||
return cf.children
|
||||
}
|
||||
|
||||
// WithChildren implements the Expression interface.
|
||||
func (cf *CommitFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewCommitFunc(children...)
|
||||
}
|
||||
|
||||
func (cf *CommitFunc) Type() sql.Type {
|
||||
return sql.Text
|
||||
}
|
||||
@@ -1,138 +0,0 @@
|
||||
// Copyright 2020 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
const DoltAddFuncName = "dolt_add"
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltAddFunc struct {
|
||||
children []sql.Expression
|
||||
}
|
||||
|
||||
func (d DoltAddFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return DoDoltAdd(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltAdd(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateAddArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
allFlag := apr.Contains(cli.AllFlag)
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if apr.NArg() == 0 && !allFlag {
|
||||
return 1, fmt.Errorf("Nothing specified, nothing added. Maybe you wanted to say 'dolt add .'?")
|
||||
} else if allFlag || apr.NArg() == 1 && apr.Arg(0) == "." {
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("db session not found")
|
||||
}
|
||||
|
||||
roots, err = actions.StageAllTables(ctx, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = dSess.SetRoots(ctx, dbName, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
} else {
|
||||
roots, err = actions.StageTables(ctx, roots, apr.Args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = dSess.SetRoots(ctx, dbName, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (d DoltAddFunc) Resolved() bool {
|
||||
for _, child := range d.Children() {
|
||||
if !child.Resolved() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (d DoltAddFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.children))
|
||||
|
||||
for i, child := range d.children {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_ADD(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltAddFunc) Type() sql.Type {
|
||||
return sql.Int8
|
||||
}
|
||||
|
||||
func (d DoltAddFunc) IsNullable() bool {
|
||||
for _, child := range d.Children() {
|
||||
if child.IsNullable() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (d DoltAddFunc) Children() []sql.Expression {
|
||||
return d.children
|
||||
}
|
||||
|
||||
func (d DoltAddFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewDoltAddFunc(children...)
|
||||
}
|
||||
|
||||
// NewDoltAddFunc creates a new DoltAddFunc expression whose children represents the args passed in DOLT_ADD.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewDoltAddFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltAddFunc{children: args}, nil
|
||||
}
|
||||
@@ -1,191 +0,0 @@
|
||||
// Copyright 2022 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/dbfactory"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/filesys"
|
||||
"github.com/dolthub/dolt/go/store/datas/pull"
|
||||
)
|
||||
|
||||
const (
|
||||
DoltBackupFuncName = "dolt_backup"
|
||||
|
||||
statusOk = 1
|
||||
statusErr = 0
|
||||
)
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltBackupFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewDoltBackupFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltBackupFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
|
||||
func (d DoltBackupFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.Children()))
|
||||
|
||||
for i, child := range d.Children() {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_BACKUP(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltBackupFunc) Type() sql.Type {
|
||||
return sql.Int8
|
||||
}
|
||||
|
||||
func (d DoltBackupFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewDoltBackupFunc(children...)
|
||||
}
|
||||
|
||||
func (d DoltBackupFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
return DoDoltBackup(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltBackup(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
if len(dbName) == 0 {
|
||||
return statusErr, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateBackupArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
invalidParams := []string{dbfactory.AWSCredsFileParam, dbfactory.AWSCredsProfile, dbfactory.AWSCredsTypeParam, dbfactory.AWSRegionParam}
|
||||
for _, param := range invalidParams {
|
||||
if apr.Contains(param) {
|
||||
return statusErr, fmt.Errorf("parameter '%s' is not supported when running this command via SQL", param)
|
||||
}
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return statusErr, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
var b env.Remote
|
||||
switch {
|
||||
case apr.NArg() == 0:
|
||||
return statusErr, fmt.Errorf("listing existing backups endpoints in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.AddBackupId:
|
||||
return statusErr, fmt.Errorf("adding backup endpoint in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.RemoveBackupId:
|
||||
return statusErr, fmt.Errorf("removing backup endpoint in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.RemoveBackupShortId:
|
||||
return statusErr, fmt.Errorf("removing backup endpoint in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.RestoreBackupId:
|
||||
return statusErr, fmt.Errorf("restoring backup endpoint in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.SyncBackupUrlId:
|
||||
if apr.NArg() != 2 {
|
||||
return statusErr, fmt.Errorf("usage: dolt_backup('sync-url', BACKUP_URL)")
|
||||
}
|
||||
|
||||
backupUrl := strings.TrimSpace(apr.Arg(1))
|
||||
cfg := loadConfig(ctx)
|
||||
scheme, absBackupUrl, err := env.GetAbsRemoteUrl(filesys.LocalFS, cfg, backupUrl)
|
||||
if err != nil {
|
||||
return statusErr, fmt.Errorf("error: '%s' is not valid.", backupUrl)
|
||||
} else if scheme == dbfactory.HTTPScheme || scheme == dbfactory.HTTPSScheme {
|
||||
// not sure how to get the dialer so punting on this
|
||||
return statusErr, fmt.Errorf("sync-url does not support http or https backup locations currently")
|
||||
}
|
||||
|
||||
params, err := cli.ProcessBackupArgs(apr, scheme, absBackupUrl)
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
credsFile, _ := sess.GetSessionVariable(ctx, dsess.AwsCredsFile)
|
||||
credsFileStr, isStr := credsFile.(string)
|
||||
if isStr && len(credsFileStr) > 0 {
|
||||
params[dbfactory.AWSCredsFileParam] = credsFileStr
|
||||
}
|
||||
|
||||
credsProfile, err := sess.GetSessionVariable(ctx, dsess.AwsCredsProfile)
|
||||
profStr, isStr := credsProfile.(string)
|
||||
if isStr && len(profStr) > 0 {
|
||||
params[dbfactory.AWSCredsProfile] = profStr
|
||||
}
|
||||
|
||||
credsRegion, err := sess.GetSessionVariable(ctx, dsess.AwsCredsRegion)
|
||||
regionStr, isStr := credsRegion.(string)
|
||||
if isStr && len(regionStr) > 0 {
|
||||
params[dbfactory.AWSRegionParam] = regionStr
|
||||
}
|
||||
|
||||
b = env.NewRemote("__temp__", backupUrl, params)
|
||||
|
||||
case apr.Arg(0) == cli.SyncBackupId:
|
||||
if apr.NArg() != 2 {
|
||||
return statusErr, fmt.Errorf("usage: dolt_backup('sync', BACKUP_NAME)")
|
||||
}
|
||||
|
||||
backupName := strings.TrimSpace(apr.Arg(1))
|
||||
|
||||
backups, err := dbData.Rsr.GetBackups()
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
b, ok = backups[backupName]
|
||||
if !ok {
|
||||
return statusErr, fmt.Errorf("error: unknown backup: '%s'; %v", backupName, backups)
|
||||
}
|
||||
|
||||
default:
|
||||
return statusErr, fmt.Errorf("unrecognized dolt_backup parameter: %s", apr.Arg(0))
|
||||
}
|
||||
|
||||
destDb, err := sess.Provider().GetRemoteDB(ctx, dbData.Ddb, b, true)
|
||||
if err != nil {
|
||||
return statusErr, fmt.Errorf("error loading backup destination: %w", err)
|
||||
}
|
||||
|
||||
tmpDir, err := dbData.Rsw.TempTableFilesDir()
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
err = actions.SyncRoots(ctx, dbData.Ddb, destDb, tmpDir, runProgFuncs, stopProgFuncs)
|
||||
if err != nil && err != pull.ErrDBUpToDate {
|
||||
return 1, fmt.Errorf("error syncing backup: %w", err)
|
||||
}
|
||||
return statusOk, nil
|
||||
}
|
||||
@@ -1,357 +0,0 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqlserver"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/argparser"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/filesys"
|
||||
)
|
||||
|
||||
const DoltBranchFuncName = "dolt_branch"
|
||||
|
||||
var EmptyBranchNameErr = errors.New("error: cannot branch empty string")
|
||||
var InvalidArgErr = errors.New("error: invalid usage")
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltBranchFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewDoltBranchFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltBranchFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
|
||||
func (d DoltBranchFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.Children()))
|
||||
|
||||
for i, child := range d.Children() {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_BRANCH(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltBranchFunc) Type() sql.Type {
|
||||
return sql.Int8
|
||||
}
|
||||
|
||||
func (d DoltBranchFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewDoltBranchFunc(children...)
|
||||
}
|
||||
|
||||
func (d DoltBranchFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return DoDoltBranch(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltBranch(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
|
||||
apr, err := cli.CreateBranchArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := dSess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
switch {
|
||||
case apr.Contains(cli.CopyFlag):
|
||||
err = copyBranch(ctx, dbData, apr)
|
||||
case apr.Contains(cli.MoveFlag):
|
||||
err = renameBranch(ctx, dbData, apr, dSess, dbName)
|
||||
case apr.Contains(cli.DeleteFlag), apr.Contains(cli.DeleteForceFlag):
|
||||
err = deleteBranches(ctx, dbData, apr, dSess, dbName)
|
||||
default:
|
||||
err = createNewBranch(ctx, dbData, apr)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return 1, err
|
||||
} else {
|
||||
return 0, nil
|
||||
}
|
||||
}
|
||||
|
||||
// renameBranch takes DoltSession and database name to try accessing file system for dolt database.
|
||||
// If the oldBranch being renamed is the current branch on CLI, then RepoState head will be updated with the newBranch ref.
|
||||
func renameBranch(ctx *sql.Context, dbData env.DbData, apr *argparser.ArgParseResults, sess *dsess.DoltSession, dbName string) error {
|
||||
if apr.NArg() != 2 {
|
||||
return InvalidArgErr
|
||||
}
|
||||
oldBranchName, newBranchName := apr.Arg(0), apr.Arg(1)
|
||||
if oldBranchName == "" || newBranchName == "" {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
if err := branch_control.CanDeleteBranch(ctx, oldBranchName); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := branch_control.CanCreateBranch(ctx, newBranchName); err != nil {
|
||||
return err
|
||||
}
|
||||
force := apr.Contains(cli.ForceFlag)
|
||||
|
||||
if !force {
|
||||
err := validateBranchNotActiveInAnySession(ctx, oldBranchName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if err := branch_control.CanDeleteBranch(ctx, newBranchName); err != nil {
|
||||
// If force is enabled, we can overwrite the destination branch, so we require a permission check here, even if the
|
||||
// destination branch doesn't exist. An unauthorized user could simply rerun the command without the force flag.
|
||||
return err
|
||||
}
|
||||
|
||||
err := actions.RenameBranch(ctx, dbData, loadConfig(ctx), oldBranchName, newBranchName, force)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = branch_control.AddAdminForContext(ctx, newBranchName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// The current branch on CLI can be deleted as user can be on different branch on SQL and delete it from SQL session.
|
||||
// To update current head info on RepoState, we need DoltEnv to load CLI environment.
|
||||
if fs, err := sess.Provider().FileSystemForDatabase(dbName); err == nil {
|
||||
if repoState, err := env.LoadRepoState(fs); err == nil {
|
||||
if repoState.Head.Ref.GetPath() == oldBranchName {
|
||||
repoState.Head.Ref = ref.NewBranchRef(newBranchName)
|
||||
repoState.Save(fs)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// deleteBranches takes DoltSession and database name to try accessing file system for dolt database.
|
||||
// If the database is not session state db and the branch being deleted is the current branch on CLI, it will update
|
||||
// the RepoState to set head as empty branchRef.
|
||||
func deleteBranches(ctx *sql.Context, dbData env.DbData, apr *argparser.ArgParseResults, sess *dsess.DoltSession, dbName string) error {
|
||||
if apr.NArg() == 0 {
|
||||
return InvalidArgErr
|
||||
}
|
||||
|
||||
// The current branch on CLI can be deleted as user can be on different branch on SQL and delete it from SQL session.
|
||||
// To update current head info on RepoState, we need DoltEnv to load CLI environment.
|
||||
var rs *env.RepoState
|
||||
var headOnCLI string
|
||||
fs, err := sess.Provider().FileSystemForDatabase(dbName)
|
||||
if err == nil {
|
||||
if repoState, err := env.LoadRepoState(fs); err == nil {
|
||||
rs = repoState
|
||||
headOnCLI = repoState.Head.Ref.GetPath()
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that we can delete all branches before continuing
|
||||
for _, branchName := range apr.Args {
|
||||
if err = branch_control.CanDeleteBranch(ctx, branchName); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var updateFS = false
|
||||
for _, branchName := range apr.Args {
|
||||
if len(branchName) == 0 {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
force := apr.Contains(cli.DeleteForceFlag) || apr.Contains(cli.ForceFlag)
|
||||
|
||||
if !force {
|
||||
err = validateBranchNotActiveInAnySession(ctx, branchName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
err = actions.DeleteBranch(ctx, dbData, loadConfig(ctx), branchName, actions.DeleteOptions{
|
||||
Force: force,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if headOnCLI == branchName {
|
||||
updateFS = true
|
||||
}
|
||||
}
|
||||
|
||||
if fs != nil && updateFS {
|
||||
rs.Head.Ref = ref.NewBranchRef("")
|
||||
rs.Save(fs)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateBranchNotActiveInAnySessions returns an error if the specified branch is currently
|
||||
// selected as the active branch for any active server sessions.
|
||||
func validateBranchNotActiveInAnySession(ctx *sql.Context, branchName string) error {
|
||||
currentDbName, _, err := getRevisionForRevisionDatabase(ctx, ctx.GetCurrentDatabase())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if currentDbName == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
if sqlserver.RunningInServerMode() == false {
|
||||
return nil
|
||||
}
|
||||
|
||||
runningServer := sqlserver.GetRunningServer()
|
||||
if runningServer == nil {
|
||||
return nil
|
||||
}
|
||||
sessionManager := runningServer.SessionManager()
|
||||
branchRef := ref.NewBranchRef(branchName)
|
||||
|
||||
return sessionManager.Iter(func(session sql.Session) (bool, error) {
|
||||
dsess, ok := session.(*dsess.DoltSession)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("unexpected session type: %T", session)
|
||||
}
|
||||
|
||||
sessionDatabase := dsess.Session.GetCurrentDatabase()
|
||||
sessionDbName, _, err := getRevisionForRevisionDatabase(ctx, dsess.GetCurrentDatabase())
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if len(sessionDatabase) == 0 || sessionDbName != currentDbName {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
activeBranchRef, err := dsess.CWBHeadRef(ctx, sessionDatabase)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if ref.Equals(branchRef, activeBranchRef) {
|
||||
return false, fmt.Errorf("unsafe to delete or rename branches in use in other sessions; " +
|
||||
"use --force to force the change")
|
||||
}
|
||||
|
||||
return false, nil
|
||||
})
|
||||
}
|
||||
|
||||
func loadConfig(ctx *sql.Context) *env.DoltCliConfig {
|
||||
// When executing branch actions from SQL, we don't have access to a DoltEnv like we do from
|
||||
// within the CLI. We can fake it here enough to get a DoltCliConfig, but we can't rely on the
|
||||
// DoltEnv because tests and production will run with different settings (e.g. in-mem versus file).
|
||||
dEnv := env.Load(ctx, env.GetCurrentUserHomeDir, filesys.LocalFS, doltdb.LocalDirDoltDB, "")
|
||||
return dEnv.Config
|
||||
}
|
||||
|
||||
func createNewBranch(ctx *sql.Context, dbData env.DbData, apr *argparser.ArgParseResults) error {
|
||||
var branchName string
|
||||
var startPt = "HEAD"
|
||||
if apr.NArg() == 1 {
|
||||
branchName = apr.Arg(0)
|
||||
} else if apr.NArg() == 2 {
|
||||
branchName = apr.Arg(0)
|
||||
startPt = apr.Arg(1)
|
||||
if len(startPt) == 0 {
|
||||
return InvalidArgErr
|
||||
}
|
||||
}
|
||||
|
||||
if len(branchName) == 0 {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
|
||||
if err := branch_control.CanCreateBranch(ctx, branchName); err != nil {
|
||||
return err
|
||||
}
|
||||
return actions.CreateBranchWithStartPt(ctx, dbData, branchName, startPt, apr.Contains(cli.ForceFlag))
|
||||
}
|
||||
|
||||
func copyBranch(ctx *sql.Context, dbData env.DbData, apr *argparser.ArgParseResults) error {
|
||||
if apr.NArg() != 2 {
|
||||
return InvalidArgErr
|
||||
}
|
||||
|
||||
srcBr := apr.Args[0]
|
||||
if len(srcBr) == 0 {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
|
||||
destBr := apr.Args[1]
|
||||
if len(destBr) == 0 {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
|
||||
force := apr.Contains(cli.ForceFlag)
|
||||
return copyABranch(ctx, dbData, srcBr, destBr, force)
|
||||
}
|
||||
|
||||
func copyABranch(ctx *sql.Context, dbData env.DbData, srcBr string, destBr string, force bool) error {
|
||||
if err := branch_control.CanCreateBranch(ctx, destBr); err != nil {
|
||||
return err
|
||||
}
|
||||
// If force is enabled, we can overwrite the destination branch, so we require a permission check here, even if the
|
||||
// destination branch doesn't exist. An unauthorized user could simply rerun the command without the force flag.
|
||||
if force {
|
||||
if err := branch_control.CanDeleteBranch(ctx, destBr); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
err := actions.CopyBranchOnDB(ctx, dbData.Ddb, srcBr, destBr, force)
|
||||
if err != nil {
|
||||
if err == doltdb.ErrBranchNotFound {
|
||||
return errors.New(fmt.Sprintf("fatal: A branch named '%s' not found", srcBr))
|
||||
} else if err == actions.ErrAlreadyExists {
|
||||
return errors.New(fmt.Sprintf("fatal: A branch named '%s' already exists.", destBr))
|
||||
} else if err == doltdb.ErrInvBranchName {
|
||||
return errors.New(fmt.Sprintf("fatal: '%s' is not a valid branch name.", destBr))
|
||||
} else {
|
||||
return errors.New(fmt.Sprintf("fatal: Unexpected error copying branch from '%s' to '%s'", srcBr, destBr))
|
||||
}
|
||||
}
|
||||
err = branch_control.AddAdminForContext(ctx, destBr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -1,303 +0,0 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/store/hash"
|
||||
)
|
||||
|
||||
const DoltCheckoutFuncName = "dolt_checkout"
|
||||
|
||||
var ErrEmptyBranchName = errors.New("error: cannot checkout empty string")
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltCheckoutFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
func (d DoltCheckoutFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return DoDoltCheckout(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltCheckout(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
|
||||
dbName, _, err := getRevisionForRevisionDatabase(ctx, dbName)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateCheckoutArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
if (apr.Contains(cli.CheckoutCoBranch) && apr.NArg() > 1) || (!apr.Contains(cli.CheckoutCoBranch) && apr.NArg() == 0) {
|
||||
return 1, errors.New("Improper usage.")
|
||||
}
|
||||
|
||||
// Checking out new branch.
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := dSess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
if newBranch, newBranchOk := apr.GetValue(cli.CheckoutCoBranch); newBranchOk {
|
||||
if len(newBranch) == 0 {
|
||||
err = errors.New("error: cannot checkout empty string")
|
||||
} else if len(apr.Args) > 0 {
|
||||
err = checkoutNewBranch(ctx, dbName, dbData, newBranch, apr.Arg(0))
|
||||
} else {
|
||||
err = checkoutNewBranch(ctx, dbName, dbData, newBranch, "")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
name := apr.Arg(0)
|
||||
if len(name) == 0 {
|
||||
return 1, ErrEmptyBranchName
|
||||
}
|
||||
|
||||
// Check if user wants to checkout branch.
|
||||
if isBranch, err := actions.IsBranch(ctx, dbData.Ddb, name); err != nil {
|
||||
return 1, err
|
||||
} else if isBranch {
|
||||
err = checkoutBranch(ctx, dbName, name)
|
||||
if errors.Is(err, doltdb.ErrWorkingSetNotFound) {
|
||||
// If there is a branch but there is no working set,
|
||||
// somehow the local branch ref was created without a
|
||||
// working set. This happened with old versions of dolt
|
||||
// when running as a read replica, for example. Try to
|
||||
// create a working set pointing at the existing branch
|
||||
// HEAD and check out the branch again.
|
||||
//
|
||||
// TODO: This is all quite racey, but so is the
|
||||
// handling in DoltDB, etc.
|
||||
err = createWorkingSetForLocalBranch(ctx, dbData.Ddb, name)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = checkoutBranch(ctx, dbName, name)
|
||||
}
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
err = checkoutTables(ctx, roots, dbName, args)
|
||||
if err != nil && apr.NArg() == 1 {
|
||||
err = checkoutRemoteBranch(ctx, dbName, dbData, name)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
// createWorkingSetForLocalBranch will make a new working set for a local
|
||||
// branch ref if one does not already exist. Can be used to fix up local branch
|
||||
// state when branches have been created without working sets in the past.
|
||||
//
|
||||
// This makes it so that dolt_checkout can checkout workingset-less branches,
|
||||
// the same as `dolt checkout` at the CLI. The semantics of exactly what
|
||||
// working set gets created in the new case are different, since the CLI takes
|
||||
// the working set with it.
|
||||
//
|
||||
// TODO: This is cribbed heavily from doltdb.*DoltDB.NewBranchAtCommit.
|
||||
func createWorkingSetForLocalBranch(ctx *sql.Context, ddb *doltdb.DoltDB, branchName string) error {
|
||||
branchRef := ref.NewBranchRef(branchName)
|
||||
commit, err := ddb.ResolveCommitRef(ctx, branchRef)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
commitRoot, err := commit.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
wsRef, err := ref.WorkingSetRefForHead(branchRef)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = ddb.ResolveWorkingSet(ctx, wsRef)
|
||||
if err == nil {
|
||||
// This already exists. Return...
|
||||
return nil
|
||||
}
|
||||
if !errors.Is(err, doltdb.ErrWorkingSetNotFound) {
|
||||
return err
|
||||
}
|
||||
|
||||
ws := doltdb.EmptyWorkingSet(wsRef).WithWorkingRoot(commitRoot).WithStagedRoot(commitRoot)
|
||||
return ddb.UpdateWorkingSet(ctx, wsRef, ws, hash.Hash{} /* current hash... */, doltdb.TodoWorkingSetMeta())
|
||||
}
|
||||
|
||||
// getRevisionForRevisionDatabase returns the root database name and revision for a database, or just the root database name if the specified db name is not a revision database.
|
||||
func getRevisionForRevisionDatabase(ctx *sql.Context, dbName string) (string, string, error) {
|
||||
doltsess, ok := ctx.Session.(*dsess.DoltSession)
|
||||
if !ok {
|
||||
return "", "", fmt.Errorf("unexpected session type: %T", ctx.Session)
|
||||
}
|
||||
|
||||
provider := doltsess.Provider()
|
||||
return provider.GetRevisionForRevisionDatabase(ctx, dbName)
|
||||
}
|
||||
|
||||
// checkoutRemoteBranch checks out a remote branch creating a new local branch with the same name as the remote branch
|
||||
// and set its upstream. The upstream persists out of sql session.
|
||||
func checkoutRemoteBranch(ctx *sql.Context, dbName string, dbData env.DbData, branchName string) error {
|
||||
remoteRefs, err := actions.GetRemoteBranchRef(ctx, dbData.Ddb, branchName)
|
||||
if err != nil {
|
||||
return errors.New("fatal: unable to read from data repository")
|
||||
}
|
||||
|
||||
if len(remoteRefs) == 0 {
|
||||
return fmt.Errorf("error: could not find %s", branchName)
|
||||
} else if len(remoteRefs) == 1 {
|
||||
remoteRef := remoteRefs[0]
|
||||
err := checkoutNewBranch(ctx, dbName, dbData, branchName, remoteRef.String())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
refSpec, err := ref.ParseRefSpecForRemote(remoteRef.GetRemote(), remoteRef.GetBranch())
|
||||
if err != nil {
|
||||
return errhand.BuildDError(fmt.Errorf("%w: '%s'", err, remoteRef.GetRemote()).Error()).Build()
|
||||
}
|
||||
|
||||
src := refSpec.SrcRef(dbData.Rsr.CWBHeadRef())
|
||||
dest := refSpec.DestRef(src)
|
||||
|
||||
return dbData.Rsw.UpdateBranch(src.GetPath(), env.BranchConfig{
|
||||
Merge: ref.MarshalableRef{
|
||||
Ref: dest,
|
||||
},
|
||||
Remote: remoteRef.GetRemote(),
|
||||
})
|
||||
} else {
|
||||
return fmt.Errorf("'%s' matched multiple (%v) remote tracking branches", branchName, len(remoteRefs))
|
||||
}
|
||||
}
|
||||
|
||||
func checkoutNewBranch(ctx *sql.Context, dbName string, dbData env.DbData, branchName, startPt string) error {
|
||||
if len(branchName) == 0 {
|
||||
return ErrEmptyBranchName
|
||||
}
|
||||
|
||||
if startPt == "" {
|
||||
startPt = "head"
|
||||
}
|
||||
|
||||
err := actions.CreateBranchWithStartPt(ctx, dbData, branchName, startPt, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return checkoutBranch(ctx, dbName, branchName)
|
||||
}
|
||||
|
||||
func checkoutBranch(ctx *sql.Context, dbName string, branchName string) error {
|
||||
wsRef, err := ref.WorkingSetRefForHead(ref.NewBranchRef(branchName))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if ctx.GetCurrentDatabase() != dbName {
|
||||
ctx.SetCurrentDatabase(dbName)
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
return dSess.SwitchWorkingSet(ctx, dbName, wsRef)
|
||||
}
|
||||
|
||||
func checkoutTables(ctx *sql.Context, roots doltdb.Roots, name string, tables []string) error {
|
||||
roots, err := actions.MoveTablesFromHeadToWorking(ctx, roots, tables)
|
||||
|
||||
if err != nil {
|
||||
if doltdb.IsRootValUnreachable(err) {
|
||||
rt := doltdb.GetUnreachableRootType(err)
|
||||
return fmt.Errorf("error: unable to read the %s", rt.String())
|
||||
} else if actions.IsTblNotExist(err) {
|
||||
return fmt.Errorf("error: given tables do not exist")
|
||||
} else {
|
||||
return fmt.Errorf("fatal: Unexpected error checking out tables")
|
||||
}
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
return dSess.SetRoots(ctx, name, roots)
|
||||
}
|
||||
|
||||
func (d DoltCheckoutFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.Children()))
|
||||
|
||||
for i, child := range d.Children() {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_CHECKOUT(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltCheckoutFunc) Type() sql.Type {
|
||||
return sql.Int8
|
||||
}
|
||||
|
||||
func (d DoltCheckoutFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewDoltCheckoutFunc(children...)
|
||||
}
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewDoltCheckoutFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltCheckoutFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
@@ -1,122 +0,0 @@
|
||||
// Copyright 2020 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
const DoltCleanFuncName = "dolt_clean"
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltCleanFunc struct {
|
||||
children []sql.Expression
|
||||
}
|
||||
|
||||
func (d DoltCleanFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return DoDoltClean(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltClean(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
|
||||
apr, err := cli.CreateCleanArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
// Get all the needed roots.
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
roots, err = actions.CleanUntracked(ctx, roots, apr.Args, apr.ContainsAll(cli.DryRunFlag))
|
||||
if err != nil {
|
||||
return 1, fmt.Errorf("failed to clean; %w", err)
|
||||
}
|
||||
|
||||
err = dSess.SetRoots(ctx, dbName, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (d DoltCleanFunc) Resolved() bool {
|
||||
for _, child := range d.Children() {
|
||||
if !child.Resolved() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (d DoltCleanFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.children))
|
||||
|
||||
for i, child := range d.children {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_CLEAN(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltCleanFunc) Type() sql.Type {
|
||||
return sql.Int8
|
||||
}
|
||||
|
||||
func (d DoltCleanFunc) IsNullable() bool {
|
||||
for _, child := range d.Children() {
|
||||
if child.IsNullable() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (d DoltCleanFunc) Children() []sql.Expression {
|
||||
return d.children
|
||||
}
|
||||
|
||||
func (d DoltCleanFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewDoltCleanFunc(children...)
|
||||
}
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewDoltCleanFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return DoltCleanFunc{children: args}, nil
|
||||
}
|
||||
@@ -1,208 +0,0 @@
|
||||
// Copyright 2020 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/vitess/go/vt/proto/query"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
const DoltCommitFuncName = "dolt_commit"
|
||||
|
||||
var hashType = sql.MustCreateString(query.Type_TEXT, 32, sql.Collation_ascii_bin)
|
||||
|
||||
// DoltCommitFunc runs a `dolt commit` in the SQL context, committing staged changes to head.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltCommitFunc struct {
|
||||
children []sql.Expression
|
||||
}
|
||||
|
||||
// NewDoltCommitFunc creates a new DoltCommitFunc expression whose children represents the args passed in DOLT_COMMIT.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewDoltCommitFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltCommitFunc{children: args}, nil
|
||||
}
|
||||
|
||||
func (d DoltCommitFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, err
|
||||
}
|
||||
return DoDoltCommit(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltCommit(ctx *sql.Context, args []string) (string, error) {
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return "", err
|
||||
}
|
||||
// Get the information for the sql context.
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
apr, err := cli.CreateCommitArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
if apr.Contains(cli.UpperCaseAllFlag) {
|
||||
roots, err = actions.StageAllTables(ctx, roots)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf(err.Error())
|
||||
}
|
||||
} else if apr.Contains(cli.AllFlag) {
|
||||
roots, err = actions.StageModifiedAndDeletedTables(ctx, roots)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
var name, email string
|
||||
if authorStr, ok := apr.GetValue(cli.AuthorParam); ok {
|
||||
name, email, err = cli.ParseAuthor(authorStr)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
} else {
|
||||
name = dSess.Username()
|
||||
email = dSess.Email()
|
||||
}
|
||||
|
||||
amend := apr.Contains(cli.AmendFlag)
|
||||
|
||||
msg, msgOk := apr.GetValue(cli.MessageArg)
|
||||
if !msgOk {
|
||||
if amend {
|
||||
commit, err := dSess.GetHeadCommit(ctx, dbName)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
commitMeta, err := commit.GetCommitMeta(ctx)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
msg = commitMeta.Description
|
||||
} else {
|
||||
return "", fmt.Errorf("Must provide commit message.")
|
||||
}
|
||||
}
|
||||
|
||||
t := ctx.QueryTime()
|
||||
if commitTimeStr, ok := apr.GetValue(cli.DateParam); ok {
|
||||
var err error
|
||||
t, err = cli.ParseDate(commitTimeStr)
|
||||
|
||||
if err != nil {
|
||||
return "", fmt.Errorf(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
pendingCommit, err := dSess.NewPendingCommit(ctx, dbName, roots, actions.CommitStagedProps{
|
||||
Message: msg,
|
||||
Date: t,
|
||||
AllowEmpty: apr.Contains(cli.AllowEmptyFlag),
|
||||
Amend: amend,
|
||||
Force: apr.Contains(cli.ForceFlag),
|
||||
Name: name,
|
||||
Email: email,
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Nothing to commit, and we didn't pass --allowEmpty
|
||||
if pendingCommit == nil {
|
||||
return "", errors.New("nothing to commit")
|
||||
}
|
||||
|
||||
newCommit, err := dSess.DoltCommit(ctx, dbName, dSess.GetTransaction(), pendingCommit)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
h, err := newCommit.HashOf()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return h.String(), nil
|
||||
}
|
||||
|
||||
func getDoltArgs(ctx *sql.Context, row sql.Row, children []sql.Expression) ([]string, error) {
|
||||
args := make([]string, len(children))
|
||||
for i := range children {
|
||||
childVal, err := children[i].Eval(ctx, row)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
text, err := sql.Text.Convert(childVal)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
args[i] = text.(string)
|
||||
}
|
||||
|
||||
return args, nil
|
||||
}
|
||||
|
||||
func (d DoltCommitFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.children))
|
||||
|
||||
for _, child := range d.children {
|
||||
childrenStrings = append(childrenStrings, child.String())
|
||||
}
|
||||
return fmt.Sprintf("commit_hash")
|
||||
}
|
||||
|
||||
func (d DoltCommitFunc) Type() sql.Type {
|
||||
return sql.Text
|
||||
}
|
||||
|
||||
func (d DoltCommitFunc) IsNullable() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (d DoltCommitFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewDoltCommitFunc(children...)
|
||||
}
|
||||
|
||||
func (d DoltCommitFunc) Resolved() bool {
|
||||
for _, child := range d.Children() {
|
||||
if !child.Resolved() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (d DoltCommitFunc) Children() []sql.Expression {
|
||||
return d.children
|
||||
}
|
||||
@@ -1,114 +0,0 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
const DoltFetchFuncName = "dolt_fetch"
|
||||
|
||||
const (
|
||||
cmdFailure = 0
|
||||
cmdSuccess = 1
|
||||
)
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltFetchFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
// NewFetchFunc creates a new FetchFunc expression.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewFetchFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltFetchFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
|
||||
func (d DoltFetchFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.Children()))
|
||||
|
||||
for i, child := range d.Children() {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_FETCH(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltFetchFunc) Type() sql.Type {
|
||||
return sql.Boolean
|
||||
}
|
||||
|
||||
func (d DoltFetchFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewFetchFunc(children...)
|
||||
}
|
||||
|
||||
func (d DoltFetchFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
return DoDoltFetch(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltFetch(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return cmdFailure, fmt.Errorf("empty database name")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return cmdFailure, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
apr, err := cli.CreateFetchArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
remote, refSpecs, err := env.NewFetchOpts(apr.Args, dbData.Rsr)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
updateMode := ref.UpdateMode{Force: apr.Contains(cli.ForceFlag)}
|
||||
|
||||
srcDB, err := sess.Provider().GetRemoteDB(ctx, dbData.Ddb, remote, false)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = actions.FetchRefSpecs(ctx, dbData, srcDB, refSpecs, remote, updateMode, runProgFuncs, stopProgFuncs)
|
||||
if err != nil {
|
||||
return cmdFailure, fmt.Errorf("fetch failed: %w", err)
|
||||
}
|
||||
return cmdSuccess, nil
|
||||
}
|
||||
@@ -1,487 +0,0 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/table/editor"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/argparser"
|
||||
)
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewDoltMergeFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltMergeFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
|
||||
const DoltMergeFuncName = "dolt_merge"
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltMergeFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
const DoltMergeWarningCode int = 1105 // Since this our own custom warning we'll use 1105, the code for an unknown error
|
||||
|
||||
const (
|
||||
noConflictsOrViolations int = 0
|
||||
hasConflictsOrViolations int = 1
|
||||
)
|
||||
|
||||
const (
|
||||
threeWayMerge = 0
|
||||
fastForwardMerge = 1
|
||||
)
|
||||
|
||||
func (d DoltMergeFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, err
|
||||
}
|
||||
hasConflicts, _, err := DoDoltMerge(ctx, args)
|
||||
return hasConflicts, err
|
||||
}
|
||||
|
||||
// DoDoltMerge returns has_conflicts and fast_forward status
|
||||
func DoDoltMerge(ctx *sql.Context, args []string) (int, int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
|
||||
apr, err := cli.CreateMergeArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
if apr.ContainsAll(cli.SquashParam, cli.NoFFParam) {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("error: Flags '--%s' and '--%s' cannot be used together.\n", cli.SquashParam, cli.NoFFParam)
|
||||
}
|
||||
|
||||
ws, err := sess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
roots, ok := sess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
if apr.Contains(cli.AbortParam) {
|
||||
if !ws.MergeActive() {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("fatal: There is no merge to abort")
|
||||
}
|
||||
|
||||
ws, err = abortMerge(ctx, ws, roots)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
err := sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
err = sess.CommitWorkingSet(ctx, dbName, sess.GetTransaction())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
return noConflictsOrViolations, threeWayMerge, nil
|
||||
}
|
||||
|
||||
branchName := apr.Arg(0)
|
||||
|
||||
mergeSpec, err := createMergeSpec(ctx, sess, dbName, apr, branchName)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
msg := fmt.Sprintf("Merge branch '%s' into %s", branchName, dbData.Rsr.CWBHeadRef().GetPath())
|
||||
if userMsg, mOk := apr.GetValue(cli.MessageArg); mOk {
|
||||
msg = userMsg
|
||||
}
|
||||
|
||||
ws, conflicts, fastForward, err := performMerge(ctx, sess, roots, ws, dbName, mergeSpec, apr.Contains(cli.NoCommitFlag), msg)
|
||||
if err != nil || conflicts != 0 || fastForward != 0 {
|
||||
return conflicts, fastForward, err
|
||||
}
|
||||
|
||||
return conflicts, fastForward, nil
|
||||
}
|
||||
|
||||
// performMerge encapsulates server merge logic, switching between
|
||||
// fast-forward, no fast-forward, merge commit, and merging into working set.
|
||||
// Returns a new WorkingSet, whether there were merge conflicts, and whether a
|
||||
// fast-forward was performed. This commits the working set if merge is successful and
|
||||
// 'no-commit' flag is not defined.
|
||||
// TODO FF merging commit with constraint violations requires `constraint verify`
|
||||
func performMerge(ctx *sql.Context, sess *dsess.DoltSession, roots doltdb.Roots, ws *doltdb.WorkingSet, dbName string, spec *merge.MergeSpec, noCommit bool, msg string) (*doltdb.WorkingSet, int, int, error) {
|
||||
// todo: allow merges even when an existing merge is uncommitted
|
||||
if ws.MergeActive() {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, doltdb.ErrMergeActive
|
||||
}
|
||||
|
||||
err := checkForUncommittedChanges(ctx, roots.Working, roots.Head)
|
||||
if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, fmt.Errorf("failed to get dbData")
|
||||
}
|
||||
|
||||
canFF, err := spec.HeadC.CanFastForwardTo(ctx, spec.MergeC)
|
||||
if err != nil {
|
||||
switch err {
|
||||
case doltdb.ErrIsAhead, doltdb.ErrUpToDate:
|
||||
ctx.Warn(DoltMergeWarningCode, err.Error())
|
||||
default:
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
}
|
||||
|
||||
if canFF {
|
||||
if spec.Noff {
|
||||
ws, err = executeNoFFMerge(ctx, sess, spec, dbName, ws, dbData)
|
||||
if err == doltdb.ErrUnresolvedConflictsOrViolations {
|
||||
// if there are unresolved conflicts, write the resulting working set back to the session and return an
|
||||
// error message
|
||||
wsErr := sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if wsErr != nil {
|
||||
return ws, hasConflictsOrViolations, threeWayMerge, wsErr
|
||||
}
|
||||
|
||||
ctx.Warn(DoltMergeWarningCode, err.Error())
|
||||
|
||||
return ws, hasConflictsOrViolations, threeWayMerge, nil
|
||||
}
|
||||
return ws, noConflictsOrViolations, fastForwardMerge, err
|
||||
}
|
||||
|
||||
ws, err = executeFFMerge(ctx, dbName, spec.Squash, ws, dbData, spec.MergeC)
|
||||
return ws, noConflictsOrViolations, fastForwardMerge, err
|
||||
}
|
||||
|
||||
dbState, ok, err := sess.LookupDbState(ctx, dbName)
|
||||
if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
} else if !ok {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
ws, err = executeMerge(ctx, spec.Squash, spec.HeadC, spec.MergeC, spec.MergeCSpecStr, ws, dbState.EditOpts())
|
||||
if err == doltdb.ErrUnresolvedConflictsOrViolations {
|
||||
// if there are unresolved conflicts, write the resulting working set back to the session and return an
|
||||
// error message
|
||||
wsErr := sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if wsErr != nil {
|
||||
return ws, hasConflictsOrViolations, threeWayMerge, wsErr
|
||||
}
|
||||
|
||||
ctx.Warn(DoltMergeWarningCode, err.Error())
|
||||
|
||||
return ws, hasConflictsOrViolations, threeWayMerge, nil
|
||||
} else if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
err = sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
if !noCommit {
|
||||
author := fmt.Sprintf("%s <%s>", spec.Name, spec.Email)
|
||||
_, err = DoDoltCommit(ctx, []string{"-m", msg, "--author", author})
|
||||
if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, fmt.Errorf("dolt_commit failed")
|
||||
}
|
||||
}
|
||||
|
||||
return ws, noConflictsOrViolations, threeWayMerge, nil
|
||||
}
|
||||
|
||||
func abortMerge(ctx *sql.Context, workingSet *doltdb.WorkingSet, roots doltdb.Roots) (*doltdb.WorkingSet, error) {
|
||||
tbls, err := doltdb.UnionTableNames(ctx, roots.Working, roots.Staged, roots.Head)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
roots, err = actions.MoveTablesFromHeadToWorking(ctx, roots, tbls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// TODO: this doesn't seem right, it sets the root that we already edited above
|
||||
workingSet = workingSet.AbortMerge()
|
||||
return workingSet, nil
|
||||
}
|
||||
|
||||
func executeMerge(ctx *sql.Context, squash bool, head, cm *doltdb.Commit, cmSpec string, ws *doltdb.WorkingSet, opts editor.Options) (*doltdb.WorkingSet, error) {
|
||||
mergeRoot, mergeStats, err := merge.MergeCommits(ctx, head, cm, opts)
|
||||
|
||||
if err != nil {
|
||||
switch err {
|
||||
case doltdb.ErrUpToDate:
|
||||
return nil, errors.New("Already up to date.")
|
||||
case merge.ErrFastForward:
|
||||
panic("fast forward merge")
|
||||
default:
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return mergeRootToWorking(squash, ws, mergeRoot, cm, cmSpec, mergeStats)
|
||||
}
|
||||
|
||||
func executeFFMerge(ctx *sql.Context, dbName string, squash bool, ws *doltdb.WorkingSet, dbData env.DbData, cm2 *doltdb.Commit) (*doltdb.WorkingSet, error) {
|
||||
rv, err := cm2.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return ws, err
|
||||
}
|
||||
|
||||
// TODO: This is all incredibly suspect, needs to be replaced with library code that is functional instead of
|
||||
// altering global state
|
||||
if !squash {
|
||||
err = dbData.Ddb.FastForward(ctx, dbData.Rsr.CWBHeadRef(), cm2)
|
||||
if err != nil {
|
||||
return ws, err
|
||||
}
|
||||
}
|
||||
|
||||
ws = ws.WithWorkingRoot(rv).WithStagedRoot(rv)
|
||||
|
||||
// We need to assign the working set to the session but ensure that its state is not labeled as dirty (ffs are clean
|
||||
// merges). Hence, we go ahead and commit the working set to the transaction.
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
|
||||
err = sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return ws, err
|
||||
}
|
||||
|
||||
// We only fully commit our transaction when we are not squashing.
|
||||
if !squash {
|
||||
err = sess.CommitWorkingSet(ctx, dbName, sess.GetTransaction())
|
||||
if err != nil {
|
||||
return ws, err
|
||||
}
|
||||
}
|
||||
|
||||
return ws, nil
|
||||
}
|
||||
|
||||
func executeNoFFMerge(
|
||||
ctx *sql.Context,
|
||||
dSess *dsess.DoltSession,
|
||||
spec *merge.MergeSpec,
|
||||
dbName string,
|
||||
ws *doltdb.WorkingSet,
|
||||
dbData env.DbData,
|
||||
) (*doltdb.WorkingSet, error) {
|
||||
mergeRoot, err := spec.MergeC.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ws, err = mergeRootToWorking(false, ws, mergeRoot, spec.MergeC, spec.MergeCSpecStr, map[string]*merge.MergeStats{})
|
||||
if err != nil {
|
||||
// This error is recoverable, so we return a working set value along with the error
|
||||
return ws, err
|
||||
}
|
||||
|
||||
// Save our work so far in the session, as it will be referenced by the commit call below (badly in need of a
|
||||
// refactoring)
|
||||
err = dSess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// The roots need refreshing after the above
|
||||
roots, _ := dSess.GetRoots(ctx, dbName)
|
||||
|
||||
pendingCommit, err := dSess.NewPendingCommit(ctx, dbName, roots, actions.CommitStagedProps{
|
||||
Message: spec.Msg,
|
||||
Date: spec.Date,
|
||||
AllowEmpty: spec.AllowEmpty,
|
||||
Force: spec.Force,
|
||||
Name: spec.Name,
|
||||
Email: spec.Email,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if pendingCommit == nil {
|
||||
return nil, errors.New("nothing to commit")
|
||||
}
|
||||
|
||||
_, err = dSess.DoltCommit(ctx, dbName, dSess.GetTransaction(), pendingCommit)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ws, nil
|
||||
}
|
||||
|
||||
func createMergeSpec(ctx *sql.Context, sess *dsess.DoltSession, dbName string, apr *argparser.ArgParseResults, commitSpecStr string) (*merge.MergeSpec, error) {
|
||||
ddb, ok := sess.GetDoltDB(ctx, dbName)
|
||||
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
|
||||
msg, ok := apr.GetValue(cli.MessageArg)
|
||||
if !ok {
|
||||
// TODO probably change, but we can't open editor so it'll have to be automated
|
||||
msg = "automatic SQL merge"
|
||||
}
|
||||
|
||||
var err error
|
||||
var name, email string
|
||||
if authorStr, ok := apr.GetValue(cli.AuthorParam); ok {
|
||||
name, email, err = cli.ParseAuthor(authorStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
name = sess.Username()
|
||||
email = sess.Email()
|
||||
}
|
||||
|
||||
t := ctx.QueryTime()
|
||||
if commitTimeStr, ok := apr.GetValue(cli.DateParam); ok {
|
||||
t, err = cli.ParseDate(commitTimeStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
roots, ok := sess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return nil, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
if apr.Contains(cli.NoCommitFlag) && apr.Contains(cli.CommitFlag) {
|
||||
return nil, errors.New("cannot define both 'commit' and 'no-commit' flags at the same time")
|
||||
}
|
||||
mergeSpec, err := merge.NewMergeSpec(ctx, dbData.Rsr, ddb, roots, name, email, msg, commitSpecStr, apr.Contains(cli.SquashParam), apr.Contains(cli.NoFFParam), apr.Contains(cli.ForceFlag), apr.Contains(cli.NoCommitFlag), apr.Contains(cli.NoEditFlag), t)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return mergeSpec, nil
|
||||
}
|
||||
|
||||
// TODO: this copied from commands/merge.go because the latter isn't reusable. Fix that.
|
||||
func mergeRootToWorking(
|
||||
squash bool,
|
||||
ws *doltdb.WorkingSet,
|
||||
mergedRoot *doltdb.RootValue,
|
||||
cm2 *doltdb.Commit,
|
||||
cm2Spec string,
|
||||
mergeStats map[string]*merge.MergeStats,
|
||||
) (*doltdb.WorkingSet, error) {
|
||||
|
||||
workingRoot := mergedRoot
|
||||
if !squash {
|
||||
ws = ws.StartMerge(cm2, cm2Spec)
|
||||
}
|
||||
|
||||
ws = ws.WithWorkingRoot(workingRoot).WithStagedRoot(workingRoot)
|
||||
if checkForConflicts(mergeStats) || checkForViolations(mergeStats) {
|
||||
// this error is recoverable in-session, so we return the new ws along with the error
|
||||
return ws, doltdb.ErrUnresolvedConflictsOrViolations
|
||||
}
|
||||
|
||||
return ws, nil
|
||||
}
|
||||
|
||||
func checkForUncommittedChanges(ctx *sql.Context, root *doltdb.RootValue, headRoot *doltdb.RootValue) error {
|
||||
rh, err := root.HashOf()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
hrh, err := headRoot.HashOf()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if rh != hrh {
|
||||
return ErrUncommittedChanges.New()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkForConflicts(tblToStats map[string]*merge.MergeStats) bool {
|
||||
for _, stats := range tblToStats {
|
||||
if stats.Operation == merge.TableModified && stats.Conflicts > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func checkForViolations(tblToStats map[string]*merge.MergeStats) bool {
|
||||
for _, stats := range tblToStats {
|
||||
if stats.ConstraintViolations > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (d DoltMergeFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.Children()))
|
||||
|
||||
for i, child := range d.Children() {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_MERGE(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltMergeFunc) Type() sql.Type {
|
||||
return sql.Boolean
|
||||
}
|
||||
|
||||
func (d DoltMergeFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewDoltMergeFunc(children...)
|
||||
}
|
||||
@@ -1,265 +0,0 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/store/datas/pull"
|
||||
)
|
||||
|
||||
const DoltPullFuncName = "dolt_pull"
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltPullFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
// NewPullFunc creates a new PullFunc expression.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewPullFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltPullFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
|
||||
func (d DoltPullFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.Children()))
|
||||
|
||||
for i, child := range d.Children() {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_PULL(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltPullFunc) Type() sql.Type {
|
||||
return sql.Boolean
|
||||
}
|
||||
|
||||
func (d DoltPullFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewPullFunc(children...)
|
||||
}
|
||||
|
||||
func (d DoltPullFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, err
|
||||
}
|
||||
conflicts, _, err := DoDoltPull(ctx, args)
|
||||
return conflicts, err
|
||||
}
|
||||
|
||||
// DoDoltPull returns conflicts, fast_forward statuses
|
||||
func DoDoltPull(ctx *sql.Context, args []string) (int, int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
apr, err := cli.CreatePullArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
if apr.NArg() > 2 {
|
||||
return noConflictsOrViolations, threeWayMerge, actions.ErrInvalidPullArgs
|
||||
}
|
||||
|
||||
var remoteName, remoteRefName string
|
||||
if apr.NArg() == 1 {
|
||||
remoteName = apr.Arg(0)
|
||||
} else if apr.NArg() == 2 {
|
||||
remoteName = apr.Arg(0)
|
||||
remoteRefName = apr.Arg(1)
|
||||
}
|
||||
|
||||
pullSpec, err := env.NewPullSpec(ctx, dbData.Rsr, remoteName, remoteRefName, apr.Contains(cli.SquashParam), apr.Contains(cli.NoFFParam), apr.Contains(cli.NoCommitFlag), apr.Contains(cli.NoEditFlag), apr.Contains(cli.ForceFlag), apr.NArg() == 1)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
srcDB, err := sess.Provider().GetRemoteDB(ctx, dbData.Ddb, pullSpec.Remote, false)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("failed to get remote db; %w", err)
|
||||
}
|
||||
|
||||
ws, err := sess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
// Fetch all references
|
||||
branchRefs, err := srcDB.GetHeadRefs(ctx)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("%w: %s", env.ErrFailedToReadDb, err.Error())
|
||||
}
|
||||
|
||||
_, hasBranch, err := srcDB.HasBranch(ctx, pullSpec.Branch.GetPath())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
if !hasBranch {
|
||||
return noConflictsOrViolations, threeWayMerge,
|
||||
fmt.Errorf("branch %q not found on remote", pullSpec.Branch.GetPath())
|
||||
}
|
||||
|
||||
var conflicts int
|
||||
var fastForward int
|
||||
for _, refSpec := range pullSpec.RefSpecs {
|
||||
rsSeen := false // track invalid refSpecs
|
||||
for _, branchRef := range branchRefs {
|
||||
remoteTrackRef := refSpec.DestRef(branchRef)
|
||||
|
||||
if remoteTrackRef == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
rsSeen = true
|
||||
tmpDir, err := dbData.Rsw.TempTableFilesDir()
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
// todo: can we pass nil for either of the channels?
|
||||
srcDBCommit, err := actions.FetchRemoteBranch(ctx, tmpDir, pullSpec.Remote, srcDB, dbData.Ddb, branchRef, nil, nil)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
// TODO: this could be replaced with a canFF check to test for error
|
||||
err = dbData.Ddb.FastForward(ctx, remoteTrackRef, srcDBCommit)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("fetch failed; %w", err)
|
||||
}
|
||||
|
||||
// Only merge iff branch is current branch and there is an upstream set (pullSpec.Branch is set to nil if there is no upstream)
|
||||
if branchRef != pullSpec.Branch {
|
||||
continue
|
||||
}
|
||||
|
||||
roots, ok := sess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
mergeSpec, err := createMergeSpec(ctx, sess, dbName, apr, remoteTrackRef.String())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
msg := fmt.Sprintf("Merge branch '%s' of %s into %s", pullSpec.Branch.GetPath(), pullSpec.Remote.Url, dbData.Rsr.CWBHeadRef().GetPath())
|
||||
ws, conflicts, fastForward, err = performMerge(ctx, sess, roots, ws, dbName, mergeSpec, apr.Contains(cli.NoCommitFlag), msg)
|
||||
if err != nil && !errors.Is(doltdb.ErrUpToDate, err) {
|
||||
return conflicts, fastForward, err
|
||||
}
|
||||
|
||||
err = sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return conflicts, fastForward, err
|
||||
}
|
||||
}
|
||||
if !rsSeen {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("%w: '%s'", ref.ErrInvalidRefSpec, refSpec.GetRemRefToLocal())
|
||||
}
|
||||
}
|
||||
|
||||
tmpDir, err := dbData.Rsw.TempTableFilesDir()
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
err = actions.FetchFollowTags(ctx, tmpDir, srcDB, dbData.Ddb, runProgFuncs, stopProgFuncs)
|
||||
if err != nil {
|
||||
return conflicts, fastForward, err
|
||||
}
|
||||
|
||||
return conflicts, fastForward, nil
|
||||
}
|
||||
|
||||
func pullerProgFunc(ctx context.Context, statsCh <-chan pull.Stats) {
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
return
|
||||
}
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-statsCh:
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func progFunc(ctx context.Context, progChan <-chan pull.PullProgress) {
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
return
|
||||
}
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-progChan:
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func runProgFuncs(ctx context.Context) (*sync.WaitGroup, chan pull.PullProgress, chan pull.Stats) {
|
||||
statsCh := make(chan pull.Stats)
|
||||
progChan := make(chan pull.PullProgress)
|
||||
wg := &sync.WaitGroup{}
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
progFunc(ctx, progChan)
|
||||
}()
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
pullerProgFunc(ctx, statsCh)
|
||||
}()
|
||||
|
||||
return wg, progChan, statsCh
|
||||
}
|
||||
|
||||
func stopProgFuncs(cancel context.CancelFunc, wg *sync.WaitGroup, progChan chan pull.PullProgress, statsCh chan pull.Stats) {
|
||||
cancel()
|
||||
close(progChan)
|
||||
close(statsCh)
|
||||
wg.Wait()
|
||||
}
|
||||
@@ -1,127 +0,0 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/store/datas"
|
||||
)
|
||||
|
||||
const DoltPushFuncName = "dolt_push"
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltPushFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
// NewPushFunc creates a new PushFunc expression.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewPushFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &DoltPushFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
|
||||
func (d DoltPushFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.Children()))
|
||||
|
||||
for i, child := range d.Children() {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_PUSH(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltPushFunc) Type() sql.Type {
|
||||
return sql.Boolean
|
||||
}
|
||||
|
||||
func (d DoltPushFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewPushFunc(children...)
|
||||
}
|
||||
|
||||
func (d DoltPushFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
return DoDoltPush(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltPush(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return cmdFailure, fmt.Errorf("empty database name")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
|
||||
if !ok {
|
||||
return cmdFailure, fmt.Errorf("could not load database %s", dbName)
|
||||
}
|
||||
|
||||
apr, err := cli.CreatePushArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
autoSetUpRemote := loadConfig(ctx).GetStringOrDefault(env.PushAutoSetupRemote, "false")
|
||||
pushAutoSetUpRemote, err := strconv.ParseBool(autoSetUpRemote)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
opts, err := env.NewPushOpts(ctx, apr, dbData.Rsr, dbData.Ddb, apr.Contains(cli.ForceFlag), apr.Contains(cli.SetUpstreamFlag), pushAutoSetUpRemote)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
remoteDB, err := sess.Provider().GetRemoteDB(ctx, dbData.Ddb, opts.Remote, true)
|
||||
if err != nil {
|
||||
return 1, actions.HandleInitRemoteStorageClientErr(opts.Remote.Name, opts.Remote.Url, err)
|
||||
}
|
||||
|
||||
tmpDir, err := dbData.Rsw.TempTableFilesDir()
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
err = actions.DoPush(ctx, dbData.Rsr, dbData.Rsw, dbData.Ddb, remoteDB, tmpDir, opts, runProgFuncs, stopProgFuncs)
|
||||
if err != nil {
|
||||
switch err {
|
||||
case doltdb.ErrUpToDate:
|
||||
return cmdSuccess, nil
|
||||
case datas.ErrMergeNeeded:
|
||||
return cmdFailure, fmt.Errorf("%w; the tip of your current branch is behind its remote counterpart", err)
|
||||
default:
|
||||
return cmdFailure, err
|
||||
}
|
||||
}
|
||||
// TODO : set upstream should be persisted outside of session
|
||||
return cmdSuccess, nil
|
||||
}
|
||||
@@ -1,181 +0,0 @@
|
||||
// Copyright 2020 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
const DoltResetFuncName = "dolt_reset"
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type DoltResetFunc struct {
|
||||
children []sql.Expression
|
||||
}
|
||||
|
||||
func (d DoltResetFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, d.Children())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return DoDoltReset(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltReset(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := dSess.GetDbData(ctx, dbName)
|
||||
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
apr, err := cli.CreateResetArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
// Check if problems with args first.
|
||||
if apr.ContainsAll(cli.HardResetParam, cli.SoftResetParam) {
|
||||
return 1, fmt.Errorf("error: --%s and --%s are mutually exclusive options.", cli.HardResetParam, cli.SoftResetParam)
|
||||
}
|
||||
|
||||
provider := dSess.Provider()
|
||||
db, err := provider.Database(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
// Disallow manipulating any roots for read-only databases – changing the branch
|
||||
// HEAD would allow changing data, and working set and index shouldn't ever have
|
||||
// any contents for a read-only database.
|
||||
if rodb, ok := db.(sql.ReadOnlyDatabase); ok {
|
||||
if rodb.IsReadOnly() {
|
||||
return 1, fmt.Errorf("unable to reset HEAD in read-only databases")
|
||||
}
|
||||
}
|
||||
|
||||
// Get all the needed roots.
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
if apr.Contains(cli.HardResetParam) {
|
||||
// Get the commitSpec for the branch if it exists
|
||||
arg := ""
|
||||
if apr.NArg() > 1 {
|
||||
return 1, fmt.Errorf("--hard supports at most one additional param")
|
||||
} else if apr.NArg() == 1 {
|
||||
arg = apr.Arg(0)
|
||||
}
|
||||
|
||||
var newHead *doltdb.Commit
|
||||
newHead, roots, err = actions.ResetHardTables(ctx, dbData, arg, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
// TODO: this overrides the transaction setting, needs to happen at commit, not here
|
||||
if newHead != nil {
|
||||
if err := dbData.Ddb.SetHeadToCommit(ctx, dbData.Rsr.CWBHeadRef(), newHead); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
|
||||
ws, err := dSess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
err = dSess.SetWorkingSet(ctx, dbName, ws.WithWorkingRoot(roots.Working).WithStagedRoot(roots.Staged).ClearMerge())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
} else {
|
||||
roots, err = actions.ResetSoftTables(ctx, dbData, apr, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = dSess.SetRoots(ctx, dbName, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
func (d DoltResetFunc) Resolved() bool {
|
||||
for _, child := range d.Children() {
|
||||
if !child.Resolved() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (d DoltResetFunc) String() string {
|
||||
childrenStrings := make([]string, len(d.children))
|
||||
|
||||
for i, child := range d.children {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
|
||||
return fmt.Sprintf("DOLT_RESET(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
func (d DoltResetFunc) Type() sql.Type {
|
||||
return sql.Int8
|
||||
}
|
||||
|
||||
func (d DoltResetFunc) IsNullable() bool {
|
||||
for _, child := range d.Children() {
|
||||
if child.IsNullable() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func (d DoltResetFunc) Children() []sql.Expression {
|
||||
return d.children
|
||||
}
|
||||
|
||||
func (d DoltResetFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewDoltResetFunc(children...)
|
||||
}
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewDoltResetFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return DoltResetFunc{children: args}, nil
|
||||
}
|
||||
@@ -18,25 +18,10 @@ import "github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
var DoltFunctions = []sql.Function{
|
||||
sql.Function1{Name: HashOfFuncName, Fn: NewHashOf},
|
||||
sql.FunctionN{Name: CommitFuncName, Fn: NewCommitFunc},
|
||||
sql.FunctionN{Name: MergeFuncName, Fn: NewMergeFunc},
|
||||
sql.Function0{Name: VersionFuncName, Fn: NewVersion},
|
||||
sql.Function0{Name: StorageFormatFuncName, Fn: NewStorageFormat},
|
||||
sql.FunctionN{Name: DoltCommitFuncName, Fn: NewDoltCommitFunc},
|
||||
sql.FunctionN{Name: DoltAddFuncName, Fn: NewDoltAddFunc},
|
||||
sql.FunctionN{Name: DoltCleanFuncName, Fn: NewDoltCleanFunc},
|
||||
sql.FunctionN{Name: DoltResetFuncName, Fn: NewDoltResetFunc},
|
||||
sql.FunctionN{Name: DoltCheckoutFuncName, Fn: NewDoltCheckoutFunc},
|
||||
sql.FunctionN{Name: DoltMergeFuncName, Fn: NewDoltMergeFunc},
|
||||
sql.Function0{Name: ActiveBranchFuncName, Fn: NewActiveBranchFunc},
|
||||
sql.Function2{Name: DoltMergeBaseFuncName, Fn: NewMergeBase},
|
||||
sql.FunctionN{Name: ConstraintsVerifyFuncName, Fn: NewConstraintsVerifyFunc},
|
||||
sql.FunctionN{Name: RevertFuncName, Fn: NewRevertFunc},
|
||||
sql.FunctionN{Name: DoltPullFuncName, Fn: NewPullFunc},
|
||||
sql.FunctionN{Name: DoltFetchFuncName, Fn: NewFetchFunc},
|
||||
sql.FunctionN{Name: DoltPushFuncName, Fn: NewPushFunc},
|
||||
sql.FunctionN{Name: DoltBranchFuncName, Fn: NewDoltBranchFunc},
|
||||
sql.FunctionN{Name: DoltBackupFuncName, Fn: NewDoltBackupFunc},
|
||||
}
|
||||
|
||||
// DolthubApiFunctions are the DoltFunctions that get exposed to Dolthub Api.
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
// Copyright 2020 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
goerrors "gopkg.in/src-d/go-errors.v1"
|
||||
)
|
||||
|
||||
const MergeFuncName = "merge"
|
||||
|
||||
var ErrUncommittedChanges = goerrors.NewKind("cannot merge with uncommitted changes")
|
||||
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type MergeFunc struct {
|
||||
children []sql.Expression
|
||||
}
|
||||
|
||||
// NewMergeFunc creates a new MergeFunc expression.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewMergeFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &MergeFunc{children: args}, nil
|
||||
}
|
||||
|
||||
// Eval implements the Expression interface.
|
||||
func (mf *MergeFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, mf.Children())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, err
|
||||
}
|
||||
hasConflicts, _, err := DoDoltMerge(ctx, args)
|
||||
return hasConflicts, err
|
||||
}
|
||||
|
||||
// String implements the Stringer interface.
|
||||
func (mf *MergeFunc) String() string {
|
||||
childrenStrings := make([]string, len(mf.children))
|
||||
|
||||
for i, child := range mf.children {
|
||||
childrenStrings[i] = child.String()
|
||||
}
|
||||
return fmt.Sprintf("Merge(%s)", strings.Join(childrenStrings, ","))
|
||||
}
|
||||
|
||||
// IsNullable implements the Expression interface.
|
||||
func (mf *MergeFunc) IsNullable() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (mf *MergeFunc) Resolved() bool {
|
||||
for _, child := range mf.Children() {
|
||||
if !child.Resolved() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (mf *MergeFunc) Children() []sql.Expression {
|
||||
return mf.children
|
||||
}
|
||||
|
||||
// WithChildren implements the Expression interface.
|
||||
func (mf *MergeFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewMergeFunc(children...)
|
||||
}
|
||||
|
||||
// Type implements the Expression interface.
|
||||
func (mf *MergeFunc) Type() sql.Type {
|
||||
return sql.Text
|
||||
}
|
||||
@@ -1,193 +0,0 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/schema/typeinfo"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
const (
|
||||
RevertFuncName = "dolt_revert"
|
||||
)
|
||||
|
||||
// RevertFunc represents the dolt function "dolt revert".
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type RevertFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
var _ sql.Expression = (*RevertFunc)(nil)
|
||||
|
||||
// NewRevertFunc creates a new RevertFunc expression that reverts commits.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewRevertFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &RevertFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
|
||||
// Eval implements the Expression interface.
|
||||
func (r *RevertFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, r.ChildExpressions)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return DoDoltRevert(ctx, row, args)
|
||||
}
|
||||
|
||||
func DoDoltRevert(ctx *sql.Context, row sql.Row, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
ddb, ok := dSess.GetDoltDB(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("dolt database could not be found")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingSet, err := dSess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingRoot := workingSet.WorkingRoot()
|
||||
headCommit, err := dSess.GetHeadCommit(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
headRoot, err := headCommit.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
headHash, err := headRoot.HashOf()
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingHash, err := workingRoot.HashOf()
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
if !headHash.Equal(workingHash) {
|
||||
return 1, fmt.Errorf("you must commit any changes before using revert")
|
||||
}
|
||||
|
||||
headRef, err := dSess.CWBHeadRef(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateRevertArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
commits := make([]*doltdb.Commit, apr.NArg())
|
||||
for i, revisionStr := range apr.Args {
|
||||
commitSpec, err := doltdb.NewCommitSpec(revisionStr)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
commit, err := ddb.Resolve(ctx, commitSpec, headRef)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
commits[i] = commit
|
||||
}
|
||||
|
||||
dbState, ok, err := dSess.LookupDbState(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
} else if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
workingRoot, revertMessage, err := merge.Revert(ctx, ddb, workingRoot, headCommit, commits, dbState.EditOpts())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingHash, err = workingRoot.HashOf()
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
if !headHash.Equal(workingHash) {
|
||||
err = dSess.SetRoot(ctx, dbName, workingRoot)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
stringType := typeinfo.StringDefaultType.ToSqlType()
|
||||
|
||||
expressions := []sql.Expression{expression.NewLiteral("-a", stringType), expression.NewLiteral("-m", stringType), expression.NewLiteral(revertMessage, stringType)}
|
||||
|
||||
author, hasAuthor := apr.GetValue(cli.AuthorParam)
|
||||
if hasAuthor {
|
||||
expressions = append(expressions, expression.NewLiteral("--author", stringType), expression.NewLiteral(author, stringType))
|
||||
}
|
||||
|
||||
commitFunc, err := NewDoltCommitFunc(expressions...)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
_, err = commitFunc.Eval(ctx, row)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
// String implements the Stringer interface.
|
||||
func (r *RevertFunc) String() string {
|
||||
return fmt.Sprint("DOLT_REVERT()")
|
||||
}
|
||||
|
||||
// IsNullable implements the Expression interface.
|
||||
func (r *RevertFunc) IsNullable() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// Resolved implements the Expression interface.
|
||||
func (r *RevertFunc) Resolved() bool {
|
||||
for _, expr := range r.ChildExpressions {
|
||||
if !expr.Resolved() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (r *RevertFunc) Type() sql.Type {
|
||||
return sql.Int8
|
||||
}
|
||||
|
||||
// Children implements the Expression interface.
|
||||
func (r *RevertFunc) Children() []sql.Expression {
|
||||
exprs := make([]sql.Expression, len(r.ChildExpressions))
|
||||
for i := range exprs {
|
||||
exprs[i] = r.ChildExpressions[i]
|
||||
}
|
||||
return exprs
|
||||
}
|
||||
|
||||
// WithChildren implements the Expression interface.
|
||||
func (r *RevertFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewRevertFunc(children...)
|
||||
}
|
||||
@@ -1,170 +0,0 @@
|
||||
// Copyright 2021 Dolthub, Inc.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package dfunctions
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/set"
|
||||
)
|
||||
|
||||
const (
|
||||
ConstraintsVerifyFuncName = "constraints_verify"
|
||||
)
|
||||
|
||||
// ConstraintsVerifyFunc represents the sql functions "verify_constraints"
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
type ConstraintsVerifyFunc struct {
|
||||
expression.NaryExpression
|
||||
}
|
||||
|
||||
var _ sql.Expression = (*ConstraintsVerifyFunc)(nil)
|
||||
|
||||
// NewConstraintsVerifyFunc creates a new ConstraintsVerifyFunc expression that verifies the diff.
|
||||
// Deprecated: please use the version in the dprocedures package
|
||||
func NewConstraintsVerifyFunc(args ...sql.Expression) (sql.Expression, error) {
|
||||
return &ConstraintsVerifyFunc{expression.NaryExpression{ChildExpressions: args}}, nil
|
||||
}
|
||||
|
||||
// Eval implements the Expression interface.
|
||||
func (vc *ConstraintsVerifyFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error) {
|
||||
args, err := getDoltArgs(ctx, row, vc.ChildExpressions)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return DoDoltConstraintsVerify(ctx, args)
|
||||
}
|
||||
|
||||
func DoDoltConstraintsVerify(ctx *sql.Context, args []string) (int, error) {
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
workingSet, err := dSess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingRoot := workingSet.WorkingRoot()
|
||||
headCommit, err := dSess.GetHeadCommit(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
h, err := headCommit.HashOf()
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateVerifyConstraintsArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
verifyAll := apr.Contains(cli.AllFlag)
|
||||
outputOnly := apr.Contains(cli.OutputOnlyFlag)
|
||||
|
||||
var comparingRoot *doltdb.RootValue
|
||||
if verifyAll {
|
||||
comparingRoot, err = doltdb.EmptyRootValue(ctx, workingRoot.VRW(), workingRoot.NodeStore())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
} else {
|
||||
comparingRoot, err = headCommit.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
|
||||
tableSet := set.NewStrSet(nil)
|
||||
for _, val := range apr.Args {
|
||||
_, tableName, ok, err := workingRoot.GetTableInsensitive(ctx, val)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
if !ok {
|
||||
return 1, sql.ErrTableNotFound.New(tableName)
|
||||
}
|
||||
tableSet.Add(tableName)
|
||||
}
|
||||
|
||||
newRoot, tablesWithViolations, err := merge.AddForeignKeyViolations(ctx, workingRoot, comparingRoot, tableSet, h)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
if tablesWithViolations.Size() == 0 {
|
||||
// no violations were found
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
// violations were found
|
||||
|
||||
if !outputOnly {
|
||||
err = dSess.SetRoot(ctx, dbName, newRoot)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return 1, nil
|
||||
}
|
||||
|
||||
return 1, nil
|
||||
}
|
||||
|
||||
// String implements the Stringer interface.
|
||||
func (vc *ConstraintsVerifyFunc) String() string {
|
||||
return fmt.Sprint("CONSTRAINTS_VERIFY()")
|
||||
}
|
||||
|
||||
// IsNullable implements the Expression interface.
|
||||
func (vc *ConstraintsVerifyFunc) IsNullable() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
// Resolved implements the Expression interface.
|
||||
func (vc *ConstraintsVerifyFunc) Resolved() bool {
|
||||
for _, expr := range vc.ChildExpressions {
|
||||
if !expr.Resolved() {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func (vc *ConstraintsVerifyFunc) Type() sql.Type {
|
||||
return sql.Int8
|
||||
}
|
||||
|
||||
// Children implements the Expression interface.
|
||||
func (vc *ConstraintsVerifyFunc) Children() []sql.Expression {
|
||||
exprs := make([]sql.Expression, len(vc.ChildExpressions))
|
||||
for i := range exprs {
|
||||
exprs[i] = vc.ChildExpressions[i]
|
||||
}
|
||||
return exprs
|
||||
}
|
||||
|
||||
// WithChildren implements the Expression interface.
|
||||
func (vc *ConstraintsVerifyFunc) WithChildren(children ...sql.Expression) (sql.Expression, error) {
|
||||
return NewConstraintsVerifyFunc(children...)
|
||||
}
|
||||
@@ -15,16 +15,71 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
)
|
||||
|
||||
// doltAdd is the stored procedure version of the function `dolt_add`.
|
||||
func doltAdd(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltAdd(ctx, args)
|
||||
res, err := doDoltAdd(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltAdd(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateAddArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
allFlag := apr.Contains(cli.AllFlag)
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if apr.NArg() == 0 && !allFlag {
|
||||
return 1, fmt.Errorf("Nothing specified, nothing added. Maybe you wanted to say 'dolt add .'?")
|
||||
} else if allFlag || apr.NArg() == 1 && apr.Arg(0) == "." {
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("db session not found")
|
||||
}
|
||||
|
||||
roots, err = actions.StageAllTables(ctx, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = dSess.SetRoots(ctx, dbName, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
} else {
|
||||
roots, err = actions.StageTables(ctx, roots, apr.Args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = dSess.SetRoots(ctx, dbName, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
@@ -15,16 +15,149 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/dbfactory"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/filesys"
|
||||
"github.com/dolthub/dolt/go/store/datas/pull"
|
||||
)
|
||||
|
||||
const (
|
||||
DoltBackupFuncName = "dolt_backup"
|
||||
|
||||
statusOk = 1
|
||||
statusErr = 0
|
||||
)
|
||||
|
||||
// doltBackup is the stored procedure version of the function `dolt_backup`.
|
||||
func doltBackup(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltBackup(ctx, args)
|
||||
res, err := doDoltBackup(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltBackup(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
if len(dbName) == 0 {
|
||||
return statusErr, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateBackupArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
invalidParams := []string{dbfactory.AWSCredsFileParam, dbfactory.AWSCredsProfile, dbfactory.AWSCredsTypeParam, dbfactory.AWSRegionParam}
|
||||
for _, param := range invalidParams {
|
||||
if apr.Contains(param) {
|
||||
return statusErr, fmt.Errorf("parameter '%s' is not supported when running this command via SQL", param)
|
||||
}
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return statusErr, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
var b env.Remote
|
||||
switch {
|
||||
case apr.NArg() == 0:
|
||||
return statusErr, fmt.Errorf("listing existing backups endpoints in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.AddBackupId:
|
||||
return statusErr, fmt.Errorf("adding backup endpoint in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.RemoveBackupId:
|
||||
return statusErr, fmt.Errorf("removing backup endpoint in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.RemoveBackupShortId:
|
||||
return statusErr, fmt.Errorf("removing backup endpoint in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.RestoreBackupId:
|
||||
return statusErr, fmt.Errorf("restoring backup endpoint in sql is unimplemented.")
|
||||
case apr.Arg(0) == cli.SyncBackupUrlId:
|
||||
if apr.NArg() != 2 {
|
||||
return statusErr, fmt.Errorf("usage: dolt_backup('sync-url', BACKUP_URL)")
|
||||
}
|
||||
|
||||
backupUrl := strings.TrimSpace(apr.Arg(1))
|
||||
cfg := loadConfig(ctx)
|
||||
scheme, absBackupUrl, err := env.GetAbsRemoteUrl(filesys.LocalFS, cfg, backupUrl)
|
||||
if err != nil {
|
||||
return statusErr, fmt.Errorf("error: '%s' is not valid.", backupUrl)
|
||||
} else if scheme == dbfactory.HTTPScheme || scheme == dbfactory.HTTPSScheme {
|
||||
// not sure how to get the dialer so punting on this
|
||||
return statusErr, fmt.Errorf("sync-url does not support http or https backup locations currently")
|
||||
}
|
||||
|
||||
params, err := cli.ProcessBackupArgs(apr, scheme, absBackupUrl)
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
credsFile, _ := sess.GetSessionVariable(ctx, dsess.AwsCredsFile)
|
||||
credsFileStr, isStr := credsFile.(string)
|
||||
if isStr && len(credsFileStr) > 0 {
|
||||
params[dbfactory.AWSCredsFileParam] = credsFileStr
|
||||
}
|
||||
|
||||
credsProfile, err := sess.GetSessionVariable(ctx, dsess.AwsCredsProfile)
|
||||
profStr, isStr := credsProfile.(string)
|
||||
if isStr && len(profStr) > 0 {
|
||||
params[dbfactory.AWSCredsProfile] = profStr
|
||||
}
|
||||
|
||||
credsRegion, err := sess.GetSessionVariable(ctx, dsess.AwsCredsRegion)
|
||||
regionStr, isStr := credsRegion.(string)
|
||||
if isStr && len(regionStr) > 0 {
|
||||
params[dbfactory.AWSRegionParam] = regionStr
|
||||
}
|
||||
|
||||
b = env.NewRemote("__temp__", backupUrl, params)
|
||||
|
||||
case apr.Arg(0) == cli.SyncBackupId:
|
||||
if apr.NArg() != 2 {
|
||||
return statusErr, fmt.Errorf("usage: dolt_backup('sync', BACKUP_NAME)")
|
||||
}
|
||||
|
||||
backupName := strings.TrimSpace(apr.Arg(1))
|
||||
|
||||
backups, err := dbData.Rsr.GetBackups()
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
b, ok = backups[backupName]
|
||||
if !ok {
|
||||
return statusErr, fmt.Errorf("error: unknown backup: '%s'; %v", backupName, backups)
|
||||
}
|
||||
|
||||
default:
|
||||
return statusErr, fmt.Errorf("unrecognized dolt_backup parameter: %s", apr.Arg(0))
|
||||
}
|
||||
|
||||
destDb, err := sess.Provider().GetRemoteDB(ctx, dbData.Ddb, b, true)
|
||||
if err != nil {
|
||||
return statusErr, fmt.Errorf("error loading backup destination: %w", err)
|
||||
}
|
||||
|
||||
tmpDir, err := dbData.Rsw.TempTableFilesDir()
|
||||
if err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
err = actions.SyncRoots(ctx, dbData.Ddb, destDb, tmpDir, runProgFuncs, stopProgFuncs)
|
||||
if err != nil && err != pull.ErrDBUpToDate {
|
||||
return 1, fmt.Errorf("error syncing backup: %w", err)
|
||||
}
|
||||
return statusOk, nil
|
||||
}
|
||||
|
||||
@@ -15,16 +15,315 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqlserver"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/argparser"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/filesys"
|
||||
)
|
||||
|
||||
var (
|
||||
EmptyBranchNameErr = errors.New("error: cannot branch empty string")
|
||||
InvalidArgErr = errors.New("error: invalid usage")
|
||||
)
|
||||
|
||||
// doltBranch is the stored procedure version of the function `dolt_branch`.
|
||||
func doltBranch(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltBranch(ctx, args)
|
||||
res, err := doDoltBranch(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltBranch(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
|
||||
apr, err := cli.CreateBranchArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := dSess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
switch {
|
||||
case apr.Contains(cli.CopyFlag):
|
||||
err = copyBranch(ctx, dbData, apr)
|
||||
case apr.Contains(cli.MoveFlag):
|
||||
err = renameBranch(ctx, dbData, apr, dSess, dbName)
|
||||
case apr.Contains(cli.DeleteFlag), apr.Contains(cli.DeleteForceFlag):
|
||||
err = deleteBranches(ctx, dbData, apr, dSess, dbName)
|
||||
default:
|
||||
err = createNewBranch(ctx, dbData, apr)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return 1, err
|
||||
} else {
|
||||
return 0, nil
|
||||
}
|
||||
}
|
||||
|
||||
// renameBranch takes DoltSession and database name to try accessing file system for dolt database.
|
||||
// If the oldBranch being renamed is the current branch on CLI, then RepoState head will be updated with the newBranch ref.
|
||||
func renameBranch(ctx *sql.Context, dbData env.DbData, apr *argparser.ArgParseResults, sess *dsess.DoltSession, dbName string) error {
|
||||
if apr.NArg() != 2 {
|
||||
return InvalidArgErr
|
||||
}
|
||||
oldBranchName, newBranchName := apr.Arg(0), apr.Arg(1)
|
||||
if oldBranchName == "" || newBranchName == "" {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
if err := branch_control.CanDeleteBranch(ctx, oldBranchName); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := branch_control.CanCreateBranch(ctx, newBranchName); err != nil {
|
||||
return err
|
||||
}
|
||||
force := apr.Contains(cli.ForceFlag)
|
||||
|
||||
if !force {
|
||||
err := validateBranchNotActiveInAnySession(ctx, oldBranchName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
} else if err := branch_control.CanDeleteBranch(ctx, newBranchName); err != nil {
|
||||
// If force is enabled, we can overwrite the destination branch, so we require a permission check here, even if the
|
||||
// destination branch doesn't exist. An unauthorized user could simply rerun the command without the force flag.
|
||||
return err
|
||||
}
|
||||
|
||||
err := actions.RenameBranch(ctx, dbData, loadConfig(ctx), oldBranchName, newBranchName, force)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = branch_control.AddAdminForContext(ctx, newBranchName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// The current branch on CLI can be deleted as user can be on different branch on SQL and delete it from SQL session.
|
||||
// To update current head info on RepoState, we need DoltEnv to load CLI environment.
|
||||
if fs, err := sess.Provider().FileSystemForDatabase(dbName); err == nil {
|
||||
if repoState, err := env.LoadRepoState(fs); err == nil {
|
||||
if repoState.Head.Ref.GetPath() == oldBranchName {
|
||||
repoState.Head.Ref = ref.NewBranchRef(newBranchName)
|
||||
repoState.Save(fs)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// deleteBranches takes DoltSession and database name to try accessing file system for dolt database.
|
||||
// If the database is not session state db and the branch being deleted is the current branch on CLI, it will update
|
||||
// the RepoState to set head as empty branchRef.
|
||||
func deleteBranches(ctx *sql.Context, dbData env.DbData, apr *argparser.ArgParseResults, sess *dsess.DoltSession, dbName string) error {
|
||||
if apr.NArg() == 0 {
|
||||
return InvalidArgErr
|
||||
}
|
||||
|
||||
// The current branch on CLI can be deleted as user can be on different branch on SQL and delete it from SQL session.
|
||||
// To update current head info on RepoState, we need DoltEnv to load CLI environment.
|
||||
var rs *env.RepoState
|
||||
var headOnCLI string
|
||||
fs, err := sess.Provider().FileSystemForDatabase(dbName)
|
||||
if err == nil {
|
||||
if repoState, err := env.LoadRepoState(fs); err == nil {
|
||||
rs = repoState
|
||||
headOnCLI = repoState.Head.Ref.GetPath()
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that we can delete all branches before continuing
|
||||
for _, branchName := range apr.Args {
|
||||
if err = branch_control.CanDeleteBranch(ctx, branchName); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
var updateFS = false
|
||||
for _, branchName := range apr.Args {
|
||||
if len(branchName) == 0 {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
force := apr.Contains(cli.DeleteForceFlag) || apr.Contains(cli.ForceFlag)
|
||||
|
||||
if !force {
|
||||
err = validateBranchNotActiveInAnySession(ctx, branchName)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
err = actions.DeleteBranch(ctx, dbData, loadConfig(ctx), branchName, actions.DeleteOptions{
|
||||
Force: force,
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if headOnCLI == branchName {
|
||||
updateFS = true
|
||||
}
|
||||
}
|
||||
|
||||
if fs != nil && updateFS {
|
||||
rs.Head.Ref = ref.NewBranchRef("")
|
||||
rs.Save(fs)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// validateBranchNotActiveInAnySessions returns an error if the specified branch is currently
|
||||
// selected as the active branch for any active server sessions.
|
||||
func validateBranchNotActiveInAnySession(ctx *sql.Context, branchName string) error {
|
||||
currentDbName, _, err := getRevisionForRevisionDatabase(ctx, ctx.GetCurrentDatabase())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if currentDbName == "" {
|
||||
return nil
|
||||
}
|
||||
|
||||
if sqlserver.RunningInServerMode() == false {
|
||||
return nil
|
||||
}
|
||||
|
||||
runningServer := sqlserver.GetRunningServer()
|
||||
if runningServer == nil {
|
||||
return nil
|
||||
}
|
||||
sessionManager := runningServer.SessionManager()
|
||||
branchRef := ref.NewBranchRef(branchName)
|
||||
|
||||
return sessionManager.Iter(func(session sql.Session) (bool, error) {
|
||||
dsess, ok := session.(*dsess.DoltSession)
|
||||
if !ok {
|
||||
return false, fmt.Errorf("unexpected session type: %T", session)
|
||||
}
|
||||
|
||||
sessionDatabase := dsess.Session.GetCurrentDatabase()
|
||||
sessionDbName, _, err := getRevisionForRevisionDatabase(ctx, dsess.GetCurrentDatabase())
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if len(sessionDatabase) == 0 || sessionDbName != currentDbName {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
activeBranchRef, err := dsess.CWBHeadRef(ctx, sessionDatabase)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
if ref.Equals(branchRef, activeBranchRef) {
|
||||
return false, fmt.Errorf("unsafe to delete or rename branches in use in other sessions; " +
|
||||
"use --force to force the change")
|
||||
}
|
||||
|
||||
return false, nil
|
||||
})
|
||||
}
|
||||
|
||||
//TODO: the config should be available via the context, it's unnecessary to do an env.Load here and this should be removed
|
||||
func loadConfig(ctx *sql.Context) *env.DoltCliConfig {
|
||||
// When executing branch actions from SQL, we don't have access to a DoltEnv like we do from
|
||||
// within the CLI. We can fake it here enough to get a DoltCliConfig, but we can't rely on the
|
||||
// DoltEnv because tests and production will run with different settings (e.g. in-mem versus file).
|
||||
dEnv := env.Load(ctx, env.GetCurrentUserHomeDir, filesys.LocalFS, doltdb.LocalDirDoltDB, "")
|
||||
return dEnv.Config
|
||||
}
|
||||
|
||||
func createNewBranch(ctx *sql.Context, dbData env.DbData, apr *argparser.ArgParseResults) error {
|
||||
var branchName string
|
||||
var startPt = "HEAD"
|
||||
if apr.NArg() == 1 {
|
||||
branchName = apr.Arg(0)
|
||||
} else if apr.NArg() == 2 {
|
||||
branchName = apr.Arg(0)
|
||||
startPt = apr.Arg(1)
|
||||
if len(startPt) == 0 {
|
||||
return InvalidArgErr
|
||||
}
|
||||
}
|
||||
|
||||
if len(branchName) == 0 {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
|
||||
if err := branch_control.CanCreateBranch(ctx, branchName); err != nil {
|
||||
return err
|
||||
}
|
||||
return actions.CreateBranchWithStartPt(ctx, dbData, branchName, startPt, apr.Contains(cli.ForceFlag))
|
||||
}
|
||||
|
||||
func copyBranch(ctx *sql.Context, dbData env.DbData, apr *argparser.ArgParseResults) error {
|
||||
if apr.NArg() != 2 {
|
||||
return InvalidArgErr
|
||||
}
|
||||
|
||||
srcBr := apr.Args[0]
|
||||
if len(srcBr) == 0 {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
|
||||
destBr := apr.Args[1]
|
||||
if len(destBr) == 0 {
|
||||
return EmptyBranchNameErr
|
||||
}
|
||||
|
||||
force := apr.Contains(cli.ForceFlag)
|
||||
return copyABranch(ctx, dbData, srcBr, destBr, force)
|
||||
}
|
||||
|
||||
func copyABranch(ctx *sql.Context, dbData env.DbData, srcBr string, destBr string, force bool) error {
|
||||
if err := branch_control.CanCreateBranch(ctx, destBr); err != nil {
|
||||
return err
|
||||
}
|
||||
// If force is enabled, we can overwrite the destination branch, so we require a permission check here, even if the
|
||||
// destination branch doesn't exist. An unauthorized user could simply rerun the command without the force flag.
|
||||
if force {
|
||||
if err := branch_control.CanDeleteBranch(ctx, destBr); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
err := actions.CopyBranchOnDB(ctx, dbData.Ddb, srcBr, destBr, force)
|
||||
if err != nil {
|
||||
if err == doltdb.ErrBranchNotFound {
|
||||
return errors.New(fmt.Sprintf("fatal: A branch named '%s' not found", srcBr))
|
||||
} else if err == actions.ErrAlreadyExists {
|
||||
return errors.New(fmt.Sprintf("fatal: A branch named '%s' already exists.", destBr))
|
||||
} else if err == doltdb.ErrInvBranchName {
|
||||
return errors.New(fmt.Sprintf("fatal: '%s' is not a valid branch name.", destBr))
|
||||
} else {
|
||||
return errors.New(fmt.Sprintf("fatal: Unexpected error copying branch from '%s' to '%s'", srcBr, destBr))
|
||||
}
|
||||
}
|
||||
err = branch_control.AddAdminForContext(ctx, destBr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -15,16 +15,258 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/store/hash"
|
||||
)
|
||||
|
||||
var ErrEmptyBranchName = errors.New("error: cannot checkout empty string")
|
||||
|
||||
// doltCheckout is the stored procedure version of the function `dolt_checkout`.
|
||||
func doltCheckout(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltCheckout(ctx, args)
|
||||
res, err := doDoltCheckout(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltCheckout(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
|
||||
dbName, _, err := getRevisionForRevisionDatabase(ctx, dbName)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateCheckoutArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
if (apr.Contains(cli.CheckoutCoBranch) && apr.NArg() > 1) || (!apr.Contains(cli.CheckoutCoBranch) && apr.NArg() == 0) {
|
||||
return 1, errors.New("Improper usage.")
|
||||
}
|
||||
|
||||
// Checking out new branch.
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := dSess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
if newBranch, newBranchOk := apr.GetValue(cli.CheckoutCoBranch); newBranchOk {
|
||||
if len(newBranch) == 0 {
|
||||
err = errors.New("error: cannot checkout empty string")
|
||||
} else if len(apr.Args) > 0 {
|
||||
err = checkoutNewBranch(ctx, dbName, dbData, newBranch, apr.Arg(0))
|
||||
} else {
|
||||
err = checkoutNewBranch(ctx, dbName, dbData, newBranch, "")
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
name := apr.Arg(0)
|
||||
if len(name) == 0 {
|
||||
return 1, ErrEmptyBranchName
|
||||
}
|
||||
|
||||
// Check if user wants to checkout branch.
|
||||
if isBranch, err := actions.IsBranch(ctx, dbData.Ddb, name); err != nil {
|
||||
return 1, err
|
||||
} else if isBranch {
|
||||
err = checkoutBranch(ctx, dbName, name)
|
||||
if errors.Is(err, doltdb.ErrWorkingSetNotFound) {
|
||||
// If there is a branch but there is no working set,
|
||||
// somehow the local branch ref was created without a
|
||||
// working set. This happened with old versions of dolt
|
||||
// when running as a read replica, for example. Try to
|
||||
// create a working set pointing at the existing branch
|
||||
// HEAD and check out the branch again.
|
||||
//
|
||||
// TODO: This is all quite racey, but so is the
|
||||
// handling in DoltDB, etc.
|
||||
err = createWorkingSetForLocalBranch(ctx, dbData.Ddb, name)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = checkoutBranch(ctx, dbName, name)
|
||||
}
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
err = checkoutTables(ctx, roots, dbName, args)
|
||||
if err != nil && apr.NArg() == 1 {
|
||||
err = checkoutRemoteBranch(ctx, dbName, dbData, name)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
// createWorkingSetForLocalBranch will make a new working set for a local
|
||||
// branch ref if one does not already exist. Can be used to fix up local branch
|
||||
// state when branches have been created without working sets in the past.
|
||||
//
|
||||
// This makes it so that dolt_checkout can checkout workingset-less branches,
|
||||
// the same as `dolt checkout` at the CLI. The semantics of exactly what
|
||||
// working set gets created in the new case are different, since the CLI takes
|
||||
// the working set with it.
|
||||
//
|
||||
// TODO: This is cribbed heavily from doltdb.*DoltDB.NewBranchAtCommit.
|
||||
func createWorkingSetForLocalBranch(ctx *sql.Context, ddb *doltdb.DoltDB, branchName string) error {
|
||||
branchRef := ref.NewBranchRef(branchName)
|
||||
commit, err := ddb.ResolveCommitRef(ctx, branchRef)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
commitRoot, err := commit.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
wsRef, err := ref.WorkingSetRefForHead(branchRef)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err = ddb.ResolveWorkingSet(ctx, wsRef)
|
||||
if err == nil {
|
||||
// This already exists. Return...
|
||||
return nil
|
||||
}
|
||||
if !errors.Is(err, doltdb.ErrWorkingSetNotFound) {
|
||||
return err
|
||||
}
|
||||
|
||||
ws := doltdb.EmptyWorkingSet(wsRef).WithWorkingRoot(commitRoot).WithStagedRoot(commitRoot)
|
||||
return ddb.UpdateWorkingSet(ctx, wsRef, ws, hash.Hash{} /* current hash... */, doltdb.TodoWorkingSetMeta())
|
||||
}
|
||||
|
||||
// getRevisionForRevisionDatabase returns the root database name and revision for a database, or just the root database name if the specified db name is not a revision database.
|
||||
func getRevisionForRevisionDatabase(ctx *sql.Context, dbName string) (string, string, error) {
|
||||
doltsess, ok := ctx.Session.(*dsess.DoltSession)
|
||||
if !ok {
|
||||
return "", "", fmt.Errorf("unexpected session type: %T", ctx.Session)
|
||||
}
|
||||
|
||||
provider := doltsess.Provider()
|
||||
return provider.GetRevisionForRevisionDatabase(ctx, dbName)
|
||||
}
|
||||
|
||||
// checkoutRemoteBranch checks out a remote branch creating a new local branch with the same name as the remote branch
|
||||
// and set its upstream. The upstream persists out of sql session.
|
||||
func checkoutRemoteBranch(ctx *sql.Context, dbName string, dbData env.DbData, branchName string) error {
|
||||
remoteRefs, err := actions.GetRemoteBranchRef(ctx, dbData.Ddb, branchName)
|
||||
if err != nil {
|
||||
return errors.New("fatal: unable to read from data repository")
|
||||
}
|
||||
|
||||
if len(remoteRefs) == 0 {
|
||||
return fmt.Errorf("error: could not find %s", branchName)
|
||||
} else if len(remoteRefs) == 1 {
|
||||
remoteRef := remoteRefs[0]
|
||||
err := checkoutNewBranch(ctx, dbName, dbData, branchName, remoteRef.String())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
refSpec, err := ref.ParseRefSpecForRemote(remoteRef.GetRemote(), remoteRef.GetBranch())
|
||||
if err != nil {
|
||||
return errhand.BuildDError(fmt.Errorf("%w: '%s'", err, remoteRef.GetRemote()).Error()).Build()
|
||||
}
|
||||
|
||||
src := refSpec.SrcRef(dbData.Rsr.CWBHeadRef())
|
||||
dest := refSpec.DestRef(src)
|
||||
|
||||
return dbData.Rsw.UpdateBranch(src.GetPath(), env.BranchConfig{
|
||||
Merge: ref.MarshalableRef{
|
||||
Ref: dest,
|
||||
},
|
||||
Remote: remoteRef.GetRemote(),
|
||||
})
|
||||
} else {
|
||||
return fmt.Errorf("'%s' matched multiple (%v) remote tracking branches", branchName, len(remoteRefs))
|
||||
}
|
||||
}
|
||||
|
||||
func checkoutNewBranch(ctx *sql.Context, dbName string, dbData env.DbData, branchName, startPt string) error {
|
||||
if len(branchName) == 0 {
|
||||
return ErrEmptyBranchName
|
||||
}
|
||||
|
||||
if startPt == "" {
|
||||
startPt = "head"
|
||||
}
|
||||
|
||||
err := actions.CreateBranchWithStartPt(ctx, dbData, branchName, startPt, false)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return checkoutBranch(ctx, dbName, branchName)
|
||||
}
|
||||
|
||||
func checkoutBranch(ctx *sql.Context, dbName string, branchName string) error {
|
||||
wsRef, err := ref.WorkingSetRefForHead(ref.NewBranchRef(branchName))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if ctx.GetCurrentDatabase() != dbName {
|
||||
ctx.SetCurrentDatabase(dbName)
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
return dSess.SwitchWorkingSet(ctx, dbName, wsRef)
|
||||
}
|
||||
|
||||
func checkoutTables(ctx *sql.Context, roots doltdb.Roots, name string, tables []string) error {
|
||||
roots, err := actions.MoveTablesFromHeadToWorking(ctx, roots, tables)
|
||||
|
||||
if err != nil {
|
||||
if doltdb.IsRootValUnreachable(err) {
|
||||
rt := doltdb.GetUnreachableRootType(err)
|
||||
return fmt.Errorf("error: unable to read the %s", rt.String())
|
||||
} else if actions.IsTblNotExist(err) {
|
||||
return fmt.Errorf("error: given tables do not exist")
|
||||
} else {
|
||||
return fmt.Errorf("fatal: Unexpected error checking out tables")
|
||||
}
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
return dSess.SetRoots(ctx, name, roots)
|
||||
}
|
||||
|
||||
@@ -15,16 +15,56 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
// doltClean is the stored procedure version of the function `dolt_clean`.
|
||||
func doltClean(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltClean(ctx, args)
|
||||
res, err := doDoltClean(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltClean(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return statusErr, err
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
|
||||
apr, err := cli.CreateCleanArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
// Get all the needed roots.
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
roots, err = actions.CleanUntracked(ctx, roots, apr.Args, apr.ContainsAll(cli.DryRunFlag))
|
||||
if err != nil {
|
||||
return 1, fmt.Errorf("failed to clean; %w", err)
|
||||
}
|
||||
|
||||
err = dSess.SetRoots(ctx, dbName, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
@@ -15,16 +15,158 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/vitess/go/vt/proto/query"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
// doltCommit is the stored procedure version of the functions `commit` and `dolt_commit`.
|
||||
var hashType = sql.MustCreateString(query.Type_TEXT, 32, sql.Collation_ascii_bin)
|
||||
|
||||
// doltCommit is the stored procedure version for the CLI function `commit`.
|
||||
func doltCommit(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltCommit(ctx, args)
|
||||
res, err := doDoltCommit(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(res), nil
|
||||
}
|
||||
|
||||
// doltCommitHashOut is the stored procedure version for the CLI function `commit`. The first parameter is the variable
|
||||
// to set the hash of.
|
||||
func doltCommitHashOut(ctx *sql.Context, outHash *string, args ...string) (sql.RowIter, error) {
|
||||
res, err := doDoltCommit(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
*outHash = res
|
||||
return rowToIter(res), nil
|
||||
}
|
||||
|
||||
func doDoltCommit(ctx *sql.Context, args []string) (string, error) {
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return "", err
|
||||
}
|
||||
// Get the information for the sql context.
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
apr, err := cli.CreateCommitArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return "", fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
if apr.Contains(cli.UpperCaseAllFlag) {
|
||||
roots, err = actions.StageAllTables(ctx, roots)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf(err.Error())
|
||||
}
|
||||
} else if apr.Contains(cli.AllFlag) {
|
||||
roots, err = actions.StageModifiedAndDeletedTables(ctx, roots)
|
||||
if err != nil {
|
||||
return "", fmt.Errorf(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
var name, email string
|
||||
if authorStr, ok := apr.GetValue(cli.AuthorParam); ok {
|
||||
name, email, err = cli.ParseAuthor(authorStr)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
} else {
|
||||
name = dSess.Username()
|
||||
email = dSess.Email()
|
||||
}
|
||||
|
||||
amend := apr.Contains(cli.AmendFlag)
|
||||
|
||||
msg, msgOk := apr.GetValue(cli.MessageArg)
|
||||
if !msgOk {
|
||||
if amend {
|
||||
commit, err := dSess.GetHeadCommit(ctx, dbName)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
commitMeta, err := commit.GetCommitMeta(ctx)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
msg = commitMeta.Description
|
||||
} else {
|
||||
return "", fmt.Errorf("Must provide commit message.")
|
||||
}
|
||||
}
|
||||
|
||||
t := ctx.QueryTime()
|
||||
if commitTimeStr, ok := apr.GetValue(cli.DateParam); ok {
|
||||
var err error
|
||||
t, err = cli.ParseDate(commitTimeStr)
|
||||
|
||||
if err != nil {
|
||||
return "", fmt.Errorf(err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
pendingCommit, err := dSess.NewPendingCommit(ctx, dbName, roots, actions.CommitStagedProps{
|
||||
Message: msg,
|
||||
Date: t,
|
||||
AllowEmpty: apr.Contains(cli.AllowEmptyFlag),
|
||||
Amend: amend,
|
||||
Force: apr.Contains(cli.ForceFlag),
|
||||
Name: name,
|
||||
Email: email,
|
||||
})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
// Nothing to commit, and we didn't pass --allowEmpty
|
||||
if pendingCommit == nil {
|
||||
return "", errors.New("nothing to commit")
|
||||
}
|
||||
|
||||
newCommit, err := dSess.DoltCommit(ctx, dbName, dSess.GetTransaction(), pendingCommit)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
h, err := newCommit.HashOf()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return h.String(), nil
|
||||
}
|
||||
|
||||
func getDoltArgs(ctx *sql.Context, row sql.Row, children []sql.Expression) ([]string, error) {
|
||||
args := make([]string, len(children))
|
||||
for i := range children {
|
||||
childVal, err := children[i].Eval(ctx, row)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
text, err := sql.Text.Convert(childVal)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
args[i] = text.(string)
|
||||
}
|
||||
|
||||
return args, nil
|
||||
}
|
||||
|
||||
@@ -15,16 +15,63 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
// doltFetch is the stored procedure version of the function `dolt_fetch`.
|
||||
func doltFetch(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltFetch(ctx, args)
|
||||
res, err := doDoltFetch(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltFetch(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return cmdFailure, fmt.Errorf("empty database name")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return cmdFailure, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
apr, err := cli.CreateFetchArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
remote, refSpecs, err := env.NewFetchOpts(apr.Args, dbData.Rsr)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
updateMode := ref.UpdateMode{Force: apr.Contains(cli.ForceFlag)}
|
||||
|
||||
srcDB, err := sess.Provider().GetRemoteDB(ctx, dbData.Ddb, remote, false)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = actions.FetchRefSpecs(ctx, dbData, srcDB, refSpecs, remote, updateMode, runProgFuncs, stopProgFuncs)
|
||||
if err != nil {
|
||||
return cmdFailure, fmt.Errorf("fetch failed: %w", err)
|
||||
}
|
||||
return cmdSuccess, nil
|
||||
}
|
||||
|
||||
@@ -15,16 +15,444 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
goerrors "gopkg.in/src-d/go-errors.v1"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/table/editor"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/argparser"
|
||||
)
|
||||
|
||||
const DoltMergeWarningCode int = 1105 // Since this our own custom warning we'll use 1105, the code for an unknown error
|
||||
|
||||
const (
|
||||
noConflictsOrViolations int = 0
|
||||
hasConflictsOrViolations int = 1
|
||||
)
|
||||
|
||||
const (
|
||||
threeWayMerge = 0
|
||||
fastForwardMerge = 1
|
||||
)
|
||||
|
||||
var ErrUncommittedChanges = goerrors.NewKind("cannot merge with uncommitted changes")
|
||||
|
||||
// doltMerge is the stored procedure version of the functions `merge` and `dolt_merge`.
|
||||
func doltMerge(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
hasConflicts, ff, err := dfunctions.DoDoltMerge(ctx, args)
|
||||
hasConflicts, ff, err := doDoltMerge(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(ff), int64(hasConflicts)), nil
|
||||
}
|
||||
|
||||
// doDoltMerge returns has_conflicts and fast_forward status
|
||||
func doDoltMerge(ctx *sql.Context, args []string) (int, int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
|
||||
apr, err := cli.CreateMergeArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
if apr.ContainsAll(cli.SquashParam, cli.NoFFParam) {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("error: Flags '--%s' and '--%s' cannot be used together.\n", cli.SquashParam, cli.NoFFParam)
|
||||
}
|
||||
|
||||
ws, err := sess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
roots, ok := sess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
if apr.Contains(cli.AbortParam) {
|
||||
if !ws.MergeActive() {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("fatal: There is no merge to abort")
|
||||
}
|
||||
|
||||
ws, err = abortMerge(ctx, ws, roots)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
err := sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
err = sess.CommitWorkingSet(ctx, dbName, sess.GetTransaction())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
return noConflictsOrViolations, threeWayMerge, nil
|
||||
}
|
||||
|
||||
branchName := apr.Arg(0)
|
||||
|
||||
mergeSpec, err := createMergeSpec(ctx, sess, dbName, apr, branchName)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
msg := fmt.Sprintf("Merge branch '%s' into %s", branchName, dbData.Rsr.CWBHeadRef().GetPath())
|
||||
if userMsg, mOk := apr.GetValue(cli.MessageArg); mOk {
|
||||
msg = userMsg
|
||||
}
|
||||
|
||||
ws, conflicts, fastForward, err := performMerge(ctx, sess, roots, ws, dbName, mergeSpec, apr.Contains(cli.NoCommitFlag), msg)
|
||||
if err != nil || conflicts != 0 || fastForward != 0 {
|
||||
return conflicts, fastForward, err
|
||||
}
|
||||
|
||||
return conflicts, fastForward, nil
|
||||
}
|
||||
|
||||
// performMerge encapsulates server merge logic, switching between
|
||||
// fast-forward, no fast-forward, merge commit, and merging into working set.
|
||||
// Returns a new WorkingSet, whether there were merge conflicts, and whether a
|
||||
// fast-forward was performed. This commits the working set if merge is successful and
|
||||
// 'no-commit' flag is not defined.
|
||||
// TODO FF merging commit with constraint violations requires `constraint verify`
|
||||
func performMerge(ctx *sql.Context, sess *dsess.DoltSession, roots doltdb.Roots, ws *doltdb.WorkingSet, dbName string, spec *merge.MergeSpec, noCommit bool, msg string) (*doltdb.WorkingSet, int, int, error) {
|
||||
// todo: allow merges even when an existing merge is uncommitted
|
||||
if ws.MergeActive() {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, doltdb.ErrMergeActive
|
||||
}
|
||||
|
||||
err := checkForUncommittedChanges(ctx, roots.Working, roots.Head)
|
||||
if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, fmt.Errorf("failed to get dbData")
|
||||
}
|
||||
|
||||
canFF, err := spec.HeadC.CanFastForwardTo(ctx, spec.MergeC)
|
||||
if err != nil {
|
||||
switch err {
|
||||
case doltdb.ErrIsAhead, doltdb.ErrUpToDate:
|
||||
ctx.Warn(DoltMergeWarningCode, err.Error())
|
||||
default:
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
}
|
||||
|
||||
if canFF {
|
||||
if spec.Noff {
|
||||
ws, err = executeNoFFMerge(ctx, sess, spec, dbName, ws, dbData)
|
||||
if err == doltdb.ErrUnresolvedConflictsOrViolations {
|
||||
// if there are unresolved conflicts, write the resulting working set back to the session and return an
|
||||
// error message
|
||||
wsErr := sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if wsErr != nil {
|
||||
return ws, hasConflictsOrViolations, threeWayMerge, wsErr
|
||||
}
|
||||
|
||||
ctx.Warn(DoltMergeWarningCode, err.Error())
|
||||
|
||||
return ws, hasConflictsOrViolations, threeWayMerge, nil
|
||||
}
|
||||
return ws, noConflictsOrViolations, fastForwardMerge, err
|
||||
}
|
||||
|
||||
ws, err = executeFFMerge(ctx, dbName, spec.Squash, ws, dbData, spec.MergeC)
|
||||
return ws, noConflictsOrViolations, fastForwardMerge, err
|
||||
}
|
||||
|
||||
dbState, ok, err := sess.LookupDbState(ctx, dbName)
|
||||
if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
} else if !ok {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
ws, err = executeMerge(ctx, spec.Squash, spec.HeadC, spec.MergeC, spec.MergeCSpecStr, ws, dbState.EditOpts())
|
||||
if err == doltdb.ErrUnresolvedConflictsOrViolations {
|
||||
// if there are unresolved conflicts, write the resulting working set back to the session and return an
|
||||
// error message
|
||||
wsErr := sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if wsErr != nil {
|
||||
return ws, hasConflictsOrViolations, threeWayMerge, wsErr
|
||||
}
|
||||
|
||||
ctx.Warn(DoltMergeWarningCode, err.Error())
|
||||
|
||||
return ws, hasConflictsOrViolations, threeWayMerge, nil
|
||||
} else if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
err = sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
if !noCommit {
|
||||
author := fmt.Sprintf("%s <%s>", spec.Name, spec.Email)
|
||||
_, err = doDoltCommit(ctx, []string{"-m", msg, "--author", author})
|
||||
if err != nil {
|
||||
return ws, noConflictsOrViolations, threeWayMerge, fmt.Errorf("dolt_commit failed")
|
||||
}
|
||||
}
|
||||
|
||||
return ws, noConflictsOrViolations, threeWayMerge, nil
|
||||
}
|
||||
|
||||
func abortMerge(ctx *sql.Context, workingSet *doltdb.WorkingSet, roots doltdb.Roots) (*doltdb.WorkingSet, error) {
|
||||
tbls, err := doltdb.UnionTableNames(ctx, roots.Working, roots.Staged, roots.Head)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
roots, err = actions.MoveTablesFromHeadToWorking(ctx, roots, tbls)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// TODO: this doesn't seem right, it sets the root that we already edited above
|
||||
workingSet = workingSet.AbortMerge()
|
||||
return workingSet, nil
|
||||
}
|
||||
|
||||
func executeMerge(ctx *sql.Context, squash bool, head, cm *doltdb.Commit, cmSpec string, ws *doltdb.WorkingSet, opts editor.Options) (*doltdb.WorkingSet, error) {
|
||||
mergeRoot, mergeStats, err := merge.MergeCommits(ctx, head, cm, opts)
|
||||
|
||||
if err != nil {
|
||||
switch err {
|
||||
case doltdb.ErrUpToDate:
|
||||
return nil, errors.New("Already up to date.")
|
||||
case merge.ErrFastForward:
|
||||
panic("fast forward merge")
|
||||
default:
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return mergeRootToWorking(squash, ws, mergeRoot, cm, cmSpec, mergeStats)
|
||||
}
|
||||
|
||||
func executeFFMerge(ctx *sql.Context, dbName string, squash bool, ws *doltdb.WorkingSet, dbData env.DbData, cm2 *doltdb.Commit) (*doltdb.WorkingSet, error) {
|
||||
rv, err := cm2.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return ws, err
|
||||
}
|
||||
|
||||
// TODO: This is all incredibly suspect, needs to be replaced with library code that is functional instead of
|
||||
// altering global state
|
||||
if !squash {
|
||||
err = dbData.Ddb.FastForward(ctx, dbData.Rsr.CWBHeadRef(), cm2)
|
||||
if err != nil {
|
||||
return ws, err
|
||||
}
|
||||
}
|
||||
|
||||
ws = ws.WithWorkingRoot(rv).WithStagedRoot(rv)
|
||||
|
||||
// We need to assign the working set to the session but ensure that its state is not labeled as dirty (ffs are clean
|
||||
// merges). Hence, we go ahead and commit the working set to the transaction.
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
|
||||
err = sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return ws, err
|
||||
}
|
||||
|
||||
// We only fully commit our transaction when we are not squashing.
|
||||
if !squash {
|
||||
err = sess.CommitWorkingSet(ctx, dbName, sess.GetTransaction())
|
||||
if err != nil {
|
||||
return ws, err
|
||||
}
|
||||
}
|
||||
|
||||
return ws, nil
|
||||
}
|
||||
|
||||
func executeNoFFMerge(
|
||||
ctx *sql.Context,
|
||||
dSess *dsess.DoltSession,
|
||||
spec *merge.MergeSpec,
|
||||
dbName string,
|
||||
ws *doltdb.WorkingSet,
|
||||
dbData env.DbData,
|
||||
) (*doltdb.WorkingSet, error) {
|
||||
mergeRoot, err := spec.MergeC.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
ws, err = mergeRootToWorking(false, ws, mergeRoot, spec.MergeC, spec.MergeCSpecStr, map[string]*merge.MergeStats{})
|
||||
if err != nil {
|
||||
// This error is recoverable, so we return a working set value along with the error
|
||||
return ws, err
|
||||
}
|
||||
|
||||
// Save our work so far in the session, as it will be referenced by the commit call below (badly in need of a
|
||||
// refactoring)
|
||||
err = dSess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// The roots need refreshing after the above
|
||||
roots, _ := dSess.GetRoots(ctx, dbName)
|
||||
|
||||
pendingCommit, err := dSess.NewPendingCommit(ctx, dbName, roots, actions.CommitStagedProps{
|
||||
Message: spec.Msg,
|
||||
Date: spec.Date,
|
||||
AllowEmpty: spec.AllowEmpty,
|
||||
Force: spec.Force,
|
||||
Name: spec.Name,
|
||||
Email: spec.Email,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if pendingCommit == nil {
|
||||
return nil, errors.New("nothing to commit")
|
||||
}
|
||||
|
||||
_, err = dSess.DoltCommit(ctx, dbName, dSess.GetTransaction(), pendingCommit)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return ws, nil
|
||||
}
|
||||
|
||||
func createMergeSpec(ctx *sql.Context, sess *dsess.DoltSession, dbName string, apr *argparser.ArgParseResults, commitSpecStr string) (*merge.MergeSpec, error) {
|
||||
ddb, ok := sess.GetDoltDB(ctx, dbName)
|
||||
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
|
||||
msg, ok := apr.GetValue(cli.MessageArg)
|
||||
if !ok {
|
||||
// TODO probably change, but we can't open editor so it'll have to be automated
|
||||
msg = "automatic SQL merge"
|
||||
}
|
||||
|
||||
var err error
|
||||
var name, email string
|
||||
if authorStr, ok := apr.GetValue(cli.AuthorParam); ok {
|
||||
name, email, err = cli.ParseAuthor(authorStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
name = sess.Username()
|
||||
email = sess.Email()
|
||||
}
|
||||
|
||||
t := ctx.QueryTime()
|
||||
if commitTimeStr, ok := apr.GetValue(cli.DateParam); ok {
|
||||
t, err = cli.ParseDate(commitTimeStr)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
roots, ok := sess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return nil, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
if apr.Contains(cli.NoCommitFlag) && apr.Contains(cli.CommitFlag) {
|
||||
return nil, errors.New("cannot define both 'commit' and 'no-commit' flags at the same time")
|
||||
}
|
||||
mergeSpec, err := merge.NewMergeSpec(ctx, dbData.Rsr, ddb, roots, name, email, msg, commitSpecStr, apr.Contains(cli.SquashParam), apr.Contains(cli.NoFFParam), apr.Contains(cli.ForceFlag), apr.Contains(cli.NoCommitFlag), apr.Contains(cli.NoEditFlag), t)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return mergeSpec, nil
|
||||
}
|
||||
|
||||
// TODO: this copied from commands/merge.go because the latter isn't reusable. Fix that.
|
||||
func mergeRootToWorking(
|
||||
squash bool,
|
||||
ws *doltdb.WorkingSet,
|
||||
mergedRoot *doltdb.RootValue,
|
||||
cm2 *doltdb.Commit,
|
||||
cm2Spec string,
|
||||
mergeStats map[string]*merge.MergeStats,
|
||||
) (*doltdb.WorkingSet, error) {
|
||||
|
||||
workingRoot := mergedRoot
|
||||
if !squash {
|
||||
ws = ws.StartMerge(cm2, cm2Spec)
|
||||
}
|
||||
|
||||
ws = ws.WithWorkingRoot(workingRoot).WithStagedRoot(workingRoot)
|
||||
if checkForConflicts(mergeStats) || checkForViolations(mergeStats) {
|
||||
// this error is recoverable in-session, so we return the new ws along with the error
|
||||
return ws, doltdb.ErrUnresolvedConflictsOrViolations
|
||||
}
|
||||
|
||||
return ws, nil
|
||||
}
|
||||
|
||||
func checkForUncommittedChanges(ctx *sql.Context, root *doltdb.RootValue, headRoot *doltdb.RootValue) error {
|
||||
rh, err := root.HashOf()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
hrh, err := headRoot.HashOf()
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if rh != hrh {
|
||||
return ErrUncommittedChanges.New()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func checkForConflicts(tblToStats map[string]*merge.MergeStats) bool {
|
||||
for _, stats := range tblToStats {
|
||||
if stats.Operation == merge.TableModified && stats.Conflicts > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func checkForViolations(tblToStats map[string]*merge.MergeStats) bool {
|
||||
for _, stats := range tblToStats {
|
||||
if stats.ConstraintViolations > 0 {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
@@ -15,16 +15,222 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/ref"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/store/datas/pull"
|
||||
)
|
||||
|
||||
// doltPull is the stored procedure version of the function `dolt_pull`.
|
||||
func doltPull(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
conflicts, ff, err := dfunctions.DoDoltPull(ctx, args)
|
||||
conflicts, ff, err := doDoltPull(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(ff), int64(conflicts)), nil
|
||||
}
|
||||
|
||||
// doDoltPull returns conflicts, fast_forward statuses
|
||||
func doDoltPull(ctx *sql.Context, args []string) (int, int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
if !ok {
|
||||
return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
apr, err := cli.CreatePullArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
if apr.NArg() > 2 {
|
||||
return noConflictsOrViolations, threeWayMerge, actions.ErrInvalidPullArgs
|
||||
}
|
||||
|
||||
var remoteName, remoteRefName string
|
||||
if apr.NArg() == 1 {
|
||||
remoteName = apr.Arg(0)
|
||||
} else if apr.NArg() == 2 {
|
||||
remoteName = apr.Arg(0)
|
||||
remoteRefName = apr.Arg(1)
|
||||
}
|
||||
|
||||
pullSpec, err := env.NewPullSpec(ctx, dbData.Rsr, remoteName, remoteRefName, apr.Contains(cli.SquashParam), apr.Contains(cli.NoFFParam), apr.Contains(cli.NoCommitFlag), apr.Contains(cli.NoEditFlag), apr.Contains(cli.ForceFlag), apr.NArg() == 1)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
srcDB, err := sess.Provider().GetRemoteDB(ctx, dbData.Ddb, pullSpec.Remote, false)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("failed to get remote db; %w", err)
|
||||
}
|
||||
|
||||
ws, err := sess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
// Fetch all references
|
||||
branchRefs, err := srcDB.GetHeadRefs(ctx)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("%w: %s", env.ErrFailedToReadDb, err.Error())
|
||||
}
|
||||
|
||||
_, hasBranch, err := srcDB.HasBranch(ctx, pullSpec.Branch.GetPath())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
if !hasBranch {
|
||||
return noConflictsOrViolations, threeWayMerge,
|
||||
fmt.Errorf("branch %q not found on remote", pullSpec.Branch.GetPath())
|
||||
}
|
||||
|
||||
var conflicts int
|
||||
var fastForward int
|
||||
for _, refSpec := range pullSpec.RefSpecs {
|
||||
rsSeen := false // track invalid refSpecs
|
||||
for _, branchRef := range branchRefs {
|
||||
remoteTrackRef := refSpec.DestRef(branchRef)
|
||||
|
||||
if remoteTrackRef == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
rsSeen = true
|
||||
tmpDir, err := dbData.Rsw.TempTableFilesDir()
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
// todo: can we pass nil for either of the channels?
|
||||
srcDBCommit, err := actions.FetchRemoteBranch(ctx, tmpDir, pullSpec.Remote, srcDB, dbData.Ddb, branchRef, runProgFuncs, stopProgFuncs)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
// TODO: this could be replaced with a canFF check to test for error
|
||||
err = dbData.Ddb.FastForward(ctx, remoteTrackRef, srcDBCommit)
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("fetch failed; %w", err)
|
||||
}
|
||||
|
||||
// Only merge iff branch is current branch and there is an upstream set (pullSpec.Branch is set to nil if there is no upstream)
|
||||
if branchRef != pullSpec.Branch {
|
||||
continue
|
||||
}
|
||||
|
||||
roots, ok := sess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return noConflictsOrViolations, threeWayMerge, sql.ErrDatabaseNotFound.New(dbName)
|
||||
}
|
||||
|
||||
mergeSpec, err := createMergeSpec(ctx, sess, dbName, apr, remoteTrackRef.String())
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
|
||||
msg := fmt.Sprintf("Merge branch '%s' of %s into %s", pullSpec.Branch.GetPath(), pullSpec.Remote.Url, dbData.Rsr.CWBHeadRef().GetPath())
|
||||
ws, conflicts, fastForward, err = performMerge(ctx, sess, roots, ws, dbName, mergeSpec, apr.Contains(cli.NoCommitFlag), msg)
|
||||
if err != nil && !errors.Is(doltdb.ErrUpToDate, err) {
|
||||
return conflicts, fastForward, err
|
||||
}
|
||||
|
||||
err = sess.SetWorkingSet(ctx, dbName, ws)
|
||||
if err != nil {
|
||||
return conflicts, fastForward, err
|
||||
}
|
||||
}
|
||||
if !rsSeen {
|
||||
return noConflictsOrViolations, threeWayMerge, fmt.Errorf("%w: '%s'", ref.ErrInvalidRefSpec, refSpec.GetRemRefToLocal())
|
||||
}
|
||||
}
|
||||
|
||||
tmpDir, err := dbData.Rsw.TempTableFilesDir()
|
||||
if err != nil {
|
||||
return noConflictsOrViolations, threeWayMerge, err
|
||||
}
|
||||
err = actions.FetchFollowTags(ctx, tmpDir, srcDB, dbData.Ddb, runProgFuncs, stopProgFuncs)
|
||||
if err != nil {
|
||||
return conflicts, fastForward, err
|
||||
}
|
||||
|
||||
return conflicts, fastForward, nil
|
||||
}
|
||||
|
||||
//TODO: remove this as it does not do anything useful
|
||||
func pullerProgFunc(ctx context.Context, statsCh <-chan pull.Stats) {
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
return
|
||||
}
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-statsCh:
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: remove this as it does not do anything useful
|
||||
func progFunc(ctx context.Context, progChan <-chan pull.PullProgress) {
|
||||
for {
|
||||
if ctx.Err() != nil {
|
||||
return
|
||||
}
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-progChan:
|
||||
default:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//TODO: remove this as it does not do anything useful
|
||||
func runProgFuncs(ctx context.Context) (*sync.WaitGroup, chan pull.PullProgress, chan pull.Stats) {
|
||||
statsCh := make(chan pull.Stats)
|
||||
progChan := make(chan pull.PullProgress)
|
||||
wg := &sync.WaitGroup{}
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
progFunc(ctx, progChan)
|
||||
}()
|
||||
|
||||
wg.Add(1)
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
pullerProgFunc(ctx, statsCh)
|
||||
}()
|
||||
|
||||
return wg, progChan, statsCh
|
||||
}
|
||||
|
||||
//TODO: remove this as it does not do anything useful
|
||||
func stopProgFuncs(cancel context.CancelFunc, wg *sync.WaitGroup, progChan chan pull.PullProgress, statsCh chan pull.Stats) {
|
||||
cancel()
|
||||
close(progChan)
|
||||
close(statsCh)
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
@@ -15,16 +15,81 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/store/datas"
|
||||
)
|
||||
|
||||
// doltPush is the stored procedure version of the function `dolt_push`.
|
||||
func doltPush(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltPush(ctx, args)
|
||||
res, err := doDoltPush(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltPush(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return cmdFailure, fmt.Errorf("empty database name")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
sess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := sess.GetDbData(ctx, dbName)
|
||||
|
||||
if !ok {
|
||||
return cmdFailure, fmt.Errorf("could not load database %s", dbName)
|
||||
}
|
||||
|
||||
apr, err := cli.CreatePushArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
autoSetUpRemote := loadConfig(ctx).GetStringOrDefault(env.PushAutoSetupRemote, "false")
|
||||
pushAutoSetUpRemote, err := strconv.ParseBool(autoSetUpRemote)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
|
||||
opts, err := env.NewPushOpts(ctx, apr, dbData.Rsr, dbData.Ddb, apr.Contains(cli.ForceFlag), apr.Contains(cli.SetUpstreamFlag), pushAutoSetUpRemote)
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
remoteDB, err := sess.Provider().GetRemoteDB(ctx, dbData.Ddb, opts.Remote, true)
|
||||
if err != nil {
|
||||
return 1, actions.HandleInitRemoteStorageClientErr(opts.Remote.Name, opts.Remote.Url, err)
|
||||
}
|
||||
|
||||
tmpDir, err := dbData.Rsw.TempTableFilesDir()
|
||||
if err != nil {
|
||||
return cmdFailure, err
|
||||
}
|
||||
err = actions.DoPush(ctx, dbData.Rsr, dbData.Rsw, dbData.Ddb, remoteDB, tmpDir, opts, runProgFuncs, stopProgFuncs)
|
||||
if err != nil {
|
||||
switch err {
|
||||
case doltdb.ErrUpToDate:
|
||||
return cmdSuccess, nil
|
||||
case datas.ErrMergeNeeded:
|
||||
return cmdFailure, fmt.Errorf("%w; the tip of your current branch is behind its remote counterpart", err)
|
||||
default:
|
||||
return cmdFailure, err
|
||||
}
|
||||
}
|
||||
// TODO : set upstream should be persisted outside of session
|
||||
return cmdSuccess, nil
|
||||
}
|
||||
|
||||
@@ -15,16 +15,115 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env/actions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
// doltReset is the stored procedure version of the function `dolt_reset`.
|
||||
func doltReset(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltReset(ctx, args)
|
||||
res, err := doDoltReset(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltReset(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
|
||||
if len(dbName) == 0 {
|
||||
return 1, fmt.Errorf("Empty database name.")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
dbData, ok := dSess.GetDbData(ctx, dbName)
|
||||
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
apr, err := cli.CreateResetArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
// Check if problems with args first.
|
||||
if apr.ContainsAll(cli.HardResetParam, cli.SoftResetParam) {
|
||||
return 1, fmt.Errorf("error: --%s and --%s are mutually exclusive options.", cli.HardResetParam, cli.SoftResetParam)
|
||||
}
|
||||
|
||||
provider := dSess.Provider()
|
||||
db, err := provider.Database(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
// Disallow manipulating any roots for read-only databases – changing the branch
|
||||
// HEAD would allow changing data, and working set and index shouldn't ever have
|
||||
// any contents for a read-only database.
|
||||
if rodb, ok := db.(sql.ReadOnlyDatabase); ok {
|
||||
if rodb.IsReadOnly() {
|
||||
return 1, fmt.Errorf("unable to reset HEAD in read-only databases")
|
||||
}
|
||||
}
|
||||
|
||||
// Get all the needed roots.
|
||||
roots, ok := dSess.GetRoots(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
if apr.Contains(cli.HardResetParam) {
|
||||
// Get the commitSpec for the branch if it exists
|
||||
arg := ""
|
||||
if apr.NArg() > 1 {
|
||||
return 1, fmt.Errorf("--hard supports at most one additional param")
|
||||
} else if apr.NArg() == 1 {
|
||||
arg = apr.Arg(0)
|
||||
}
|
||||
|
||||
var newHead *doltdb.Commit
|
||||
newHead, roots, err = actions.ResetHardTables(ctx, dbData, arg, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
// TODO: this overrides the transaction setting, needs to happen at commit, not here
|
||||
if newHead != nil {
|
||||
if err := dbData.Ddb.SetHeadToCommit(ctx, dbData.Rsr.CWBHeadRef(), newHead); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
|
||||
ws, err := dSess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
err = dSess.SetWorkingSet(ctx, dbName, ws.WithWorkingRoot(roots.Working).WithStagedRoot(roots.Staged).ClearMerge())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
} else {
|
||||
roots, err = actions.ResetSoftTables(ctx, dbData, apr, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
err = dSess.SetRoots(ctx, dbName, roots)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
@@ -15,16 +15,123 @@
|
||||
package dprocedures
|
||||
|
||||
import (
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"fmt"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/expression"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/schema/typeinfo"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
// doltRevert is the stored procedure version of the function `revert` and `dolt_revert`.
|
||||
func doltRevert(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltRevert(ctx, nil, args)
|
||||
res, err := doDoltRevert(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltRevert(ctx *sql.Context, args []string) (int, error) {
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
ddb, ok := dSess.GetDoltDB(ctx, dbName)
|
||||
if !ok {
|
||||
return 1, fmt.Errorf("dolt database could not be found")
|
||||
}
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingSet, err := dSess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingRoot := workingSet.WorkingRoot()
|
||||
headCommit, err := dSess.GetHeadCommit(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
headRoot, err := headCommit.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
headHash, err := headRoot.HashOf()
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingHash, err := workingRoot.HashOf()
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
if !headHash.Equal(workingHash) {
|
||||
return 1, fmt.Errorf("you must commit any changes before using revert")
|
||||
}
|
||||
|
||||
headRef, err := dSess.CWBHeadRef(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateRevertArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
commits := make([]*doltdb.Commit, apr.NArg())
|
||||
for i, revisionStr := range apr.Args {
|
||||
commitSpec, err := doltdb.NewCommitSpec(revisionStr)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
commit, err := ddb.Resolve(ctx, commitSpec, headRef)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
commits[i] = commit
|
||||
}
|
||||
|
||||
dbState, ok, err := dSess.LookupDbState(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
} else if !ok {
|
||||
return 1, fmt.Errorf("Could not load database %s", dbName)
|
||||
}
|
||||
|
||||
workingRoot, revertMessage, err := merge.Revert(ctx, ddb, workingRoot, headCommit, commits, dbState.EditOpts())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingHash, err = workingRoot.HashOf()
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
if !headHash.Equal(workingHash) {
|
||||
err = dSess.SetRoot(ctx, dbName, workingRoot)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
stringType := typeinfo.StringDefaultType.ToSqlType()
|
||||
|
||||
expressions := []sql.Expression{expression.NewLiteral("-a", stringType), expression.NewLiteral("-m", stringType), expression.NewLiteral(revertMessage, stringType)}
|
||||
|
||||
author, hasAuthor := apr.GetValue(cli.AuthorParam)
|
||||
if hasAuthor {
|
||||
expressions = append(expressions, expression.NewLiteral("--author", stringType), expression.NewLiteral(author, stringType))
|
||||
}
|
||||
|
||||
commitArgs, err := getDoltArgs(ctx, nil, expressions)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
_, err = doDoltCommit(ctx, commitArgs)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
@@ -17,14 +17,95 @@ package dprocedures
|
||||
import (
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/branch_control"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
"github.com/dolthub/dolt/go/libraries/utils/set"
|
||||
)
|
||||
|
||||
// doltVerifyConstraints is the stored procedure version of the function `constraints_verify`.
|
||||
func doltVerifyConstraints(ctx *sql.Context, args ...string) (sql.RowIter, error) {
|
||||
res, err := dfunctions.DoDoltConstraintsVerify(ctx, args)
|
||||
res, err := doDoltConstraintsVerify(ctx, args)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return rowToIter(int64(res)), nil
|
||||
}
|
||||
|
||||
func doDoltConstraintsVerify(ctx *sql.Context, args []string) (int, error) {
|
||||
if err := branch_control.CheckAccess(ctx, branch_control.Permissions_Write); err != nil {
|
||||
return 1, err
|
||||
}
|
||||
dbName := ctx.GetCurrentDatabase()
|
||||
dSess := dsess.DSessFromSess(ctx.Session)
|
||||
workingSet, err := dSess.WorkingSet(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
workingRoot := workingSet.WorkingRoot()
|
||||
headCommit, err := dSess.GetHeadCommit(ctx, dbName)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
h, err := headCommit.HashOf()
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
apr, err := cli.CreateVerifyConstraintsArgParser().Parse(args)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
verifyAll := apr.Contains(cli.AllFlag)
|
||||
outputOnly := apr.Contains(cli.OutputOnlyFlag)
|
||||
|
||||
var comparingRoot *doltdb.RootValue
|
||||
if verifyAll {
|
||||
comparingRoot, err = doltdb.EmptyRootValue(ctx, workingRoot.VRW(), workingRoot.NodeStore())
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
} else {
|
||||
comparingRoot, err = headCommit.GetRootValue(ctx)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
}
|
||||
|
||||
tableSet := set.NewStrSet(nil)
|
||||
for _, val := range apr.Args {
|
||||
_, tableName, ok, err := workingRoot.GetTableInsensitive(ctx, val)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
if !ok {
|
||||
return 1, sql.ErrTableNotFound.New(tableName)
|
||||
}
|
||||
tableSet.Add(tableName)
|
||||
}
|
||||
|
||||
newRoot, tablesWithViolations, err := merge.AddForeignKeyViolations(ctx, workingRoot, comparingRoot, tableSet, h)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
|
||||
if tablesWithViolations.Size() == 0 {
|
||||
// no violations were found
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
// violations were found
|
||||
|
||||
if !outputOnly {
|
||||
err = dSess.SetRoot(ctx, dbName, newRoot)
|
||||
if err != nil {
|
||||
return 1, err
|
||||
}
|
||||
return 1, nil
|
||||
}
|
||||
|
||||
return 1, nil
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ var DoltProcedures = []sql.ExternalStoredProcedureDetails{
|
||||
{Name: "dolt_clean", Schema: int64Schema("status"), Function: doltClean},
|
||||
{Name: "dolt_clone", Schema: int64Schema("status"), Function: doltClone},
|
||||
{Name: "dolt_commit", Schema: stringSchema("hash"), Function: doltCommit},
|
||||
{Name: "dolt_commit_hash_out", Schema: stringSchema("hash"), Function: doltCommitHashOut},
|
||||
{Name: "dolt_conflicts_resolve", Schema: int64Schema("status"), Function: doltConflictsResolve},
|
||||
{Name: "dolt_fetch", Schema: int64Schema("success"), Function: doltFetch},
|
||||
{Name: "dolt_gc", Schema: int64Schema("success"), Function: doltGC},
|
||||
|
||||
@@ -92,15 +92,19 @@ var ViewsWithAsOfScriptTest = queries.ScriptTest{
|
||||
var ShowCreateTableAsOfScriptTest = queries.ScriptTest{
|
||||
Name: "Show create table as of",
|
||||
SetUpScript: []string{
|
||||
"set @Commit0 = '';",
|
||||
"set @Commit1 = '';",
|
||||
"set @Commit2 = '';",
|
||||
"set @Commit3 = '';",
|
||||
"set @Commit0 = hashof('main');",
|
||||
"create table a (pk int primary key, c1 int);",
|
||||
"call dolt_add('.');",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table a');",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table a');",
|
||||
"alter table a add column c2 varchar(20);",
|
||||
"set @Commit2 = dolt_commit('-am', 'adding column c2');",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'adding column c2');",
|
||||
"alter table a drop column c1;",
|
||||
"alter table a add constraint unique_c2 unique(c2);",
|
||||
"set @Commit3 = dolt_commit('-am', 'dropping column c1');",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'dropping column c1');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -160,14 +164,18 @@ var ShowCreateTableAsOfScriptTest = queries.ScriptTest{
|
||||
var DescribeTableAsOfScriptTest = queries.ScriptTest{
|
||||
Name: "Describe table as of",
|
||||
SetUpScript: []string{
|
||||
"set @Commit0 = dolt_commit('--allow-empty', '-m', 'before creating table a');",
|
||||
"set @Commit0 = '';",
|
||||
"set @Commit1 = '';",
|
||||
"set @Commit2 = '';",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit0, '--allow-empty', '-m', 'before creating table a');",
|
||||
"create table a (pk int primary key, c1 int);",
|
||||
"call dolt_add('.');",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table a');",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table a');",
|
||||
"alter table a add column c2 varchar(20);",
|
||||
"set @Commit2 = dolt_commit('-am', 'adding column c2');",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'adding column c2');",
|
||||
"alter table a drop column c1;",
|
||||
"set @Commit3 = dolt_commit('-am', 'dropping column c1');",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'dropping column c1');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -509,9 +517,9 @@ var DoltScripts = []queries.ScriptTest{
|
||||
"create table a (pk int primary key, c1 int)",
|
||||
"call DOLT_ADD('.')",
|
||||
"insert into a values (1,1), (2,2), (3,3)",
|
||||
"select DOLT_COMMIT('-a', '-m', 'first commit')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'first commit')",
|
||||
"insert into a values (4,4), (5,5), (6,6)",
|
||||
"select DOLT_COMMIT('-a', '-m', 'second commit')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'second commit')",
|
||||
"set @second_commit = (select commit_hash from dolt_log order by date desc limit 1)",
|
||||
"set @first_commit = (select commit_hash from dolt_log order by date desc limit 1,1)",
|
||||
},
|
||||
@@ -615,13 +623,15 @@ var DoltScripts = []queries.ScriptTest{
|
||||
{
|
||||
Name: "Prepared ASOF",
|
||||
SetUpScript: []string{
|
||||
"set @Commit1 = '';",
|
||||
"set @Commit2 = '';",
|
||||
"create table test (pk int primary key, c1 int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into test values (0,0), (1,1);",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table');",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table');",
|
||||
"call dolt_branch('-c', 'main', 'newb')",
|
||||
"alter table test add column c2 int;",
|
||||
"set @Commit2 = dolt_commit('-am', 'alter table');",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'alter table');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -761,9 +771,9 @@ var DoltUserPrivTests = []queries.UserPrivilegeTest{
|
||||
"CREATE TABLE mydb.test (pk BIGINT PRIMARY KEY);",
|
||||
"CREATE TABLE mydb.test2 (pk BIGINT PRIMARY KEY);",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"SELECT DOLT_COMMIT('-am', 'creating tables test and test2');",
|
||||
"CALL DOLT_COMMIT('-am', 'creating tables test and test2');",
|
||||
"INSERT INTO mydb.test VALUES (1);",
|
||||
"SELECT DOLT_COMMIT('-am', 'inserting into test');",
|
||||
"CALL DOLT_COMMIT('-am', 'inserting into test');",
|
||||
"CREATE USER tester@localhost;",
|
||||
},
|
||||
Assertions: []queries.UserPrivilegeTestAssertion{
|
||||
@@ -1016,7 +1026,8 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table t (n int, c varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1031,13 +1042,16 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table foo1 (n int, de varchar(20));",
|
||||
"insert into foo1 values (1, 'Ein'), (2, 'Zwei'), (3, 'Drei');",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'inserting into foo1', '--date', '2022-08-06T12:00:00');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'inserting into foo1', '--date', '2022-08-06T12:00:00');",
|
||||
|
||||
"update foo1 set de='Eins' where n=1;",
|
||||
"set @Commit2 = dolt_commit('-am', 'updating data in foo1', '--date', '2022-08-06T12:00:01');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'updating data in foo1', '--date', '2022-08-06T12:00:01');",
|
||||
|
||||
"insert into foo1 values (4, 'Vier');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting data in foo1', '--date', '2022-08-06T12:00:02');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting data in foo1', '--date', '2022-08-06T12:00:02');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1064,21 +1078,26 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t1 (n int primary key, de varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t1 values (1, 'Eins'), (2, 'Zwei'), (3, 'Drei');",
|
||||
"set @Commit1 = dolt_commit('-am', 'inserting into t1', '--date', '2022-08-06T12:00:01');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'inserting into t1', '--date', '2022-08-06T12:00:01');",
|
||||
|
||||
"alter table t1 add column fr varchar(20);",
|
||||
"insert into t1 values (4, 'Vier', 'Quatre');",
|
||||
"set @Commit2 = dolt_commit('-am', 'adding column and inserting data in t1', '--date', '2022-08-06T12:00:02');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'adding column and inserting data in t1', '--date', '2022-08-06T12:00:02');",
|
||||
|
||||
"update t1 set fr='Un' where n=1;",
|
||||
"update t1 set fr='Deux' where n=2;",
|
||||
"set @Commit3 = dolt_commit('-am', 'updating data in t1', '--date', '2022-08-06T12:00:03');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'updating data in t1', '--date', '2022-08-06T12:00:03');",
|
||||
|
||||
"update t1 set de=concat(de, ', meine herren') where n>1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'be polite when you address a gentleman', '--date', '2022-08-06T12:00:04');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'be polite when you address a gentleman', '--date', '2022-08-06T12:00:04');",
|
||||
|
||||
"delete from t1 where n=2;",
|
||||
"set @Commit5 = dolt_commit('-am', 'we don''t need the number 2', '--date', '2022-08-06T12:00:05');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'we don''t need the number 2', '--date', '2022-08-06T12:00:05');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1132,9 +1151,11 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t1 (pk int primary key, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t1 values (1,2), (3,4)",
|
||||
"set @Commit1 = dolt_commit('-am', 'initial table');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'initial table');",
|
||||
"insert into t1 values (5,6), (7,8)",
|
||||
"set @Commit2 = dolt_commit('-am', 'two more rows');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'two more rows');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1215,12 +1236,15 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t1 (pk int primary key, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t1 values (1,2), (3,4)",
|
||||
"set @Commit1 = dolt_commit('-am', 'initial table');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'initial table');",
|
||||
"insert into t1 values (5,6), (7,8)",
|
||||
"set @Commit2 = dolt_commit('-am', 'two more rows');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'two more rows');",
|
||||
"insert into t1 values (9,10), (11,12)",
|
||||
"create index t1_c on t1(c)",
|
||||
"set @Commit2 = dolt_commit('-am', 'two more rows and an index');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'two more rows and an index');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1286,13 +1310,16 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, '3'), (4, 5, '6');",
|
||||
"set @Commit1 = DOLT_COMMIT('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c2;",
|
||||
"set @Commit2 = DOLT_COMMIT('-am', 'dropping column c2');",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c2');",
|
||||
|
||||
"alter table t rename column c1 to c2;",
|
||||
"set @Commit3 = DOLT_COMMIT('-am', 'renaming c1 to c2');",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'renaming c1 to c2');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1326,9 +1353,11 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, '3'), (4, 5, '6');",
|
||||
"set @Commit1 = DOLT_COMMIT('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
"alter table t modify column c2 int;",
|
||||
"set @Commit2 = DOLT_COMMIT('-am', 'changed type of c2');",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'changed type of c2');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1352,11 +1381,13 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, '3'), (4, 5, '6');",
|
||||
"set @Commit1 = DOLT_COMMIT('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t rename to t2;",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit2 = DOLT_COMMIT('-am', 'renaming table to t2');",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'renaming table to t2');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1379,14 +1410,17 @@ var HistorySystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, '3'), (4, 5, '6');",
|
||||
"set @Commit1 = DOLT_COMMIT('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"drop table t;",
|
||||
"set @Commit2 = DOLT_COMMIT('-am', 'dropping table t');",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping table t');",
|
||||
|
||||
"create table t (pk int primary key, c1 int);",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit3 = DOLT_COMMIT('-am', 'recreating table t');",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'recreating table t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1691,7 +1725,8 @@ var DoltBranchScripts = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table a (x int)",
|
||||
"call dolt_add('.')",
|
||||
"set @commit1 = (select DOLT_COMMIT('-am', 'add table a'));",
|
||||
"SET @commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@commit1, '-am', 'add table a');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1813,10 +1848,12 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1986,14 +2023,17 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
|
||||
"call dolt_checkout('-b', 'new-branch')",
|
||||
"insert into t values (3, 'three', 'four');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting into t again');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting into t again');",
|
||||
"call dolt_checkout('main')",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
@@ -2026,7 +2066,7 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{3}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT count(*) from dolt_log('main') join dolt_diff(@Commit1, @Commit2, 't') where commit_hash = to_commit;",
|
||||
Query: "SELECT count(*) from dolt_log('main') join dolt_diff(@Commit1, @Commit2, 't') where commit_hash = to_commit;",
|
||||
Expected: []sql.Row{{2}},
|
||||
},
|
||||
},
|
||||
@@ -2036,20 +2076,25 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.');",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t 2');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t 2');",
|
||||
|
||||
"call dolt_checkout('-b', 'new-branch');",
|
||||
"insert into t values (3, 'three', 'four');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting into t 3');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting into t 3');",
|
||||
"insert into t values (4, 'four', 'five');",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting into t 4');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting into t 4');",
|
||||
|
||||
"call dolt_checkout('main');",
|
||||
"insert into t values (5, 'five', 'six');",
|
||||
"set @Commit5 = dolt_commit('-am', 'inserting into t 5');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'inserting into t 5');",
|
||||
},
|
||||
/* Commit graph:
|
||||
3 - 4 (new-branch)
|
||||
@@ -2136,14 +2181,17 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
|
||||
"call dolt_checkout('-b', 'new-branch')",
|
||||
"insert into t values (3, 'three', 'four');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting into t again', '--author', 'John Doe <johndoe@example.com>');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting into t again', '--author', 'John Doe <johndoe@example.com>');",
|
||||
"call dolt_checkout('main')",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
@@ -2175,20 +2223,25 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.');",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t 2');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t 2');",
|
||||
|
||||
"call dolt_checkout('-b', 'new-branch');",
|
||||
"insert into t values (3, 'three', 'four');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting into t 3', '--author', 'John Doe <johndoe@example.com>');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting into t 3', '--author', 'John Doe <johndoe@example.com>');",
|
||||
"insert into t values (4, 'four', 'five');",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting into t 4', '--author', 'John Doe <johndoe@example.com>');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting into t 4', '--author', 'John Doe <johndoe@example.com>');",
|
||||
|
||||
"call dolt_checkout('main');",
|
||||
"insert into t values (5, 'five', 'six');",
|
||||
"set @Commit5 = dolt_commit('-am', 'inserting into t 5');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'inserting into t 5');",
|
||||
},
|
||||
/* Commit graph:
|
||||
3 - 4 (new-branch)
|
||||
@@ -2266,21 +2319,25 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
//TODO: figure out how we were returning a commit from the function
|
||||
/*{
|
||||
Name: "min parents, merges, show parents, decorate",
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 int);",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"call dolt_checkout('-b', 'branch1')",
|
||||
"insert into t values(0,0);",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting 0,0');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting 0,0');",
|
||||
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_checkout('-b', 'branch2')",
|
||||
"insert into t values(1,1);",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting 1,1');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting 1,1');",
|
||||
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('branch1')", // fast-forward merge
|
||||
@@ -2349,7 +2406,7 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{true, true, "HEAD -> branch1"}},
|
||||
},
|
||||
},
|
||||
},
|
||||
},*/
|
||||
}
|
||||
|
||||
var LargeJsonObjectScriptTests = []queries.ScriptTest{
|
||||
|
||||
@@ -29,7 +29,8 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -51,10 +52,12 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"update t set c2=0 where pk=1",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'modifying row'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'modifying row');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -75,10 +78,12 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"delete from t where pk=1",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'modifying row'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'modifying row');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -100,15 +105,18 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2), (3, 4);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"drop table t;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping table t'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping table t');",
|
||||
|
||||
"create table t (pk int primary key, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (100, 200), (300, 400);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'recreating table t'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'recreating table t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -131,10 +139,12 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c1;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping column c'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -164,14 +174,17 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2), (3, 4);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping column c'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c');",
|
||||
|
||||
"alter table t add column c int;",
|
||||
"insert into t values (100, 101);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'inserting into t'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'inserting into t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -207,14 +220,17 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c1;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping column c1'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c1');",
|
||||
|
||||
"alter table t rename column c2 to c1;",
|
||||
"insert into t values (100, 101);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'inserting into t'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'inserting into t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -295,14 +311,17 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2), (3, 4);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping column c'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c');",
|
||||
|
||||
"alter table t add column c varchar(20);",
|
||||
"insert into t values (100, '101');",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 're-adding column c'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 're-adding column c');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -337,14 +356,17 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 'two'), (3, 'four');",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping column c'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c');",
|
||||
|
||||
"alter table t add column c int;",
|
||||
"insert into t values (100, 101);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 're-adding column c'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 're-adding column c');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -386,18 +408,22 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t rename column c1 to c2;",
|
||||
"insert into t values (3, 4);",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'renaming c1 to c2'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'renaming c1 to c2');",
|
||||
|
||||
"alter table t drop column c2;",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'dropping column c2'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'dropping column c2');",
|
||||
|
||||
"alter table t add column c2 int;",
|
||||
"insert into t values (100, '101');",
|
||||
"set @Commit4 = (select DOLT_COMMIT('-am', 'recreating column c2'));",
|
||||
"set @Commit4 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit4, '-am', 'recreating column c2');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -437,17 +463,21 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2), (3, 4);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop primary key;",
|
||||
"insert into t values (5, 6);",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping primary key'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping primary key');",
|
||||
|
||||
"alter table t add primary key (c1);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'adding primary key'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'adding primary key');",
|
||||
|
||||
"insert into t values (7, 8);",
|
||||
"set @Commit4 = (select DOLT_COMMIT('-am', 'adding more data'));",
|
||||
"set @Commit4 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit4, '-am', 'adding more data');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -489,11 +519,14 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'first commit'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'first commit');",
|
||||
"insert into t values (7, 8, 9);",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'second commit'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'second commit');",
|
||||
"update t set c1 = 0 where pk > 5;",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'third commit'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'third commit');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -522,11 +555,14 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk1 int, pk2 int, c1 int, primary key (pk1, pk2));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'first commit'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'first commit');",
|
||||
"insert into t values (7, 8, 9);",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'second commit'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'second commit');",
|
||||
"update t set c1 = 0 where pk1 > 5;",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'third commit'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'third commit');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -633,10 +669,12 @@ var DiffTableFunctionScriptTests = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -741,19 +779,23 @@ var DiffTableFunctionScriptTests = []queries.ScriptTest{
|
||||
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into table t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into table t');",
|
||||
|
||||
"create table t2 (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t2 values(100, 'hundred', 'hundert');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting into table t2');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting into table t2');",
|
||||
|
||||
"insert into t values(2, 'two', 'three'), (3, 'three', 'four');",
|
||||
"update t set c1='uno', c2='dos' where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting into table t');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting into table t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -819,7 +861,8 @@ inner join t on to_pk = t.pk;`,
|
||||
"create table t (pk int primary key, c1 text, c2 text);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 'one', 'two'), (2, 'three', 'four');",
|
||||
"set @Commit1 = dolt_commit('-am', 'inserting two rows into table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'inserting two rows into table t');",
|
||||
|
||||
"insert into t values (3, 'five', 'six');",
|
||||
"delete from t where pk = 2",
|
||||
@@ -893,24 +936,30 @@ inner join t on to_pk = t.pk;`,
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting row 1 into t in main');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting row 1 into t in main');",
|
||||
|
||||
"select dolt_checkout('-b', 'branch1');",
|
||||
"CALL DOLT_checkout('-b', 'branch1');",
|
||||
"alter table t drop column c2;",
|
||||
"set @Commit3 = dolt_commit('-am', 'dropping column c2 in branch1');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'dropping column c2 in branch1');",
|
||||
|
||||
"delete from t where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'deleting row 1 in branch1');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'deleting row 1 in branch1');",
|
||||
|
||||
"insert into t values (2, 'two');",
|
||||
"set @Commit5 = dolt_commit('-am', 'inserting row 2 in branch1');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'inserting row 2 in branch1');",
|
||||
|
||||
"select dolt_checkout('main');",
|
||||
"CALL DOLT_checkout('main');",
|
||||
"insert into t values (2, 'two', 'three');",
|
||||
"set @Commit6 = dolt_commit('-am', 'inserting row 2 in main');",
|
||||
"set @Commit6 = '';",
|
||||
"call dolt_commit_hash_out(@Commit6, '-am', 'inserting row 2 in main');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -990,18 +1039,22 @@ inner join t on to_pk = t.pk;`,
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
|
||||
"alter table t drop column c2;",
|
||||
"set @Commit3 = dolt_commit('-am', 'dropping column c2');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'dropping column c2');",
|
||||
|
||||
"alter table t add column c2 varchar(20);",
|
||||
"insert into t values (3, 'three', 'four');",
|
||||
"update t set c2='foo' where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'adding column c2, inserting, and updating data');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'adding column c2, inserting, and updating data');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1050,21 +1103,26 @@ inner join t on to_pk = t.pk;`,
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', -1), (2, 'two', -2);",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
|
||||
"alter table t rename column c2 to c3;",
|
||||
"set @Commit3 = dolt_commit('-am', 'renaming column c2 to c3');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'renaming column c2 to c3');",
|
||||
|
||||
"insert into t values (3, 'three', -3);",
|
||||
"update t set c3=1 where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting and updating data');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting and updating data');",
|
||||
|
||||
"alter table t rename column c3 to c2;",
|
||||
"insert into t values (4, 'four', -4);",
|
||||
"set @Commit5 = dolt_commit('-am', 'renaming column c3 to c2, and inserting data');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'renaming column c3 to c2, and inserting data');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1119,21 +1177,26 @@ inner join t on to_pk = t.pk;`,
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'asdf'), (2, 'two', '2');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
|
||||
"alter table t drop column c2;",
|
||||
"set @Commit3 = dolt_commit('-am', 'dropping column c2');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'dropping column c2');",
|
||||
|
||||
"insert into t values (3, 'three');",
|
||||
"update t set c1='fdsa' where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting and updating data');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting and updating data');",
|
||||
|
||||
"alter table t add column c2 int;",
|
||||
"insert into t values (4, 'four', -4);",
|
||||
"set @Commit5 = dolt_commit('-am', 'adding column c2, and inserting data');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'adding column c2, and inserting data');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1288,10 +1351,12 @@ var DiffSummaryTableFunctionScriptTests = []queries.ScriptTest{
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1368,25 +1433,30 @@ var DiffSummaryTableFunctionScriptTests = []queries.ScriptTest{
|
||||
Name: "basic case with single table",
|
||||
SetUpScript: []string{
|
||||
"set @Commit0 = HashOf('HEAD');",
|
||||
"set @Commit1 = dolt_commit('--allow-empty', '-m', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '--allow-empty', '-m', 'creating table t');",
|
||||
|
||||
// create table t only
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit2 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'creating table t');",
|
||||
|
||||
// insert 1 row into t
|
||||
"insert into t values(1, 'one', 'two');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting 1 into table t');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting 1 into table t');",
|
||||
|
||||
// insert 2 rows into t and update two cells
|
||||
"insert into t values(2, 'two', 'three'), (3, 'three', 'four');",
|
||||
"update t set c1='uno', c2='dos' where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting 2 into table t');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting 2 into table t');",
|
||||
|
||||
// drop table t only
|
||||
"drop table t;",
|
||||
"set @Commit5 = dolt_commit('-am', 'drop table t');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'drop table t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1433,25 +1503,30 @@ inner join t as of @Commit3 on rows_unmodified = t.pk;`,
|
||||
Name: "basic case with single keyless table",
|
||||
SetUpScript: []string{
|
||||
"set @Commit0 = HashOf('HEAD');",
|
||||
"set @Commit1 = dolt_commit('--allow-empty', '-m', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '--allow-empty', '-m', 'creating table t');",
|
||||
|
||||
// create table t only
|
||||
"create table t (id int, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit2 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'creating table t');",
|
||||
|
||||
// insert 1 row into t
|
||||
"insert into t values(1, 'one', 'two');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting 1 into table t');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting 1 into table t');",
|
||||
|
||||
// insert 2 rows into t and update two cells
|
||||
"insert into t values(2, 'two', 'three'), (3, 'three', 'four');",
|
||||
"update t set c1='uno', c2='dos' where id=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting 2 into table t');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting 2 into table t');",
|
||||
|
||||
// drop table t only
|
||||
"drop table t;",
|
||||
"set @Commit5 = dolt_commit('-am', 'drop table t');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'drop table t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1500,24 +1575,28 @@ inner join t as of @Commit3 on rows_unmodified = t.pk;`,
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"insert into t values(1, 'one', 'two');",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'inserting into table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'inserting into table t');",
|
||||
|
||||
// add table t2 with 1 row
|
||||
"create table t2 (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"insert into t2 values(100, 'hundred', 'hundert');",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into table t2');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into table t2');",
|
||||
|
||||
// changes on both tables
|
||||
"insert into t values(2, 'two', 'three'), (3, 'three', 'four'), (4, 'four', 'five');",
|
||||
"update t set c1='uno', c2='dos' where pk=1;",
|
||||
"insert into t2 values(101, 'hundred one', 'one');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting into table t');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting into table t');",
|
||||
|
||||
// changes on both tables
|
||||
"delete from t where c2 = 'four';",
|
||||
"update t2 set c2='zero' where pk=100;",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting into table t');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting into table t');",
|
||||
|
||||
// create keyless table
|
||||
"create table keyless (id int);",
|
||||
@@ -1557,7 +1636,8 @@ inner join t as of @Commit3 on rows_unmodified = t.pk;`,
|
||||
"create table t (pk int primary key, c1 text, c2 text);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 'one', 'two'), (2, 'three', 'four');",
|
||||
"set @Commit1 = dolt_commit('-am', 'inserting two rows into table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'inserting two rows into table t');",
|
||||
|
||||
"insert into t values (3, 'five', 'six');",
|
||||
"delete from t where pk = 2",
|
||||
@@ -1611,28 +1691,35 @@ inner join t as of @Commit3 on rows_unmodified = t.pk;`,
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', 'two');",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting row 1 into t in main');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting row 1 into t in main');",
|
||||
|
||||
"select dolt_checkout('-b', 'branch1');",
|
||||
"CALL DOLT_checkout('-b', 'branch1');",
|
||||
"alter table t drop column c2;",
|
||||
"set @Commit3 = dolt_commit('-am', 'dropping column c2 in branch1');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'dropping column c2 in branch1');",
|
||||
|
||||
"delete from t where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'deleting row 1 in branch1');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'deleting row 1 in branch1');",
|
||||
|
||||
"insert into t values (2, 'two');",
|
||||
"set @Commit5 = dolt_commit('-am', 'inserting row 2 in branch1');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'inserting row 2 in branch1');",
|
||||
|
||||
"select dolt_checkout('main');",
|
||||
"CALL DOLT_checkout('main');",
|
||||
"insert into t values (2, 'two', 'three');",
|
||||
"set @Commit6 = dolt_commit('-am', 'inserting row 2 in main');",
|
||||
"set @Commit6 = '';",
|
||||
"call dolt_commit_hash_out(@Commit6, '-am', 'inserting row 2 in main');",
|
||||
|
||||
"create table newtable (pk int primary key);",
|
||||
"insert into newtable values (1), (2);",
|
||||
"set @Commit7 = dolt_commit('-Am', 'new table newtable');",
|
||||
"set @Commit7 = '';",
|
||||
"call dolt_commit_hash_out(@Commit7, '-Am', 'new table newtable');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1714,21 +1801,25 @@ inner join t as of @Commit3 on rows_unmodified = t.pk;`,
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 varchar(20));",
|
||||
"call dolt_add('.');",
|
||||
"insert into t values (1, 'one', 'two'), (2, 'two', 'three');",
|
||||
"set @Commit1 = dolt_commit('-am', 'inserting row 1, 2 into t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'inserting row 1, 2 into t');",
|
||||
|
||||
// drop 1 column and add 1 row
|
||||
"alter table t drop column c2;",
|
||||
"set @Commit2 = dolt_commit('-am', 'dropping column c2');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'dropping column c2');",
|
||||
|
||||
// drop 1 column and add 1 row
|
||||
"insert into t values (3, 'three');",
|
||||
"set @Commit3 = dolt_commit('-am', 'inserting row 3');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'inserting row 3');",
|
||||
|
||||
// add 1 column and 1 row and update
|
||||
"alter table t add column c2 varchar(20);",
|
||||
"insert into t values (4, 'four', 'five');",
|
||||
"update t set c2='foo' where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'adding column c2, inserting, and updating data');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'adding column c2, inserting, and updating data');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1758,21 +1849,26 @@ inner join t as of @Commit3 on rows_unmodified = t.pk;`,
|
||||
SetUpScript: []string{
|
||||
"create table t (pk int primary key, c1 varchar(20), c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit1 = dolt_commit('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"call dolt_commit_hash_out(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"insert into t values(1, 'one', -1), (2, 'two', -2);",
|
||||
"set @Commit2 = dolt_commit('-am', 'inserting into t');",
|
||||
"set @Commit2 = '';",
|
||||
"call dolt_commit_hash_out(@Commit2, '-am', 'inserting into t');",
|
||||
|
||||
"alter table t rename column c2 to c3;",
|
||||
"set @Commit3 = dolt_commit('-am', 'renaming column c2 to c3');",
|
||||
"set @Commit3 = '';",
|
||||
"call dolt_commit_hash_out(@Commit3, '-am', 'renaming column c2 to c3');",
|
||||
|
||||
"insert into t values (3, 'three', -3);",
|
||||
"update t set c3=1 where pk=1;",
|
||||
"set @Commit4 = dolt_commit('-am', 'inserting and updating data');",
|
||||
"set @Commit4 = '';",
|
||||
"call dolt_commit_hash_out(@Commit4, '-am', 'inserting and updating data');",
|
||||
|
||||
"alter table t rename column c3 to c2;",
|
||||
"insert into t values (4, 'four', -4);",
|
||||
"set @Commit5 = dolt_commit('-am', 'renaming column c3 to c2, and inserting data');",
|
||||
"set @Commit5 = '';",
|
||||
"call dolt_commit_hash_out(@Commit5, '-am', 'renaming column c3 to c2, and inserting data');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1961,7 +2057,8 @@ var UnscopedDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"call dolt_add('.')",
|
||||
"insert into regularTable values (1, 2, 3), (2, 3, 4);",
|
||||
"insert into droppedTable values (1, 2, 3), (2, 3, 4);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'Creating tables x and y'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'Creating tables x and y');",
|
||||
|
||||
// changeSet: STAGED; data change: false; schema change: true
|
||||
"create table addedTable (a int primary key, b int, c int);",
|
||||
@@ -2025,19 +2122,23 @@ var UnscopedDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table y (a int primary key, b int, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into x values (1, 2, 3), (2, 3, 4);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'Creating tables x and y'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'Creating tables x and y');",
|
||||
|
||||
"create table z (a int primary key, b int, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into z values (100, 101, 102);",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'Creating tables z'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'Creating tables z');",
|
||||
|
||||
"insert into y values (-1, -2, -3), (-2, -3, -4);",
|
||||
"insert into z values (101, 102, 103);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'Inserting into tables y and z'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'Inserting into tables y and z');",
|
||||
|
||||
"alter table y add column d int;",
|
||||
"set @Commit4 = (select DOLT_COMMIT('-am', 'Modify schema of table y'));",
|
||||
"set @Commit4 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit4, '-am', 'Modify schema of table y');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2065,21 +2166,25 @@ var UnscopedDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table y (a int primary key, b int, c int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into x values (1, 2, 3), (2, 3, 4)",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'Creating tables x and y'))",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'Creating tables x and y')",
|
||||
|
||||
"create table z (a int primary key, b int, c int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into z values (100, 101, 102)",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'Creating tables z'))",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'Creating tables z')",
|
||||
|
||||
"rename table x to x1",
|
||||
"call dolt_add('.')",
|
||||
"insert into x1 values (1000, 1001, 1002);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'Renaming table x to x1 and inserting data'))",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'Renaming table x to x1 and inserting data')",
|
||||
|
||||
"rename table x1 to x2",
|
||||
"call dolt_add('.')",
|
||||
"set @Commit4 = (select DOLT_COMMIT('-am', 'Renaming table x1 to x2'))",
|
||||
"set @Commit4 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit4, '-am', 'Renaming table x1 to x2')",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2111,13 +2216,16 @@ var UnscopedDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table y (a int primary key, b int, c int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into x values (1, 2, 3), (2, 3, 4)",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'Creating tables x and y'))",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'Creating tables x and y')",
|
||||
|
||||
"drop table x",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'Dropping non-empty table x'))",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'Dropping non-empty table x')",
|
||||
|
||||
"drop table y",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'Dropping empty table y'))",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'Dropping empty table y')",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2145,12 +2253,13 @@ var UnscopedDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table y (a int primary key, b int, c int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into x values (1, 2, 3), (2, 3, 4)",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'Creating tables x and y'))",
|
||||
|
||||
"set @Commit2 = (select DOLT_COMMIT('--allow-empty', '-m', 'Empty!'))",
|
||||
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'Creating tables x and y')",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '--allow-empty', '-m', 'Empty!')",
|
||||
"insert into y values (-1, -2, -3), (-2, -3, -4)",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'Inserting into table y'))",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'Inserting into table y')",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2174,22 +2283,25 @@ var UnscopedDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
{
|
||||
Name: "includes commits from all branches",
|
||||
SetUpScript: []string{
|
||||
"select dolt_checkout('-b', 'branch1')",
|
||||
"CALL DOLT_checkout('-b', 'branch1')",
|
||||
"create table x (a int primary key, b int, c int)",
|
||||
"create table y (a int primary key, b int, c int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into x values (1, 2, 3), (2, 3, 4)",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'Creating tables x and y'))",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'Creating tables x and y')",
|
||||
|
||||
"select dolt_checkout('-b', 'branch2')",
|
||||
"CALL DOLT_checkout('-b', 'branch2')",
|
||||
"create table z (a int primary key, b int, c int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into z values (100, 101, 102)",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'Creating tables z'))",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'Creating tables z')",
|
||||
|
||||
"insert into y values (-1, -2, -3), (-2, -3, -4)",
|
||||
"insert into z values (101, 102, 103)",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'Inserting into tables y and z'))",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'Inserting into tables y and z')",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2216,21 +2328,24 @@ var UnscopedDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
{
|
||||
Name: "merge history handling",
|
||||
SetUpScript: []string{
|
||||
"select dolt_checkout('-b', 'branch1')",
|
||||
"CALL DOLT_checkout('-b', 'branch1')",
|
||||
"create table x (a int primary key, b int, c int)",
|
||||
"create table y (a int primary key, b int, c int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into x values (1, 2, 3), (2, 3, 4)",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'Creating tables x and y'))",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'Creating tables x and y')",
|
||||
|
||||
"select dolt_checkout('-b', 'branch2')",
|
||||
"CALL DOLT_checkout('-b', 'branch2')",
|
||||
"create table z (a int primary key, b int, c int)",
|
||||
"call dolt_add('.')",
|
||||
"insert into z values (100, 101, 102)",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'Creating tables z'))",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'Creating tables z')",
|
||||
|
||||
"select DOLT_MERGE('branch1', '--no-commit')",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'Merging branch1 into branch2'))",
|
||||
"CALL DOLT_MERGE('branch1', '--no-commit')",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'Merging branch1 into branch2')",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2260,7 +2375,8 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2284,19 +2400,24 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"update t set c2=0 where pk=1",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'modifying row'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'modifying row');",
|
||||
|
||||
"update t set c2=-1 where pk=1",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'modifying row'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'modifying row');",
|
||||
|
||||
"update t set c2=-2 where pk=1",
|
||||
"set @Commit4 = (select DOLT_COMMIT('-am', 'modifying row'));",
|
||||
"set @Commit4 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit4, '-am', 'modifying row');",
|
||||
|
||||
"delete from t where pk=1",
|
||||
"set @Commit5 = (select DOLT_COMMIT('-am', 'modifying row'));",
|
||||
"set @Commit5 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit5, '-am', 'modifying row');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2340,10 +2461,12 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c1;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping column c'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2370,14 +2493,17 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2), (3, 4);",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping column c'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c');",
|
||||
|
||||
"alter table t add column c int;",
|
||||
"insert into t values (100, 101);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 'inserting into t'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'inserting into t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2410,14 +2536,17 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int, c2 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2, 3), (4, 5, 6);",
|
||||
"set @Commit1 = DOLT_COMMIT('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c1;",
|
||||
"set @Commit2 = DOLT_COMMIT('-am', 'dropping column c1');",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c1');",
|
||||
|
||||
"alter table t rename column c2 to c1;",
|
||||
"insert into t values (100, 101);",
|
||||
"set @Commit3 = DOLT_COMMIT('-am', 'inserting into t');",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'inserting into t');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2453,14 +2582,17 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2), (3, 4);",
|
||||
"set @Commit1 = DOLT_COMMIT('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c;",
|
||||
"set @Commit2 = DOLT_COMMIT('-am', 'dropping column c');",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c');",
|
||||
|
||||
"alter table t add column c varchar(20);",
|
||||
"insert into t values (100, '101');",
|
||||
"set @Commit3 = DOLT_COMMIT('-am', 're-adding column c');",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 're-adding column c');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2492,14 +2624,17 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c varchar(20));",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 'two'), (3, 'four');",
|
||||
"set @Commit1 = (select DOLT_COMMIT('-am', 'creating table t'));",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop column c;",
|
||||
"set @Commit2 = (select DOLT_COMMIT('-am', 'dropping column c'));",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping column c');",
|
||||
|
||||
"alter table t add column c int;",
|
||||
"insert into t values (100, 101);",
|
||||
"set @Commit3 = (select DOLT_COMMIT('-am', 're-adding column c'));",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 're-adding column c');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -2537,17 +2672,21 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{
|
||||
"create table t (pk int primary key, c1 int);",
|
||||
"call dolt_add('.')",
|
||||
"insert into t values (1, 2), (3, 4);",
|
||||
"set @Commit1 = DOLT_COMMIT('-am', 'creating table t');",
|
||||
"set @Commit1 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'creating table t');",
|
||||
|
||||
"alter table t drop primary key;",
|
||||
"insert into t values (5, 6);",
|
||||
"set @Commit2 = DOLT_COMMIT('-am', 'dropping primary key');",
|
||||
"set @Commit2 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'dropping primary key');",
|
||||
|
||||
"alter table t add primary key (c1);",
|
||||
"set @Commit3 = DOLT_COMMIT('-am', 'adding primary key');",
|
||||
"set @Commit3 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'adding primary key');",
|
||||
|
||||
"insert into t values (7, 8);",
|
||||
"set @Commit4 = DOLT_COMMIT('-am', 'adding more data');",
|
||||
"set @Commit4 = '';",
|
||||
"CALL DOLT_COMMIT_HASH_OUT(@Commit4, '-am', 'adding more data');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
|
||||
@@ -23,7 +23,7 @@ import (
|
||||
"gopkg.in/src-d/go-errors.v1"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/merge"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dfunctions"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dprocedures"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/sqle/dsess"
|
||||
)
|
||||
|
||||
@@ -56,13 +56,13 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"call DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"CALL DOLT_ADD('.');",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -79,7 +79,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'new-branch')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'new-branch')",
|
||||
Expected: []sql.Row{{0}},
|
||||
},
|
||||
{
|
||||
@@ -95,12 +95,12 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"call DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:00');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:00');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a ff', '--date', '2022-08-06T12:00:01');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a ff', '--date', '2022-08-06T12:00:01');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -125,7 +125,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{"this is a no-ff"}}, // includes the merge commit created by no-ff
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Expected: []sql.Row{{0}},
|
||||
},
|
||||
},
|
||||
@@ -137,14 +137,14 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:01');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:01');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:02');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:02');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"INSERT INTO test VALUES (5),(6),(7);",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'add some more values', '--date', '2022-08-06T12:00:03');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'add some more values', '--date', '2022-08-06T12:00:03');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -176,14 +176,14 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:01');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:01');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:02');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:02');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"INSERT INTO test VALUES (5),(6),(7);",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'add some more values', '--date', '2022-08-06T12:00:03');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'add some more values', '--date', '2022-08-06T12:00:03');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -208,7 +208,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{"add some more values"}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
ExpectedErr: dsess.ErrWorkingSetChanges,
|
||||
},
|
||||
},
|
||||
@@ -220,14 +220,14 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"call DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:01');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:01');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (1, 1);",
|
||||
"UPDATE test SET val=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:02');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:02');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"UPDATE test SET val=1001 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'update a value', '--date', '2022-08-06T12:00:03');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'update a value', '--date', '2022-08-06T12:00:03');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -251,7 +251,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{"update a value"}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
ExpectedErr: dsess.ErrWorkingSetChanges,
|
||||
},
|
||||
{
|
||||
@@ -279,12 +279,12 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"call DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -312,12 +312,12 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"call DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -325,7 +325,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{1, 0}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'other')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'other')",
|
||||
ExpectedErr: dsess.ErrWorkingSetChanges,
|
||||
},
|
||||
{
|
||||
@@ -340,12 +340,12 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CREATE TABLE test (pk int primary key)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -362,7 +362,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'new-branch')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'new-branch')",
|
||||
Expected: []sql.Row{{0}},
|
||||
},
|
||||
{
|
||||
@@ -377,12 +377,12 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CREATE TABLE test (pk int primary key)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a ff');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -407,7 +407,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{"this is a no-ff"}}, // includes the merge commit created by no-ff
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Expected: []sql.Row{{0}},
|
||||
},
|
||||
},
|
||||
@@ -418,14 +418,14 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CREATE TABLE test (pk int primary key)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:00');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:00');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:01');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:01');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"INSERT INTO test VALUES (5),(6),(7);",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'add some more values', '--date', '2022-08-06T12:00:02');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'add some more values', '--date', '2022-08-06T12:00:02');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -456,14 +456,14 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CREATE TABLE test (pk int primary key)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0),(1),(2);",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:00');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1', '--date', '2022-08-06T12:00:00');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (3);",
|
||||
"UPDATE test SET pk=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:01');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit', '--date', '2022-08-06T12:00:01');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"INSERT INTO test VALUES (5),(6),(7);",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'add some more values', '--date', '2022-08-06T12:00:02');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'add some more values', '--date', '2022-08-06T12:00:02');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -483,7 +483,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{"add some more values"}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Expected: []sql.Row{{0}},
|
||||
},
|
||||
},
|
||||
@@ -494,14 +494,14 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CREATE TABLE test (pk int primary key, val int)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (1, 1);",
|
||||
"UPDATE test SET val=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"UPDATE test SET val=1001 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'update a value');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'update a value');",
|
||||
"set dolt_allow_commit_conflicts = on",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
@@ -514,8 +514,8 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_MERGE('--abort')",
|
||||
Expected: []sql.Row{{0}},
|
||||
Query: "CALL DOLT_MERGE('--abort')",
|
||||
Expected: []sql.Row{{0, 0}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT is_merging, source, target, unmerged_tables FROM DOLT_MERGE_STATUS;",
|
||||
@@ -538,7 +538,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_MERGE('feature-branch')",
|
||||
Query: "CALL DOLT_MERGE('feature-branch')",
|
||||
ExpectedErrStr: dsess.ErrUnresolvedConflictsCommit.Error(),
|
||||
},
|
||||
{
|
||||
@@ -554,14 +554,14 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (1, 1);",
|
||||
"UPDATE test SET val=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"UPDATE test SET val=1001 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'update a value');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'update a value');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -577,8 +577,8 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_MERGE('--abort')",
|
||||
Expected: []sql.Row{{0}},
|
||||
Query: "CALL DOLT_MERGE('--abort')",
|
||||
Expected: []sql.Row{{0, 0}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT is_merging, source, target, unmerged_tables FROM DOLT_MERGE_STATUS;",
|
||||
@@ -597,7 +597,7 @@ var MergeScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{{0, 1001}},
|
||||
},
|
||||
{
|
||||
Query: "SELECT DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Query: "CALL DOLT_CHECKOUT('-b', 'other-branch')",
|
||||
Expected: []sql.Row{{0}},
|
||||
},
|
||||
},
|
||||
@@ -609,18 +609,18 @@ var MergeScripts = []queries.ScriptTest{
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SET autocommit = 0",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (1, 1);",
|
||||
"UPDATE test SET val=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"UPDATE test SET val=1001 WHERE pk=0;",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
Query: "CALL DOLT_MERGE('feature-branch', '-m', 'this is a merge')",
|
||||
ExpectedErr: dfunctions.ErrUncommittedChanges,
|
||||
ExpectedErr: dprocedures.ErrUncommittedChanges,
|
||||
},
|
||||
{
|
||||
Query: "SELECT is_merging, source, target, unmerged_tables FROM DOLT_MERGE_STATUS;",
|
||||
@@ -2738,7 +2738,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SetUpScript: verifyConstraintsSetupScript,
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('child1')",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('child1')",
|
||||
Expected: []sql.Row{{0}},
|
||||
},
|
||||
{
|
||||
@@ -2746,7 +2746,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
Expected: []sql.Row{},
|
||||
},
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('--all', 'child1');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('--all', 'child1');",
|
||||
Expected: []sql.Row{{0}},
|
||||
},
|
||||
{
|
||||
@@ -2786,7 +2786,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SkipResultsCheck: true,
|
||||
},
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY();",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS();",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
@@ -2822,7 +2822,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SkipResultsCheck: true,
|
||||
},
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('child3');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('child3');",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
@@ -2858,7 +2858,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SkipResultsCheck: true,
|
||||
},
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('child3', 'child4');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('child3', 'child4');",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
@@ -2876,7 +2876,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SkipResultsCheck: true,
|
||||
},
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('child3', 'child4');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('child3', 'child4');",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
@@ -2894,7 +2894,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SkipResultsCheck: true,
|
||||
},
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('--all');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('--all');",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
@@ -2930,7 +2930,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SkipResultsCheck: true,
|
||||
},
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('--all', 'child3');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('--all', 'child3');",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
@@ -2966,7 +2966,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SkipResultsCheck: true,
|
||||
},
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('--all', 'child3', 'child4');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('--all', 'child3', 'child4');",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
@@ -2998,7 +2998,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SetUpScript: verifyConstraintsSetupScript,
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('--output-only', 'child3', 'child4');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('--output-only', 'child3', 'child4');",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
@@ -3026,7 +3026,7 @@ var DoltVerifyConstraintsTestScripts = []queries.ScriptTest{
|
||||
SetUpScript: verifyConstraintsSetupScript,
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
Query: "SELECT CONSTRAINTS_VERIFY('--all', '--output-only', 'child3', 'child4');",
|
||||
Query: "CALL DOLT_VERIFY_CONSTRAINTS('--all', '--output-only', 'child3', 'child4');",
|
||||
Expected: []sql.Row{{1}},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -763,7 +763,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{
|
||||
"CREATE TABLE test (pk int primary key, val int)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -814,7 +814,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{
|
||||
"CREATE TABLE test (pk int primary key, val int)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -865,7 +865,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{
|
||||
"CREATE TABLE test (pk int primary key, val int)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -916,7 +916,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{
|
||||
"CREATE TABLE test (pk int primary key, val int)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1007,7 +1007,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{
|
||||
"CREATE TABLE test (pk int primary key, val int)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1096,7 +1096,7 @@ var DoltConflictHandlingTests = []queries.TransactionTest{
|
||||
"CREATE TABLE test (pk int primary key, val int)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'initial table');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1350,14 +1350,14 @@ var DoltSqlFuncTransactionTests = []queries.TransactionTest{
|
||||
"CREATE TABLE test (pk int primary key, val int)",
|
||||
"CALL DOLT_ADD('.')",
|
||||
"INSERT INTO test VALUES (0, 0)",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"SELECT DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'Step 1');",
|
||||
"CALL DOLT_CHECKOUT('-b', 'feature-branch')",
|
||||
"INSERT INTO test VALUES (1, 1);",
|
||||
"UPDATE test SET val=1000 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit');",
|
||||
"SELECT DOLT_CHECKOUT('main');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'this is a normal commit');",
|
||||
"CALL DOLT_CHECKOUT('main');",
|
||||
"UPDATE test SET val=1001 WHERE pk=0;",
|
||||
"SELECT DOLT_COMMIT('-a', '-m', 'update a value');",
|
||||
"CALL DOLT_COMMIT('-a', '-m', 'update a value');",
|
||||
},
|
||||
Assertions: []queries.ScriptTestAssertion{
|
||||
{
|
||||
@@ -1369,8 +1369,8 @@ var DoltSqlFuncTransactionTests = []queries.TransactionTest{
|
||||
Expected: []sql.Row{},
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ SELECT DOLT_MERGE('feature-branch')",
|
||||
Expected: []sql.Row{{1}},
|
||||
Query: "/* client a */ CALL DOLT_MERGE('feature-branch')",
|
||||
Expected: []sql.Row{{0, 1}},
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ SELECT count(*) from dolt_conflicts_test",
|
||||
@@ -1401,8 +1401,8 @@ var DoltSqlFuncTransactionTests = []queries.TransactionTest{
|
||||
Expected: []sql.Row{},
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ SELECT DOLT_MERGE('--abort')",
|
||||
Expected: []sql.Row{{0}},
|
||||
Query: "/* client a */ CALL DOLT_MERGE('--abort')",
|
||||
Expected: []sql.Row{{0, 0}},
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ commit",
|
||||
@@ -1417,7 +1417,7 @@ var DoltSqlFuncTransactionTests = []queries.TransactionTest{
|
||||
Expected: []sql.Row{{}},
|
||||
},
|
||||
{
|
||||
Query: "/* client a */ SELECT DOLT_MERGE('feature-branch')",
|
||||
Query: "/* client a */ CALL DOLT_MERGE('feature-branch')",
|
||||
ExpectedErrStr: dsess.ErrUnresolvedConflictsCommit.Error(),
|
||||
},
|
||||
{ // client rolled back on merge with conflicts
|
||||
|
||||
@@ -442,14 +442,14 @@ CREATE TABLE t (
|
||||
|
||||
CALL DOLT_ADD('.');
|
||||
INSERT INTO t (c0) VALUES (1), (2);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'cm1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'test');
|
||||
call dolt_commit('-a', '-m', 'cm1');
|
||||
call dolt_checkout('-b', 'test');
|
||||
|
||||
INSERT INTO t (c0) VALUES (3), (4);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'cm2');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'cm2');
|
||||
call dolt_checkout('main');
|
||||
|
||||
SELECT DOLT_MERGE('test');
|
||||
call dolt_merge('test');
|
||||
INSERT INTO t VALUES (NULL,5),(6,6),(NULL,7);
|
||||
SQL
|
||||
|
||||
@@ -474,14 +474,14 @@ CREATE TABLE t (
|
||||
|
||||
CALL DOLT_ADD('.');
|
||||
INSERT INTO t (c0) VALUES (1), (2);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'cm1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'test');
|
||||
call dolt_commit('-a', '-m', 'cm1');
|
||||
call dolt_checkout('-b', 'test');
|
||||
|
||||
INSERT INTO t (c0) VALUES (3), (4);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'cm2');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'cm2');
|
||||
call dolt_checkout('main');
|
||||
|
||||
SELECT DOLT_MERGE('test');
|
||||
call dolt_merge('test');
|
||||
INSERT INTO t VALUES (10,10),(NULL,11);
|
||||
SQL
|
||||
|
||||
@@ -508,14 +508,14 @@ CREATE TABLE t (
|
||||
|
||||
CALL DOLT_ADD('.');
|
||||
INSERT INTO t (c0) VALUES (1), (2);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'cm1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'test');
|
||||
call dolt_commit('-a', '-m', 'cm1');
|
||||
call dolt_checkout('-b', 'test');
|
||||
|
||||
INSERT INTO t VALUES (4,4), (5,5);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'cm2');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'cm2');
|
||||
call dolt_checkout('main');
|
||||
|
||||
SELECT DOLT_MERGE('test');
|
||||
call dolt_merge('test');
|
||||
INSERT INTO t VALUES (3,3),(NULL,6);
|
||||
SQL
|
||||
|
||||
@@ -542,14 +542,14 @@ CREATE TABLE t (
|
||||
|
||||
CALL DOLT_ADD('.');
|
||||
INSERT INTO t VALUES (4, 4), (5, 5);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'cm1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'test');
|
||||
call dolt_commit('-a', '-m', 'cm1');
|
||||
call dolt_checkout('-b', 'test');
|
||||
|
||||
INSERT INTO t VALUES (1,1), (2, 2);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'cm2');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'cm2');
|
||||
call dolt_checkout('main');
|
||||
|
||||
SELECT DOLT_MERGE('test');
|
||||
call dolt_merge('test');
|
||||
INSERT INTO t VALUES (NULL,6);
|
||||
SQL
|
||||
|
||||
|
||||
@@ -65,7 +65,7 @@ SQL
|
||||
dolt branch feature
|
||||
|
||||
dolt sql <<SQL
|
||||
select dolt_checkout('feature');
|
||||
call dolt_checkout('feature');
|
||||
insert into test values (2), (3), (4);
|
||||
commit;
|
||||
SQL
|
||||
@@ -90,8 +90,8 @@ SQL
|
||||
|
||||
# Reset our test setup
|
||||
dolt sql <<SQL
|
||||
select dolt_checkout('feature');
|
||||
select dolt_reset('--hard');
|
||||
call dolt_checkout('feature');
|
||||
call dolt_reset('--hard');
|
||||
insert into test values (2), (3), (4);
|
||||
commit;
|
||||
SQL
|
||||
|
||||
@@ -233,11 +233,11 @@ teardown() {
|
||||
dolt config --global --unset user.name
|
||||
dolt config --global --unset user.email
|
||||
|
||||
dolt sql -q "SELECT COMMIT('-a', '-m', 'updated stuff')"
|
||||
dolt sql -q "CALL DOLT_COMMIT('-a', '-m', 'updated stuff')"
|
||||
|
||||
dolt config --global --add user.name "bats tester"
|
||||
dolt sql -q "INSERT INTO test VALUES (1);"
|
||||
dolt sql -q "SELECT COMMIT('-a', '-m', 'updated stuff')"
|
||||
dolt sql -q "CALL DOLT_COMMIT('-a', '-m', 'updated stuff')"
|
||||
}
|
||||
|
||||
@test "config: DOLT_COMMIT uses default values when user.name or user.email is unset." {
|
||||
@@ -254,7 +254,7 @@ teardown() {
|
||||
dolt config --global --unset user.name
|
||||
dolt config --global --unset user.email
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'created table test')"
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'created table test')"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run dolt log -n 1
|
||||
@@ -267,7 +267,7 @@ teardown() {
|
||||
|
||||
dolt config --global --add user.name "bats tester"
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'created table test2')"
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'created table test2')"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run dolt log -n 1
|
||||
|
||||
@@ -555,16 +555,16 @@ SQL
|
||||
dolt checkout main
|
||||
|
||||
run dolt sql <<"SQL"
|
||||
SELECT DOLT_MERGE('other');
|
||||
call dolt_merge('other');
|
||||
SQL
|
||||
[ "$status" -eq "1" ]
|
||||
[[ "$output" =~ "conflicts" ]] || false
|
||||
[[ "$output" =~ "merge conflict" ]] || false
|
||||
run dolt sql <<"SQL"
|
||||
SET dolt_allow_commit_conflicts = 1;
|
||||
SELECT DOLT_MERGE('other');
|
||||
call dolt_merge('other');
|
||||
SQL
|
||||
[ "$status" -eq "0" ]
|
||||
[[ ! "$output" =~ "conflicts" ]] || false
|
||||
[[ ! "$output" =~ "merge conflict" ]] || false
|
||||
}
|
||||
|
||||
@test "conflict-detection-2: conflicts table properly cleared on dolt conflicts resolve" {
|
||||
|
||||
@@ -79,14 +79,14 @@ SQL
|
||||
|
||||
run dolt sql <<"SQL"
|
||||
SET dolt_allow_commit_conflicts = 0;
|
||||
SELECT DOLT_MERGE('other');
|
||||
call dolt_merge('other');
|
||||
SQL
|
||||
log_status_eq "1"
|
||||
[[ "$output" =~ "constraint violations" ]] || false
|
||||
run dolt sql <<"SQL"
|
||||
SET dolt_force_transaction_commit = 1;
|
||||
SELECT DOLT_MERGE('other');
|
||||
SELECT DOLT_COMMIT("-am", "msg", "--force");
|
||||
call dolt_merge('other');
|
||||
call dolt_commit("-am", "msg", "--force");
|
||||
SQL
|
||||
log_status_eq "0"
|
||||
[[ ! "$output" =~ "constraint violations" ]] || false
|
||||
|
||||
@@ -241,19 +241,19 @@ SQL
|
||||
create table t1 (a int primary key, b int);
|
||||
call dolt_add('.');
|
||||
insert into t1 values (1,1);
|
||||
select dolt_commit('-am', 'table with one row');
|
||||
select dolt_branch('onerow');
|
||||
call dolt_commit('-am', 'table with one row');
|
||||
call dolt_branch('onerow');
|
||||
insert into t1 values (2,2);
|
||||
select dolt_commit('-am', 'table with two rows');
|
||||
select dolt_branch('tworows');
|
||||
call dolt_commit('-am', 'table with two rows');
|
||||
call dolt_branch('tworows');
|
||||
create view v1 as select * from t1;
|
||||
call dolt_add('.');
|
||||
select dolt_commit('-am', 'view with select *');
|
||||
select dolt_branch('view');
|
||||
call dolt_commit('-am', 'view with select *');
|
||||
call dolt_branch('view');
|
||||
insert into t1 values (3,3);
|
||||
call dolt_add('.');
|
||||
select dolt_commit('-am', 'table with three rows');
|
||||
select dolt_branch('threerows');
|
||||
call dolt_commit('-am', 'table with three rows');
|
||||
call dolt_branch('threerows');
|
||||
drop view v1;
|
||||
create view v1 as select a+10, b+10 from t1;
|
||||
SQL
|
||||
|
||||
@@ -1356,7 +1356,7 @@ CREATE TABLE t1 (pk int PRIMARY KEY, col1 int);
|
||||
INSERT INTO t1 VALUES (1, 1);
|
||||
CREATE TABLE t2 (pk1a int, pk1b int, col1 int, PRIMARY KEY (pk1a, pk1b));
|
||||
INSERT INTO t2 VALUES (1, 1, 1);
|
||||
SELECT DOLT_ADD('.');
|
||||
call dolt_add('.');
|
||||
SQL
|
||||
dolt commit -am "initial"
|
||||
|
||||
@@ -1366,7 +1366,7 @@ UPDATE t1 set col1 = 100;
|
||||
ALTER TABLE t2 RENAME COLUMN pk1a to pk2a;
|
||||
ALTER TABLE t2 RENAME COLUMN pk1b to pk2b;
|
||||
UPDATE t2 set col1 = 100;
|
||||
SELECT DOLT_ADD('.');
|
||||
call dolt_add('.');
|
||||
SQL
|
||||
dolt commit -am 'rename primary key'
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ CREATE TABLE foo (
|
||||
);
|
||||
INSERT INTO foo VALUES (0,0), (1,1);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-am', 'Initialize table');
|
||||
call dolt_commit('-am', 'Initialize table');
|
||||
SQL
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@ teardown() {
|
||||
create table test(a int primary key, b int null);
|
||||
insert into test values (1,1), (2,2);
|
||||
call dolt_add('.');
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
@@ -43,7 +43,7 @@ SQL
|
||||
create table test(a int primary key, b int null);
|
||||
call dolt_add('.');
|
||||
insert into test values (1,1), (2,2);
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
@@ -81,7 +81,7 @@ SQL
|
||||
create table test(a int primary key, b int null);
|
||||
call dolt_add('.');
|
||||
insert into test values (1,1), (2,2);
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
@@ -136,7 +136,7 @@ EOF
|
||||
create table test(a int primary key, b int null);
|
||||
call dolt_add('.');
|
||||
insert into test values (1,1), (2,2);
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
@@ -174,7 +174,7 @@ SQL
|
||||
create table test(a int primary key, b int null, c int null);
|
||||
call dolt_add('.');
|
||||
insert into test values (1,2,3), (4,5,6);
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
@@ -211,7 +211,7 @@ SQL
|
||||
create table test(a int primary key, b int null, c int null);
|
||||
call dolt_add('.');
|
||||
insert into test values (1,2,3), (4,5,6);
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
@@ -249,7 +249,7 @@ SQL
|
||||
create table test(a int primary key, b int null);
|
||||
call dolt_add('.');
|
||||
insert into test values (1,1), (2,2);
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
@@ -299,7 +299,7 @@ EOF
|
||||
create table test(a int primary key, b int null);
|
||||
call dolt_add('.');
|
||||
insert into test values (1,1), (2,2);
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
@@ -340,7 +340,7 @@ SQL
|
||||
create table test(a int primary key, b int null default 10);
|
||||
call dolt_add('.');
|
||||
insert into test values (1,1), (2,2);
|
||||
select dolt_commit("-am", "table with two rows");
|
||||
call dolt_commit("-am", "table with two rows");
|
||||
SQL
|
||||
|
||||
dolt sql -q "drop table test"
|
||||
|
||||
@@ -85,7 +85,7 @@ teardown() {
|
||||
[ "${lines[1]}" = "commit C" ]
|
||||
|
||||
# dolt_merge_base() resolves commit hashes
|
||||
run dolt sql -q "SELECT dolt_merge_base('main', hashof('one')) = dolt_merge_base(hashof('main'),'one') FROM dual;" -r csv
|
||||
run dolt sql -q "select dolt_merge_base('main', hashof('one')) = dolt_merge_base(hashof('main'),'one') FROM dual;" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${lines[1]}" = "true" ]
|
||||
}
|
||||
|
||||
@@ -529,7 +529,7 @@ SQL
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ 'error: cannot merge two tables with different primary key sets' ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_MERGE('test')"
|
||||
run dolt sql -q "call dolt_merge('test')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ 'error: cannot merge two tables with different primary key sets' ]] || false
|
||||
|
||||
|
||||
@@ -183,9 +183,8 @@ teardown() {
|
||||
dolt config --local --add sqlserver.global.dolt_replicate_heads main,new_feature
|
||||
start_sql_server repo2
|
||||
|
||||
run dolt sql-client --use-db repo2 -P $PORT -u dolt -q "select dolt_checkout('new_feature') as b"
|
||||
run dolt sql-client --use-db repo2 -P $PORT -u dolt -q "call dolt_checkout('new_feature')"
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "b" ]] || false
|
||||
[[ "$output" =~ "0" ]] || false
|
||||
|
||||
run dolt sql-client --use-db repo2 -P $PORT -u dolt -q "select name from dolt_branches order by name"
|
||||
@@ -240,7 +239,7 @@ teardown() {
|
||||
|
||||
# Creating a branch locally that doesn't exist on the remote
|
||||
# works, but connecting to it is an error (nothing to pull)
|
||||
dolt sql-client --use-db "repo2/new_feature" -u dolt -P $PORT -q "select dolt_checkout('-b', 'new_branch')"
|
||||
dolt sql-client --use-db "repo2/new_feature" -u dolt -P $PORT -q "call dolt_checkout('-b', 'new_branch')"
|
||||
|
||||
run dolt sql-client --use-db "repo2/new_branch" -u dolt -P $PORT -q "show tables"
|
||||
[ $status -ne 0 ]
|
||||
|
||||
@@ -219,7 +219,7 @@ teardown() {
|
||||
[[ "$output" =~ "There is no tracking information for the current branch." ]] || false
|
||||
}
|
||||
|
||||
@test "remotes: select DOLT_CHECKOUT('new_branch') without '-b' sets upstream if there is a remote branch with matching name" {
|
||||
@test "remotes: call dolt_checkout('new_branch') without '-b' sets upstream if there is a remote branch with matching name" {
|
||||
mkdir remote
|
||||
mkdir repo1
|
||||
|
||||
@@ -253,9 +253,9 @@ teardown() {
|
||||
[[ ! "$output" =~ "test-branch" ]] || false
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('test-branch');
|
||||
call dolt_checkout('test-branch');
|
||||
SELECT * FROM test;
|
||||
SELECT DOLT_PULL();
|
||||
call dolt_pull();
|
||||
SQL
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "pk" ]] || false
|
||||
@@ -293,8 +293,8 @@ SQL
|
||||
|
||||
# Checkout with DOLT_CHECKOUT and confirm the table has the row added in the remote
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('-b','other');
|
||||
SELECT DOLT_PULL();
|
||||
call dolt_checkout('-b','other');
|
||||
call dolt_pull();
|
||||
SQL
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "There is no tracking information for the current branch." ]] || false
|
||||
|
||||
@@ -70,13 +70,13 @@ teardown() {
|
||||
dolt config --global --add sqlserver.global.dolt_replicate_to_remote remote1
|
||||
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; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; call dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; create table t2 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; call dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; create table t3 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; call dolt_commit('-am', 'cm')"
|
||||
|
||||
clone_helper $TMPDIRS
|
||||
run dolt sql --data-dir=dbs2 -b -q "use repo1; show tables" -r csv
|
||||
@@ -200,13 +200,13 @@ SQL
|
||||
push_helper $TMPDIRS
|
||||
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; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; call dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; create table t2 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; call dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; create table t3 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; call dolt_commit('-am', 'cm')"
|
||||
|
||||
clone_helper $TMPDIRS
|
||||
push_helper $TMPDIRS
|
||||
@@ -328,13 +328,13 @@ SQL
|
||||
push_helper $TMPDIRS
|
||||
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; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo1; call dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; create table t2 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo2; call dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; create table t3 (a int primary key)"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; call dolt_add('.')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; select dolt_commit('-am', 'cm')"
|
||||
dolt sql --data-dir=dbs1 -b -q "use repo3; call dolt_commit('-am', 'cm')"
|
||||
|
||||
clone_helper $TMPDIRS
|
||||
push_helper $TMPDIRS
|
||||
|
||||
@@ -50,7 +50,7 @@ teardown() {
|
||||
dolt config --local --add sqlserver.global.dolt_replicate_to_remote backup1
|
||||
dolt sql -q "create table t1 (a int primary key)"
|
||||
dolt sql -q "call dolt_add('.')"
|
||||
dolt sql -q "select dolt_commit('-am', 'cm')"
|
||||
dolt sql -q "call dolt_commit('-am', 'cm')"
|
||||
|
||||
cd ..
|
||||
dolt clone file://./bac1 repo2
|
||||
@@ -473,7 +473,7 @@ SQL
|
||||
dolt checkout -b new_feature
|
||||
dolt sql -q "create table t1 (a int primary key)"
|
||||
dolt sql -q "call dolt_add('.')"
|
||||
dolt sql -q "select dolt_commit('-am', 'cm')"
|
||||
dolt sql -q "call dolt_commit('-am', 'cm')"
|
||||
|
||||
cd ..
|
||||
dolt clone file://./rem1 repo2
|
||||
@@ -501,10 +501,9 @@ SQL
|
||||
|
||||
dolt add .
|
||||
|
||||
run dolt sql -q "select dolt_commit('-am', 'cm')"
|
||||
run dolt sql -q "call dolt_commit('-am', 'cm')"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "remote not found: 'unknown'" ]] || false
|
||||
[[ "$output" =~ "dolt_commit('-am', 'cm')" ]] || false
|
||||
}
|
||||
|
||||
@test "replication: bad source doesn't error during non-transactional commands" {
|
||||
@@ -652,7 +651,7 @@ SQL
|
||||
dolt config --local --add sqlserver.global.dolt_async_replication 1
|
||||
dolt sql -q "create table t1 (a int primary key)"
|
||||
dolt sql -q "call dolt_add('.')"
|
||||
dolt sql -q "select dolt_commit('-am', 'cm')"
|
||||
dolt sql -q "call dolt_commit('-am', 'cm')"
|
||||
sleep 5
|
||||
|
||||
cd ..
|
||||
|
||||
@@ -137,7 +137,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "revert: SQL HEAD" {
|
||||
dolt sql -q "SELECT DOLT_REVERT('HEAD')"
|
||||
dolt sql -q "call dolt_revert('HEAD')"
|
||||
run dolt sql -q "SELECT * FROM test" -r=csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "pk,v1" ]] || false
|
||||
@@ -167,7 +167,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "revert: SQL HEAD~1" {
|
||||
dolt sql -q "SELECT DOLT_REVERT('HEAD~1')"
|
||||
dolt sql -q "call dolt_revert('HEAD~1')"
|
||||
run dolt sql -q "SELECT * FROM test" -r=csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "pk,v1" ]] || false
|
||||
@@ -187,7 +187,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "revert: SQL HEAD & HEAD~1" {
|
||||
dolt sql -q "SELECT DOLT_REVERT('HEAD', 'HEAD~1')"
|
||||
dolt sql -q "call dolt_revert('HEAD', 'HEAD~1')"
|
||||
run dolt sql -q "SELECT * FROM test" -r=csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "pk,v1" ]] || false
|
||||
@@ -206,7 +206,7 @@ SQL
|
||||
|
||||
@test "revert: SQL has changes in the working set" {
|
||||
dolt sql -q "INSERT INTO test VALUES (4, 4)"
|
||||
run dolt sql -q "SELECT DOLT_REVERT('HEAD')"
|
||||
run dolt sql -q "call dolt_revert('HEAD')"
|
||||
[ "$status" -eq "1" ]
|
||||
[[ "$output" =~ "changes" ]] || false
|
||||
}
|
||||
@@ -225,7 +225,7 @@ SQL
|
||||
dolt sql -q "REPLACE INTO test VALUES (4, 5)"
|
||||
dolt add -A
|
||||
dolt commit -m "Updated 4"
|
||||
run dolt sql -q "SELECT DOLT_REVERT('HEAD~1')"
|
||||
run dolt sql -q "call dolt_revert('HEAD~1')"
|
||||
[ "$status" -eq "1" ]
|
||||
[[ "$output" =~ "conflict" ]] || false
|
||||
}
|
||||
@@ -257,7 +257,7 @@ SQL
|
||||
dolt sql -q "DELETE FROM parent WHERE pk = 20"
|
||||
dolt add -A
|
||||
dolt commit -m "MC3"
|
||||
run dolt sql -q "SELECT DOLT_REVERT('HEAD~1')"
|
||||
run dolt sql -q "call dolt_revert('HEAD~1')"
|
||||
[ "$status" -eq "1" ]
|
||||
[[ "$output" =~ "constraint violation" ]] || false
|
||||
}
|
||||
@@ -283,7 +283,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "revert: SQL too far back" {
|
||||
run dolt sql -q "SELECT DOLT_REVERT('HEAD~10')"
|
||||
run dolt sql -q "call dolt_revert('HEAD~10')"
|
||||
[ "$status" -eq "1" ]
|
||||
[[ "$output" =~ "ancestor" ]] || false
|
||||
}
|
||||
@@ -295,7 +295,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "revert: SQL revert init commit" {
|
||||
run dolt sql -q "SELECT DOLT_REVERT('HEAD~4')"
|
||||
run dolt sql -q "call dolt_revert('HEAD~4')"
|
||||
[ "$status" -ne "0" ]
|
||||
[[ "$output" =~ "cannot revert commit with no parents" ]] || false
|
||||
}
|
||||
@@ -307,7 +307,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "revert: SQL invalid hash" {
|
||||
run dolt sql -q "SELECT DOLT_REVERT('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"
|
||||
run dolt sql -q "call dolt_revert('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"
|
||||
[ "$status" -eq "1" ]
|
||||
[[ "$output" =~ "target commit not found" ]] || false
|
||||
}
|
||||
@@ -319,7 +319,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "revert: SQL HEAD with author" {
|
||||
dolt sql -q "SELECT DOLT_REVERT('HEAD', '--author', 'john doe <johndoe@gmail.com>')"
|
||||
dolt sql -q "call dolt_revert('HEAD', '--author', 'john doe <johndoe@gmail.com>')"
|
||||
run dolt sql -q "SELECT * FROM test" -r=csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "pk,v1" ]] || false
|
||||
@@ -345,7 +345,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "revert: SQL HEAD & HEAD~1 with author" {
|
||||
dolt sql -q "SELECT DOLT_REVERT('HEAD', 'HEAD~1', '--author', 'john doe <johndoe@gmail.com>')"
|
||||
dolt sql -q "call dolt_revert('HEAD', 'HEAD~1', '--author', 'john doe <johndoe@gmail.com>')"
|
||||
run dolt sql -q "SELECT * FROM test" -r=csv
|
||||
[ "$status" -eq "0" ]
|
||||
[[ "$output" =~ "pk,v1" ]] || false
|
||||
|
||||
@@ -21,8 +21,8 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-add: DOLT_ADD all flag works" {
|
||||
run dolt sql -q "SELECT DOLT_ADD('-A')"
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-m', 'Commit1')"
|
||||
run dolt sql -q "call dolt_add('-A')"
|
||||
run dolt sql -q "call dolt_commit('-m', 'Commit1')"
|
||||
|
||||
# Check that everything was added
|
||||
run dolt diff
|
||||
@@ -69,8 +69,8 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-add: DOLT_ADD all w/ . works" {
|
||||
run dolt sql -q "SELECT DOLT_ADD('.')"
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-m', 'Commit1')"
|
||||
run dolt sql -q "call dolt_add('.')"
|
||||
run dolt sql -q "call dolt_commit('-m', 'Commit1')"
|
||||
|
||||
# Check that everything was added
|
||||
run dolt diff
|
||||
@@ -101,8 +101,8 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-add: DOLT_ADD all w/ . combined with DOLT_COMMIT -a works" {
|
||||
run dolt sql -q "SELECT DOLT_ADD('.')"
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'Commit1')"
|
||||
run dolt sql -q "call dolt_add('.')"
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'Commit1')"
|
||||
|
||||
# Check that everything was added
|
||||
run dolt diff
|
||||
@@ -131,8 +131,8 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-add: DOLT_ADD can take in one table" {
|
||||
dolt sql -q "SELECT DOLT_ADD('test')"
|
||||
dolt sql -q "SELECT DOLT_COMMIT('-m', 'Commit1')"
|
||||
dolt sql -q "call dolt_add('test')"
|
||||
dolt sql -q "call dolt_commit('-m', 'Commit1')"
|
||||
|
||||
# Check that just test was added and not test2.
|
||||
run dolt status
|
||||
@@ -165,8 +165,8 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-add: DOLT_ADD can take in multiple tables" {
|
||||
run dolt sql -q "SELECT DOLT_ADD('test', 'test2')"
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-m', 'Commit1')"
|
||||
run dolt sql -q "call dolt_add('test', 'test2')"
|
||||
run dolt sql -q "call dolt_commit('-m', 'Commit1')"
|
||||
|
||||
# Check that both test and test2 are added.
|
||||
run dolt diff
|
||||
@@ -203,7 +203,7 @@ teardown() {
|
||||
run ls
|
||||
[[ "$output" =~ "README.md" ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_ADD('README.md')"
|
||||
run dolt sql -q "call dolt_add('README.md')"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# Check that the README was added as a new doc.
|
||||
|
||||
@@ -10,61 +10,61 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-backup: dolt_backup no argument" {
|
||||
run dolt sql -q "select dolt_backup()"
|
||||
run dolt sql -q "call dolt_backup()"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup()"
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
|
||||
@test "sql-backup: dolt_backup add" {
|
||||
run dolt sql -q "select dolt_backup('add', 'hostedapidb-0', 'file:///some_directory')"
|
||||
run dolt sql -q "call dolt_backup('add', 'hostedapidb-0', 'file:///some_directory')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('add', 'hostedapidb-0', 'file:///some_directory')"
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
|
||||
@test "sql-backup: dolt_backup rm" {
|
||||
run dolt sql -q "select dolt_backup('rm', 'hostedapidb-0')"
|
||||
run dolt sql -q "call dolt_backup('rm', 'hostedapidb-0')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('rm', 'hostedapidb-0')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "select dolt_backup('remove', 'hostedapidb-0')"
|
||||
run dolt sql -q "call dolt_backup('remove', 'hostedapidb-0')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('remove', 'hostedapidb-0')"
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
|
||||
@test "sql-backup: dolt_backup restore" {
|
||||
run dolt sql -q "select dolt_backup('restore', 'hostedapidb-0', 'file:///some_directory')"
|
||||
run dolt sql -q "call dolt_backup('restore', 'hostedapidb-0', 'file:///some_directory')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('restore', 'hostedapidb-0', 'file:///some_directory')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "select dolt_backup('restore', 'hostedapidb-0', 'file:///some_directory')"
|
||||
run dolt sql -q "call dolt_backup('restore', 'hostedapidb-0', 'file:///some_directory')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('restore', 'hostedapidb-0', 'file:///some_directory')"
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
|
||||
@test "sql-backup: dolt_backup unrecognized" {
|
||||
run dolt sql -q "select dolt_backup('unregonized', 'hostedapidb-0', 'file:///some_directory')"
|
||||
run dolt sql -q "call dolt_backup('unregonized', 'hostedapidb-0', 'file:///some_directory')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('unrecognized', 'hostedapidb-0', 'file:///some_directory')"
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
|
||||
@test "sql-backup: dolt_backup sync wrong number of args" {
|
||||
run dolt sql -q "select dolt_backup('sync')"
|
||||
run dolt sql -q "call dolt_backup('sync')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('sync')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "select dolt_backup('sync', 'hostedapidb-0', 'too many')"
|
||||
run dolt sql -q "call dolt_backup('sync', 'hostedapidb-0', 'too many')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('sync', 'hostedapidb-0', 'too many')"
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
|
||||
@test "sql-backup: dolt_backup no such backup" {
|
||||
run dolt sql -q "select dolt_backup('sync', 'hostedapidb-0')"
|
||||
run dolt sql -q "call dolt_backup('sync', 'hostedapidb-0')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('sync', 'hostedapidb-0')"
|
||||
[ "$status" -ne 0 ]
|
||||
@@ -74,12 +74,12 @@ teardown() {
|
||||
mkdir the_backup
|
||||
dolt backup add hostedapidb-0 file://./the_backup
|
||||
dolt backup -v
|
||||
dolt sql -q "select dolt_backup('sync', 'hostedapidb-0')"
|
||||
dolt sql -q "call dolt_backup('sync', 'hostedapidb-0')"
|
||||
# Initial backup works.
|
||||
dolt backup restore file://./the_backup the_restore
|
||||
(cd the_restore && dolt status)
|
||||
# Backup with nothing to push works.
|
||||
dolt sql -q "select dolt_backup('sync', 'hostedapidb-0')"
|
||||
dolt sql -q "call dolt_backup('sync', 'hostedapidb-0')"
|
||||
|
||||
rm -rf the_backup the_restore
|
||||
|
||||
@@ -92,7 +92,7 @@ teardown() {
|
||||
|
||||
@test "sql-backup: dolt_backup sync-url" {
|
||||
mkdir the_backup
|
||||
dolt sql -q "select dolt_backup('sync-url', 'file://./the_backup')"
|
||||
dolt sql -q "call dolt_backup('sync-url', 'file://./the_backup')"
|
||||
# Initial backup works.
|
||||
dolt backup restore file://./the_backup the_restore
|
||||
(cd the_restore && dolt status)
|
||||
@@ -106,7 +106,7 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-backup: dolt_backup sync-url fails for http remotes" {
|
||||
run dolt sql -q "select dolt_backup('sync-url', 'http://dolthub.com/dolthub/backup')"
|
||||
run dolt sql -q "call dolt_backup('sync-url', 'http://dolthub.com/dolthub/backup')"
|
||||
[ "$status" -ne 0 ]
|
||||
run dolt sql -q "CALL dolt_backup('sync-url', 'https://dolthub.com/dolthub/backup')"
|
||||
[ "$status" -ne 0 ]
|
||||
|
||||
@@ -118,7 +118,7 @@ SQL
|
||||
[[ "$output" =~ "test" ]] || false
|
||||
|
||||
dolt sql -b <<SQL
|
||||
SELECT dolt_reset('--hard');
|
||||
call dolt_reset('--hard');
|
||||
SQL
|
||||
|
||||
run dolt status
|
||||
@@ -127,7 +127,7 @@ SQL
|
||||
|
||||
dolt sql -b <<SQL
|
||||
INSERT INTO test VALUES (1,1);
|
||||
SELECT dolt_reset('--hard');
|
||||
call dolt_reset('--hard');
|
||||
SQL
|
||||
|
||||
run dolt status
|
||||
|
||||
@@ -22,7 +22,7 @@ teardown() {
|
||||
run dolt branch
|
||||
[[ ! "$output" =~ "new_branch" ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('new-branch')"
|
||||
run dolt sql -q "call dolt_branch('new-branch')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
# should create new branch and should not checkout the new branch
|
||||
@@ -72,12 +72,12 @@ teardown() {
|
||||
@test "sql-branch: DOLT_BRANCH throws error" {
|
||||
# branches that already exist
|
||||
dolt branch existing_branch
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('existing_branch')"
|
||||
run dolt sql -q "call dolt_branch('existing_branch')"
|
||||
[ $status -eq 1 ]
|
||||
[[ "$output" =~ "fatal: A branch named 'existing_branch' already exists." ]] || false
|
||||
|
||||
# empty branch
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('')"
|
||||
run dolt sql -q "call dolt_branch('')"
|
||||
[ $status -eq 1 ]
|
||||
[[ "$output" =~ "error: cannot branch empty string" ]] || false
|
||||
}
|
||||
@@ -109,7 +109,7 @@ teardown() {
|
||||
|
||||
# Current branch should be still main with test table without entry 4
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_BRANCH('-c', 'original', 'copy');
|
||||
call dolt_branch('-c', 'original', 'copy');
|
||||
SELECT * FROM test WHERE pk > 3;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
@@ -162,12 +162,12 @@ SQL
|
||||
[[ "$output" =~ "main" ]] || false
|
||||
|
||||
# branch copying from is empty
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('-c','','copy')"
|
||||
run dolt sql -q "call dolt_branch('-c','','copy')"
|
||||
[ $status -eq 1 ]
|
||||
[[ "$output" =~ "error: cannot branch empty string" ]] || false
|
||||
|
||||
# branch copying to is empty
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('-c','main','')"
|
||||
run dolt sql -q "call dolt_branch('-c','main','')"
|
||||
[ $status -eq 1 ]
|
||||
[[ "$output" =~ "error: cannot branch empty string" ]] || false
|
||||
|
||||
@@ -178,12 +178,12 @@ SQL
|
||||
[[ ! "$output" =~ "original" ]] || false
|
||||
|
||||
# branch copying from that don't exist
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('-c', 'original', 'copy');"
|
||||
run dolt sql -q "call dolt_branch('-c', 'original', 'copy');"
|
||||
[ $status -eq 1 ]
|
||||
[[ "$output" =~ "fatal: A branch named 'original' not found" ]] || false
|
||||
|
||||
# branch copying to that exists
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('-c', 'main', 'existing_branch');"
|
||||
run dolt sql -q "call dolt_branch('-c', 'main', 'existing_branch');"
|
||||
[ $status -eq 1 ]
|
||||
[[ "$output" =~ "fatal: A branch named 'existing_branch' already exists." ]] || false
|
||||
}
|
||||
@@ -226,7 +226,7 @@ SQL
|
||||
[ $status -eq 0 ]
|
||||
mainhash=$output
|
||||
|
||||
dolt sql -q "SELECT DOLT_BRANCH('feature-branch');"
|
||||
dolt sql -q "call dolt_branch('feature-branch');"
|
||||
run dolt sql -q "SELECT hash FROM dolt_branches WHERE name='feature-branch';"
|
||||
[ $status -eq 0 ]
|
||||
[ "$output" = "$mainhash" ]
|
||||
@@ -245,14 +245,14 @@ SQL
|
||||
[ "$output" = "$mainhash" ]
|
||||
}
|
||||
|
||||
@test "sql-branch: SELECT DOLT_BRANCH to rename and delete" {
|
||||
@test "sql-branch: call dolt_branch to rename and delete" {
|
||||
dolt add . && dolt commit -m "1, 2, and 3 in test table"
|
||||
dolt branch new_branch
|
||||
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('-m', 'new_branch', 'changed');"
|
||||
run dolt sql -q "call dolt_branch('-m', 'new_branch', 'changed');"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('-d', 'changed');"
|
||||
run dolt sql -q "call dolt_branch('-d', 'changed');"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
dolt branch branch_with_unpushed_commit
|
||||
@@ -260,11 +260,11 @@ SQL
|
||||
dolt commit --allow-empty -am 'empty commit'
|
||||
dolt checkout main
|
||||
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('-d', 'branch_with_unpushed_commit');"
|
||||
run dolt sql -q "call dolt_branch('-d', 'branch_with_unpushed_commit');"
|
||||
[ $status -eq 1 ]
|
||||
[[ "$output" =~ "attempted to delete a branch that is not fully merged" ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_BRANCH('-D', 'branch_with_unpushed_commit');"
|
||||
run dolt sql -q "call dolt_branch('-D', 'branch_with_unpushed_commit');"
|
||||
[ $status -eq 0 ]
|
||||
}
|
||||
|
||||
|
||||
@@ -19,10 +19,10 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-checkout: DOLT_CHECKOUT just works" {
|
||||
run dolt sql -q "SELECT DOLT_CHECKOUT('-b', 'feature-branch')"
|
||||
run dolt sql -q "call dolt_checkout('-b', 'feature-branch')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
# dolt sql -q "select dolt_checkout() should not change the branch
|
||||
# dolt sql -q "call dolt_checkout() should not change the branch
|
||||
# It changes the branch for that session which ends after the SQL
|
||||
# statements are executed.
|
||||
run dolt status
|
||||
@@ -33,7 +33,7 @@ teardown() {
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "feature-branch" ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_CHECKOUT('main');"
|
||||
run dolt sql -q "call dolt_checkout('main');"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -45,7 +45,7 @@ teardown() {
|
||||
run dolt sql -q "CALL DOLT_CHECKOUT('-b', 'feature-branch')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
# dolt sql -q "select dolt_checkout() should not change the branch
|
||||
# dolt sql -q "call dolt_checkout() should not change the branch
|
||||
# It changes the branch for that session which ends after the SQL
|
||||
# statements are executed.
|
||||
run dolt status
|
||||
@@ -74,7 +74,7 @@ SQL
|
||||
run dolt sql -q "CALL DCHECKOUT('-b', 'feature-branch')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
# dolt sql -q "select dolt_checkout() should not change the branch
|
||||
# dolt sql -q "call dolt_checkout() should not change the branch
|
||||
# It changes the branch for that session which ends after the SQL
|
||||
# statements are executed.
|
||||
run dolt status
|
||||
@@ -100,17 +100,17 @@ SQL
|
||||
}
|
||||
|
||||
@test "sql-checkout: DOLT_CHECKOUT -b throws error on branches that already exist" {
|
||||
run dolt sql -q "SELECT DOLT_CHECKOUT('-b', 'main')"
|
||||
run dolt sql -q "call dolt_checkout('-b', 'main')"
|
||||
[ $status -eq 1 ]
|
||||
}
|
||||
|
||||
@test "sql-checkout: CALL DOLT_CHECKOUT -b throws error on branches that already exist" {
|
||||
run dolt sql -q "CALL SELECT DOLT_CHECKOUT('-b', 'main')"
|
||||
run dolt sql -q "CALL call dolt_checkout('-b', 'main')"
|
||||
[ $status -eq 1 ]
|
||||
}
|
||||
|
||||
@test "sql-checkout: DOLT_CHECKOUT throws error on branches that don't exist" {
|
||||
run dolt sql -q "SELECT DOLT_CHECKOUT('feature-branch')"
|
||||
run dolt sql -q "call dolt_checkout('feature-branch')"
|
||||
[ $status -eq 1 ]
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "sql-checkout: DOLT_CHECKOUT -b throws error on empty branch" {
|
||||
run dolt sql -q "SELECT DOLT_CHECKOUT('-b', '')"
|
||||
run dolt sql -q "call dolt_checkout('-b', '')"
|
||||
[ $status -eq 1 ]
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ SQL
|
||||
|
||||
@test "sql-checkout: DOLT_CHECKOUT updates the head ref session var" {
|
||||
run dolt sql <<SQL
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
select @@dolt_repo_$$_head_ref;
|
||||
SQL
|
||||
|
||||
@@ -160,7 +160,7 @@ SQL
|
||||
|
||||
# After switching to a new branch, we don't see working set changes
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
select * from test where pk > 3;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
@@ -184,7 +184,7 @@ SQL
|
||||
[[ "$output" =~ "4" ]] || false
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch2');
|
||||
call dolt_checkout('-b', 'feature-branch2');
|
||||
insert into test values (5);
|
||||
select * from test where pk > 3;
|
||||
SQL
|
||||
@@ -205,7 +205,7 @@ SQL
|
||||
|
||||
# In a new session, the value inserted should still be there
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('feature-branch2');
|
||||
call dolt_checkout('feature-branch2');
|
||||
select * from test where pk > 3;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
@@ -213,7 +213,7 @@ SQL
|
||||
[[ "$output" =~ "5" ]] || false
|
||||
|
||||
# This is an error on the command line, but not in SQL
|
||||
run dolt sql -q "SELECT DOLT_CHECKOUT('main')"
|
||||
run dolt sql -q "call dolt_checkout('main')"
|
||||
[ $status -eq 0 ]
|
||||
}
|
||||
|
||||
@@ -281,7 +281,7 @@ SQL
|
||||
[[ "$output" =~ "5" ]] || false
|
||||
|
||||
# This is an error on the command line, but not in SQL
|
||||
run dolt sql -q "SELECT DOLT_CHECKOUT('main')"
|
||||
run dolt sql -q "call dolt_checkout('main')"
|
||||
[ $status -eq 0 ]
|
||||
}
|
||||
|
||||
@@ -293,14 +293,14 @@ SQL
|
||||
emptydiff=$output
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
SELECT * FROM dolt_diff_test;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "$emptydiff" ]] || false
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_checkout('feature-branch');
|
||||
SELECT * FROM dolt_diff_test;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
@@ -313,14 +313,14 @@ SQL
|
||||
[[ ! "$output" =~ "$emptydiff" ]] || false
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch2');
|
||||
call dolt_checkout('-b', 'feature-branch2');
|
||||
SELECT * FROM dolt_diff_test;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "$emptydiff" ]] || false
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('feature-branch2');
|
||||
call dolt_checkout('feature-branch2');
|
||||
SELECT * FROM dolt_diff_test;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
@@ -375,10 +375,10 @@ SQL
|
||||
dolt add . && dolt commit -m "0, 1, and 2 in test table"
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (4);
|
||||
SELECT DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-m', 'Added 4', '--author', 'John Doe <john@doe.com>');
|
||||
call dolt_add('.');
|
||||
call dolt_commit('-m', 'Added 4', '--author', 'John Doe <john@doe.com>');
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
|
||||
@@ -441,7 +441,7 @@ SQL
|
||||
dolt add . && dolt commit -m "0, 1, and 2 in test table"
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (4);
|
||||
select * from test where pk > 3;
|
||||
SQL
|
||||
@@ -450,8 +450,8 @@ SQL
|
||||
[[ "$output" =~ "4" ]] || false
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
SELECT DOLT_CHECKOUT('test');
|
||||
call dolt_checkout('feature-branch');
|
||||
call dolt_checkout('test');
|
||||
select * from test where pk > 3;
|
||||
SQL
|
||||
|
||||
@@ -489,15 +489,15 @@ CREATE TABLE one_pk (
|
||||
c2 BIGINT,
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
SELECT DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_add('.');
|
||||
call dolt_commit('-a', '-m', 'add tables');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,0,0);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed main');
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed main');
|
||||
call dolt_checkout('feature-branch');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,1,1);
|
||||
select dolt_commit('-a', '-m', "changed feature-branch");
|
||||
call dolt_commit('-a', '-m', "changed feature-branch");
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
|
||||
@@ -523,7 +523,7 @@ CREATE TABLE one_pk (
|
||||
c2 BIGINT,
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
SELECT DOLT_ADD('.');
|
||||
call dolt_add('.');
|
||||
CALL DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
CALL DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
CALL DOLT_CHECKOUT('main');
|
||||
@@ -550,7 +550,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "sql-checkout: DOLT_CHECKOUT does not throw an error when checking out to the same branch" {
|
||||
run dolt sql -q "SELECT DOLT_CHECKOUT('main')"
|
||||
run dolt sql -q "call dolt_checkout('main')"
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "0" ]] || false
|
||||
}
|
||||
|
||||
@@ -20,10 +20,10 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-commit: DOLT_COMMIT without a message throws error" {
|
||||
run dolt sql -q "SELECT DOLT_ADD('.')"
|
||||
run dolt sql -q "call dolt_add('.')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT()"
|
||||
run dolt sql -q "call dolt_commit()"
|
||||
[ $status -eq 1 ]
|
||||
run dolt log
|
||||
[ $status -eq 0 ]
|
||||
@@ -56,10 +56,10 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-commit: DOLT_COMMIT with just a message reads session parameters" {
|
||||
run dolt sql -q "SELECT DOLT_ADD('.')"
|
||||
run dolt sql -q "call dolt_add('.')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-m', 'Commit1')"
|
||||
run dolt sql -q "call dolt_commit('-m', 'Commit1')"
|
||||
[ $status -eq 0 ]
|
||||
run dolt log
|
||||
[ $status -eq 0 ]
|
||||
@@ -82,7 +82,7 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-commit: DOLT_COMMIT with the all flag performs properly" {
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'Commit1')"
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'Commit1')"
|
||||
|
||||
# Check that everything was added
|
||||
run dolt diff
|
||||
@@ -112,9 +112,9 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-commit: DOLT_COMMIT with all flag, message and author" {
|
||||
run dolt sql -r csv -q "SELECT DOLT_COMMIT('-a', '-m', 'Commit1', '--author', 'John Doe <john@doe.com>') as commit_hash"
|
||||
run dolt sql -r csv -q "call dolt_commit('-a', '-m', 'Commit1', '--author', 'John Doe <john@doe.com>')"
|
||||
[ $status -eq 0 ]
|
||||
DCOMMIT=$output
|
||||
DCOMMIT=$(echo "$output" | grep -E -o '[a-zA-Z0-9_]{32}')
|
||||
|
||||
# Check that everything was added
|
||||
run dolt diff
|
||||
@@ -141,11 +141,11 @@ teardown() {
|
||||
dolt config --global --unset user.name
|
||||
dolt config --global --unset user.email
|
||||
|
||||
run dolt sql -q "SELECT DOLT_ADD('.')"
|
||||
run dolt sql -q "call dolt_add('.')"
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-m', 'Commit1', '--author', 'John Doe <john@doe.com>') as commit_hash"
|
||||
run dolt sql -q "call dolt_commit('-m', 'Commit1', '--author', 'John Doe <john@doe.com>')"
|
||||
[ "$status" -eq 0 ]
|
||||
DCOMMIT=$output
|
||||
DCOMMIT=$(echo "$output" | grep -E -o '[a-zA-Z0-9_]{32}')
|
||||
|
||||
run dolt log
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -169,7 +169,7 @@ teardown() {
|
||||
|
||||
@test "sql-commit: DOLT_COMMIT immediately updates dolt log system table." {
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Commit1');
|
||||
call dolt_commit('-a', '-m', 'Commit1');
|
||||
SELECT * FROM dolt_log;
|
||||
SQL
|
||||
|
||||
@@ -190,7 +190,7 @@ SQL
|
||||
@test "sql-commit: DOLT_COMMIT immediately updates dolt diff system table." {
|
||||
original_hash=$(get_head_commit)
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Commit1');
|
||||
call dolt_commit('-a', '-m', 'Commit1');
|
||||
SELECT from_commit FROM dolt_diff_test WHERE to_commit = hashof('head');
|
||||
SQL
|
||||
|
||||
@@ -215,7 +215,7 @@ SQL
|
||||
head_variable=@@dolt_repo_$$_head
|
||||
head_commit=$(get_head_commit)
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Commit1');
|
||||
call dolt_commit('-a', '-m', 'Commit1');
|
||||
SELECT $head_variable = HASHOF('head');
|
||||
SELECT $head_variable
|
||||
SQL
|
||||
@@ -258,8 +258,8 @@ SQL
|
||||
CREATE TABLE test2 (
|
||||
pk int primary key
|
||||
);
|
||||
SELECT DOLT_ADD('test');
|
||||
SELECT DOLT_COMMIT('-m', '0, 1, 2 in test');
|
||||
call dolt_add('test');
|
||||
call dolt_commit('-m', '0, 1, 2 in test');
|
||||
SELECT $head_variable = HASHOF('head');
|
||||
SQL
|
||||
|
||||
@@ -284,9 +284,9 @@ SQL
|
||||
|
||||
# Now another partial commit
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_ADD('test2');
|
||||
call dolt_add('test2');
|
||||
insert into test values (20);
|
||||
SELECT DOLT_COMMIT('-m', 'added test2 table');
|
||||
call dolt_commit('-m', 'added test2 table');
|
||||
SELECT $head_variable = HASHOF('head');
|
||||
SQL
|
||||
|
||||
@@ -390,7 +390,7 @@ CREATE TABLE objects (
|
||||
|
||||
INSERT INTO objects (id,name,color) VALUES (1,'truck','red'),(2,'ball','green'),(3,'shoe','blue');
|
||||
|
||||
SELECT DOLT_COMMIT('-fam', 'Commit1');
|
||||
call dolt_commit('-fam', 'Commit1');
|
||||
SQL
|
||||
|
||||
[ $status -eq 0 ]
|
||||
@@ -440,7 +440,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "sql-commit: missing message does not panic and throws an error" {
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('--allow-empty', '-fam')"
|
||||
run dolt sql -q "call dolt_commit('--allow-empty', '-fam')"
|
||||
[ $status -eq 1 ]
|
||||
! [[ "$output" =~ 'panic' ]] || false
|
||||
[[ "$output" =~ 'error: no value for option `message' ]] || false
|
||||
|
||||
@@ -81,7 +81,7 @@ create database mydb;
|
||||
use mydb;
|
||||
create table test(a int primary key);
|
||||
call dolt_add('.');
|
||||
select dolt_commit("-am", "first commit");
|
||||
call dolt_commit("-am", "first commit");
|
||||
SQL
|
||||
|
||||
[ -d mydb ]
|
||||
@@ -109,12 +109,12 @@ create database mydb2;
|
||||
use mydb1;
|
||||
create table test(a int primary key);
|
||||
call dolt_add('.');
|
||||
select dolt_commit("-am", "first commit mydb1");
|
||||
call dolt_commit("-am", "first commit mydb1");
|
||||
use mydb2;
|
||||
begin;
|
||||
create table test(a int primary key);
|
||||
call dolt_add('.');
|
||||
select dolt_commit("-am", "first commit mydb2");
|
||||
call dolt_commit("-am", "first commit mydb2");
|
||||
SQL
|
||||
|
||||
[ -d db_dir/mydb1 ]
|
||||
@@ -153,12 +153,12 @@ create database mydb2;
|
||||
use mydb1;
|
||||
create table test(a int primary key);
|
||||
call dolt_add('.');
|
||||
select dolt_commit("-am", "first commit mydb1");
|
||||
call dolt_commit("-am", "first commit mydb1");
|
||||
use mydb2;
|
||||
begin;
|
||||
create table test(a int primary key);
|
||||
call dolt_add('.');
|
||||
select dolt_commit("-am", "first commit mydb2");
|
||||
call dolt_commit("-am", "first commit mydb2");
|
||||
SQL
|
||||
|
||||
[ -d "$absdir/mydb1" ]
|
||||
|
||||
@@ -39,7 +39,7 @@ teardown() {
|
||||
|
||||
@test "sql-fetch: dolt_fetch default" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_fetch()"
|
||||
dolt sql -q "call dolt_fetch()"
|
||||
|
||||
run dolt diff main origin/main
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -81,7 +81,7 @@ teardown() {
|
||||
|
||||
@test "sql-fetch: dolt_fetch origin" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_fetch('origin')"
|
||||
dolt sql -q "call dolt_fetch('origin')"
|
||||
|
||||
run dolt diff main origin/main
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -109,7 +109,7 @@ teardown() {
|
||||
|
||||
@test "sql-fetch: dolt_fetch main" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_fetch('origin', 'main')"
|
||||
dolt sql -q "call dolt_fetch('origin', 'main')"
|
||||
|
||||
run dolt diff main origin/main
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -137,7 +137,7 @@ teardown() {
|
||||
|
||||
@test "sql-fetch: dolt_fetch custom remote" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_fetch('test-remote')"
|
||||
dolt sql -q "call dolt_fetch('test-remote')"
|
||||
|
||||
run dolt diff main test-remote/main
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -165,7 +165,7 @@ teardown() {
|
||||
|
||||
@test "sql-fetch: dolt_fetch specific ref" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_fetch('test-remote', 'refs/heads/main:refs/remotes/test-remote/main')"
|
||||
dolt sql -q "call dolt_fetch('test-remote', 'refs/heads/main:refs/remotes/test-remote/main')"
|
||||
|
||||
run dolt diff main test-remote/main
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -196,7 +196,7 @@ teardown() {
|
||||
dolt push origin feature
|
||||
|
||||
cd ../repo2
|
||||
dolt sql -q "select dolt_fetch('origin', 'feature')"
|
||||
dolt sql -q "call dolt_fetch('origin', 'feature')"
|
||||
|
||||
run dolt diff main origin/feature
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -231,7 +231,7 @@ teardown() {
|
||||
dolt push origin v1
|
||||
|
||||
cd ../repo2
|
||||
dolt sql -q "select dolt_fetch('origin', 'main')"
|
||||
dolt sql -q "call dolt_fetch('origin', 'main')"
|
||||
|
||||
run dolt diff main v1
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -268,7 +268,7 @@ teardown() {
|
||||
dolt push origin v1
|
||||
|
||||
cd ../repo2
|
||||
dolt sql -q "select dolt_fetch('origin', 'refs/tags/v1:refs/tags/v1')"
|
||||
dolt sql -q "call dolt_fetch('origin', 'refs/tags/v1:refs/tags/v1')"
|
||||
|
||||
run dolt diff main origin/v1
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -301,7 +301,7 @@ teardown() {
|
||||
|
||||
@test "sql-fetch: dolt_fetch rename ref" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_fetch('test-remote', 'refs/heads/main:refs/remotes/test-remote/other')"
|
||||
dolt sql -q "call dolt_fetch('test-remote', 'refs/heads/main:refs/remotes/test-remote/other')"
|
||||
|
||||
run dolt diff main test-remote/other
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -330,7 +330,7 @@ teardown() {
|
||||
@test "sql-fetch: dolt_fetch override local branch" {
|
||||
skip "todo more flexible refspec support"
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_fetch('origin', 'main:refs/heads/main')"
|
||||
dolt sql -q "call dolt_fetch('origin', 'main:refs/heads/main')"
|
||||
|
||||
dolt diff main origin/main
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -366,11 +366,11 @@ teardown() {
|
||||
dolt push --force origin main
|
||||
|
||||
cd ../repo1
|
||||
run dolt sql -q "select dolt_fetch('origin', 'main')"
|
||||
run dolt sql -q "call dolt_fetch('origin', 'main')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "fetch failed: can't fast forward merge" ]] || false
|
||||
|
||||
dolt sql -q "select dolt_fetch('--force', 'origin', 'main')"
|
||||
dolt sql -q "call dolt_fetch('--force', 'origin', 'main')"
|
||||
|
||||
dolt diff main origin/main
|
||||
run dolt diff main origin/main
|
||||
@@ -411,7 +411,7 @@ teardown() {
|
||||
@test "sql-fetch: dolt_fetch unknown remote fails" {
|
||||
cd repo2
|
||||
dolt remote remove origin
|
||||
run dolt sql -q "select dolt_fetch('unknown')"
|
||||
run dolt sql -q "call dolt_fetch('unknown')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "unknown remote" ]] || false
|
||||
}
|
||||
@@ -427,7 +427,7 @@ teardown() {
|
||||
@test "sql-fetch: dolt_fetch unknown remote with fetchspec fails" {
|
||||
cd repo2
|
||||
dolt remote remove origin
|
||||
run dolt sql -q "select dolt_fetch('unknown', 'main')"
|
||||
run dolt sql -q "call dolt_fetch('unknown', 'main')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "unknown remote" ]] || false
|
||||
}
|
||||
@@ -442,7 +442,7 @@ teardown() {
|
||||
|
||||
@test "sql-fetch: dolt_fetch unknown ref fails" {
|
||||
cd repo2
|
||||
run dolt sql -q "select dolt_fetch('origin', 'unknown')"
|
||||
run dolt sql -q "call dolt_fetch('origin', 'unknown')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "invalid ref spec: 'unknown'" ]] || false
|
||||
}
|
||||
@@ -457,7 +457,7 @@ teardown() {
|
||||
@test "sql-fetch: dolt_fetch empty remote fails" {
|
||||
cd repo2
|
||||
dolt remote remove origin
|
||||
run dolt sql -q "select dolt_fetch('')"
|
||||
run dolt sql -q "call dolt_fetch('')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "unknown remote" ]] || false
|
||||
}
|
||||
@@ -472,7 +472,7 @@ teardown() {
|
||||
|
||||
@test "sql-fetch: dolt_fetch empty ref fails" {
|
||||
cd repo2
|
||||
run dolt sql -q "select dolt_fetch('origin', '')"
|
||||
run dolt sql -q "call dolt_fetch('origin', '')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "invalid fetch spec: ''" ]] || false
|
||||
}
|
||||
|
||||
@@ -20,9 +20,9 @@ teardown() {
|
||||
}
|
||||
|
||||
@test "sql-merge: DOLT_MERGE with unknown branch name throws an error" {
|
||||
dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'Step 1');"
|
||||
dolt sql -q "call dolt_commit('-a', '-m', 'Step 1');"
|
||||
|
||||
run dolt sql -q "SELECT DOLT_MERGE('feature-branch');"
|
||||
run dolt sql -q "call dolt_merge('feature-branch');"
|
||||
log_status_eq 1
|
||||
}
|
||||
|
||||
@@ -35,14 +35,14 @@ teardown() {
|
||||
|
||||
@test "sql-merge: DOLT_MERGE works with ff" {
|
||||
dolt sql <<SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
UPDATE test SET pk=1000 WHERE pk=0;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'this is a ff');
|
||||
call dolt_checkout('main');
|
||||
SQL
|
||||
run dolt sql -q "SELECT DOLT_MERGE('feature-branch');"
|
||||
run dolt sql -q "call dolt_merge('feature-branch');"
|
||||
log_status_eq 0
|
||||
|
||||
run dolt log -n 1
|
||||
@@ -146,12 +146,12 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE works in the session for fastforward." {
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'this is a ff');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
SELECT COUNT(*) > 0 FROM test WHERE pk=3;
|
||||
SQL
|
||||
log_status_eq 0
|
||||
@@ -199,13 +199,13 @@ SQL
|
||||
@test "sql-merge: DOLT_MERGE with autocommit off works in fast-forward." {
|
||||
dolt sql << SQL
|
||||
set autocommit = off;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
SELECT DOLT_CHECKOUT('-b', 'new-branch');
|
||||
call dolt_commit('-a', '-m', 'this is a ff');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
call dolt_checkout('-b', 'new-branch');
|
||||
SQL
|
||||
|
||||
run dolt sql -r csv -q "select * from test order by pk"
|
||||
@@ -225,7 +225,7 @@ INSERT INTO test VALUES (3);
|
||||
CALL DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
CALL DOLT_CHECKOUT('main');
|
||||
CALL DOLT_MERGE('feature-branch');
|
||||
SELECT DOLT_CHECKOUT('-b', 'new-branch');
|
||||
call dolt_checkout('-b', 'new-branch');
|
||||
SQL
|
||||
|
||||
run dolt sql -r csv -q "select * from test order by pk"
|
||||
@@ -239,12 +239,12 @@ SQL
|
||||
@test "sql-merge: DOLT_MERGE no-ff works with autocommit off." {
|
||||
dolt sql << SQL
|
||||
set autocommit = off;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch', '-no-ff');
|
||||
call dolt_commit('-a', '-m', 'this is a ff');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch', '-no-ff');
|
||||
COMMIT;
|
||||
SQL
|
||||
|
||||
@@ -282,17 +282,17 @@ CREATE TABLE test2 (pk int primary key, val int);
|
||||
INSERT INTO test2 VALUES (0, 0);
|
||||
SET autocommit = 0;
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test2 VALUES (1, 1);
|
||||
UPDATE test2 SET val=1000 WHERE pk=0;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'this is a normal commit');
|
||||
call dolt_checkout('main');
|
||||
UPDATE test2 SET val=1001 WHERE pk=0;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'update a value');
|
||||
SELECT DOLT_MERGE('feature-branch', '-m', 'this is a merge');
|
||||
call dolt_commit('-a', '-m', 'update a value');
|
||||
call dolt_merge('feature-branch', '-m', 'this is a merge');
|
||||
DELETE FROM dolt_conflicts_test2;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'remove conflicts');
|
||||
call dolt_commit('-a', '-m', 'remove conflicts');
|
||||
SQL
|
||||
|
||||
run dolt sql -r csv -q "select * from test2 order by pk"
|
||||
@@ -329,14 +329,14 @@ SQL
|
||||
@test "sql-merge: DOLT_MERGE works with autocommit off." {
|
||||
dolt sql << SQL
|
||||
set autocommit = off;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'this is a normal commit');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO test VALUES (5);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a normal commit');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'this is a normal commit');
|
||||
call dolt_merge('feature-branch');
|
||||
COMMIT;
|
||||
SQL
|
||||
|
||||
@@ -374,10 +374,10 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE correctly returns head and working session variables." {
|
||||
dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
call dolt_commit('-a', '-m', 'this is a ff');
|
||||
SQL
|
||||
head_variable=@@dolt_repo_$$_head
|
||||
|
||||
@@ -385,8 +385,8 @@ SQL
|
||||
head_hash=$(get_head_commit)
|
||||
|
||||
dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
SQL
|
||||
|
||||
run dolt sql -q "SELECT $head_variable"
|
||||
@@ -428,24 +428,23 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE correctly merges branches with differing content in same table without conflicts" {
|
||||
dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Insert 3');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'Insert 3');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO test VALUES (10000);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Insert 10000');
|
||||
call dolt_commit('-a', '-m', 'Insert 10000');
|
||||
SQL
|
||||
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_MERGE('feature-branch', '--no-commit');
|
||||
call dolt_merge('feature-branch', '--no-commit');
|
||||
SELECT COUNT(*) = 2 FROM test WHERE pk > 2;
|
||||
SQL
|
||||
|
||||
log_status_eq 0
|
||||
[[ "$output" =~ "true" ]] || false
|
||||
[[ "$output" =~ "true" ]] || false
|
||||
[[ "${lines[1]}" =~ "DOLT_MERGE('feature-branch', '--no-commit')" ]] || false # validate that merge returns 1 not "Updating..."
|
||||
[[ "${lines[3]}" =~ "0" ]] || false
|
||||
! [[ "$output" =~ "Updating" ]] || false
|
||||
|
||||
@@ -471,7 +470,7 @@ SQL
|
||||
[[ "$output" =~ "Changes to be committed:" ]] || false
|
||||
[[ "$output" =~ ([[:space:]]*modified:[[:space:]]*test) ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'Finish up Merge')";
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'Finish up Merge')";
|
||||
log_status_eq 0
|
||||
|
||||
run dolt status
|
||||
@@ -524,7 +523,7 @@ SQL
|
||||
[[ "$output" =~ "Changes to be committed:" ]] || false
|
||||
[[ "$output" =~ ([[:space:]]*modified:[[:space:]]*test) ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'Finish up Merge')";
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'Finish up Merge')";
|
||||
log_status_eq 0
|
||||
|
||||
run dolt status
|
||||
@@ -538,12 +537,12 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE works with no-ff" {
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'update feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch', '-no-ff', '-m', 'this is a no-ff');
|
||||
call dolt_commit('-a', '-m', 'update feature-branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch', '-no-ff', '-m', 'this is a no-ff');
|
||||
SELECT COUNT(*) = 4 FROM dolt_log
|
||||
SQL
|
||||
log_status_eq 0
|
||||
@@ -574,18 +573,18 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE -no-ff correctly changes head and working session variables." {
|
||||
dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'update feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'update feature-branch');
|
||||
call dolt_checkout('main');
|
||||
SQL
|
||||
head_variable=@@dolt_repo_$$_head
|
||||
head_hash=$(get_head_commit)
|
||||
working_variable=@@dolt_repo_$$_working
|
||||
working_hash=$(get_working_hash)
|
||||
|
||||
run dolt sql -q "SELECT DOLT_MERGE('feature-branch', '-no-ff', '-m', 'this is a no-ff');"
|
||||
run dolt sql -q "call dolt_merge('feature-branch', '-no-ff', '-m', 'this is a no-ff');"
|
||||
log_status_eq 0
|
||||
|
||||
run dolt sql -q "SELECT $head_variable"
|
||||
@@ -633,16 +632,16 @@ CREATE TABLE one_pk (
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'add tables');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,0,0);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed main');
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed main');
|
||||
call dolt_checkout('feature-branch');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,1,1);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed feature branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed feature branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
SQL
|
||||
log_status_eq 1
|
||||
[[ $output =~ "Merge conflict detected, transaction rolled back. Merge conflicts must be resolved using the dolt_conflicts tables before committing a transaction. To commit transactions with merge conflicts, set @@dolt_allow_commit_conflicts = 1" ]] || false
|
||||
@@ -656,7 +655,7 @@ SQL
|
||||
[[ $output =~ "no merge to abort" ]] || false
|
||||
|
||||
# make sure a clean SQL session doesn't have any merge going
|
||||
run dolt sql -q "SELECT DOLT_MERGE('--abort');"
|
||||
run dolt sql -q "call dolt_merge('--abort');"
|
||||
log_status_eq 1
|
||||
[[ $output =~ "no merge to abort" ]] || false
|
||||
|
||||
@@ -736,16 +735,16 @@ CREATE TABLE one_pk (
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'add tables');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,0,0);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed main');
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed main');
|
||||
call dolt_checkout('feature-branch');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,1,1);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed feature branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed feature branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
SQL
|
||||
log_status_eq 1
|
||||
[[ $output =~ "Merge conflict detected, transaction rolled back. Merge conflicts must be resolved using the dolt_conflicts tables before committing a transaction. To commit transactions with merge conflicts, set @@dolt_allow_commit_conflicts = 1" ]] || false
|
||||
@@ -761,24 +760,23 @@ SQL
|
||||
# now merge, examine the conflicts, and abort
|
||||
run dolt sql -r csv << SQL
|
||||
SET autocommit = off;
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_merge('feature-branch');
|
||||
SELECT * FROM dolt_conflicts;
|
||||
SELECT DOLT_MERGE('--abort');
|
||||
call dolt_merge('--abort');
|
||||
SQL
|
||||
log_status_eq 0
|
||||
[[ "${lines[2]}" =~ "table,num_conflicts" ]] || false
|
||||
[[ "${lines[3]}" =~ "one_pk,1" ]] || false
|
||||
[[ "${lines[4]}" =~ "DOLT_MERGE('--abort')" ]] || false
|
||||
[[ "${lines[5]}" =~ "0" ]] || false
|
||||
|
||||
# now resolve commits
|
||||
run dolt sql << SQL
|
||||
SET autocommit = off;
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_merge('feature-branch');
|
||||
REPLACE INTO one_pk (pk1, c1, c2) SELECT their_pk1, their_c1, their_c2 FROM dolt_conflicts_one_pk WHERE their_pk1 IS NOT NULL;
|
||||
DELETE FROM one_pk WHERE pk1 in (SELECT base_pk1 FROM dolt_conflicts_one_pk WHERE their_pk1 IS NULL);
|
||||
DELETE FROM dolt_conflicts_one_pk;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Finish Resolving');
|
||||
call dolt_commit('-a', '-m', 'Finish Resolving');
|
||||
SQL
|
||||
log_status_eq 0
|
||||
|
||||
@@ -803,17 +801,17 @@ CREATE TABLE one_pk (
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'add tables');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,0,0);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed main');
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed main');
|
||||
call dolt_checkout('feature-branch');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,1,1);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed feature branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
SELECT DOLT_MERGE('--abort');
|
||||
call dolt_commit('-a', '-m', 'changed feature branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
call dolt_merge('--abort');
|
||||
insert into one_pk values (9,9,9);
|
||||
commit;
|
||||
SQL
|
||||
@@ -884,17 +882,17 @@ CREATE TABLE one_pk (
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'add tables');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,0,0);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed main');
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed main');
|
||||
call dolt_checkout('feature-branch');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,1,1);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed feature branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
SELECT DOLT_MERGE('--abort');
|
||||
call dolt_commit('-a', '-m', 'changed feature branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
call dolt_merge('--abort');
|
||||
commit;
|
||||
SQL
|
||||
log_status_eq 0
|
||||
@@ -946,22 +944,22 @@ CREATE TABLE one_pk (
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'add tables');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,0,0);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed main');
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed main');
|
||||
call dolt_checkout('feature-branch');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,1,1);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed feature branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed feature branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
SQL
|
||||
|
||||
run dolt sql -r csv -q "SELECT count(*) from dolt_conflicts"
|
||||
[[ "$output" =~ "1" ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_MERGE('feature-branch');"
|
||||
run dolt sql -q "call dolt_merge('feature-branch');"
|
||||
log_status_eq 1
|
||||
[[ $output =~ "merging is not possible because you have not committed an active merge" ]] || false
|
||||
}
|
||||
@@ -991,22 +989,22 @@ SQL
|
||||
run dolt sql -r csv -q "SELECT count(*) from dolt_conflicts"
|
||||
[[ "$output" =~ "1" ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_MERGE('feature-branch');"
|
||||
run dolt sql -q "call dolt_merge('feature-branch');"
|
||||
log_status_eq 1
|
||||
[[ $output =~ "merging is not possible because you have not committed an active merge" ]] || false
|
||||
}
|
||||
|
||||
@test "sql-merge: DOLT_MERGE during an active merge throws an error" {
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Insert 3');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'Insert 3');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO test VALUES (500000);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Insert 500000');
|
||||
SELECT DOLT_MERGE('feature-branch', '--no-commit');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Insert 500000');
|
||||
call dolt_merge('feature-branch', '--no-commit');
|
||||
call dolt_merge('feature-branch');
|
||||
SQL
|
||||
|
||||
log_status_eq 1
|
||||
@@ -1032,12 +1030,12 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE works with ff and squash" {
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch', '--squash');
|
||||
call dolt_commit('-a', '-m', 'this is a ff');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch', '--squash');
|
||||
SELECT COUNT(*) > 0 FROM test WHERE pk=3;
|
||||
SQL
|
||||
log_status_eq 0
|
||||
@@ -1057,7 +1055,7 @@ SQL
|
||||
[[ "$output" =~ "Changes to be committed:" ]] || false
|
||||
[[ "$output" =~ ([[:space:]]*modified:[[:space:]]*test) ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'hi');"
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'hi');"
|
||||
log_status_eq 0
|
||||
|
||||
run dolt status
|
||||
@@ -1102,14 +1100,14 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE with no-ff and squash works." {
|
||||
dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Insert 3');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'Insert 3');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO test VALUES (500000);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Insert 500000');
|
||||
SELECT DOLT_MERGE('feature-branch', '--squash', '--no-commit');
|
||||
call dolt_commit('-a', '-m', 'Insert 500000');
|
||||
call dolt_merge('feature-branch', '--squash', '--no-commit');
|
||||
SQL
|
||||
|
||||
run dolt status
|
||||
@@ -1118,7 +1116,7 @@ SQL
|
||||
[[ "$output" =~ "Changes to be committed:" ]] || false
|
||||
[[ "$output" =~ ([[:space:]]*modified:[[:space:]]*test) ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'Finish up Merge')";
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'Finish up Merge')";
|
||||
log_status_eq 0
|
||||
|
||||
run dolt status
|
||||
@@ -1162,15 +1160,15 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE throws errors with working set changes." {
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'this is a ff');
|
||||
call dolt_checkout('main');
|
||||
CREATE TABLE tbl (
|
||||
pk int primary key
|
||||
);
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_merge('feature-branch');
|
||||
SQL
|
||||
log_status_eq 1
|
||||
[[ "$output" =~ "cannot merge with uncommitted changes" ]] || false
|
||||
@@ -1194,21 +1192,21 @@ SQL
|
||||
|
||||
@test "sql-merge: DOLT_MERGE with a long series of changing operations works." {
|
||||
dolt sql << SQL
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_commit('-a', '-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
INSERT INTO test VALUES (4);
|
||||
INSERT INTO test VALUES (21232);
|
||||
DELETE FROM test WHERE pk=4;
|
||||
UPDATE test SET pk=21 WHERE pk=21232;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Insert 3');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'Insert 3');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO test VALUES (500000);
|
||||
INSERT INTO test VALUES (500001);
|
||||
DELETE FROM test WHERE pk=500001;
|
||||
UPDATE test SET pk=60 WHERE pk=500000;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'Insert 60');
|
||||
SELECT DOLT_MERGE('feature-branch', '--no-commit');
|
||||
call dolt_commit('-a', '-m', 'Insert 60');
|
||||
call dolt_merge('feature-branch', '--no-commit');
|
||||
SQL
|
||||
|
||||
run dolt status
|
||||
@@ -1217,7 +1215,7 @@ SQL
|
||||
[[ "$output" =~ "Changes to be committed:" ]] || false
|
||||
[[ "$output" =~ ([[:space:]]*modified:[[:space:]]*test) ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_COMMIT('-a', '-m', 'Finish up Merge')";
|
||||
run dolt sql -q "call dolt_commit('-a', '-m', 'Finish up Merge')";
|
||||
log_status_eq 0
|
||||
|
||||
run dolt status
|
||||
@@ -1304,23 +1302,23 @@ CREATE TABLE one_pk (
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'add tables');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,0,0);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed main');
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed main');
|
||||
call dolt_checkout('feature-branch');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,1,1);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed feature branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed feature branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
SHOW WARNINGS;
|
||||
SELECT COUNT(*) FROM dolt_conflicts where num_conflicts > 0;
|
||||
rollback;
|
||||
SQL
|
||||
log_status_eq 0
|
||||
[[ "$output" =~ "| DOLT_MERGE('feature-branch') |" ]] || false
|
||||
[[ "$output" =~ "| 1 |" ]] || false # conflict should return 1
|
||||
[[ "$output" =~ "| conflicts |" ]] || false
|
||||
[[ "$output" =~ "| 1 |" ]] || false # conflict should return 1//
|
||||
[[ "$output" =~ "| Warning | 1105 | merge has unresolved conflicts or constraint violations |" ]] || false
|
||||
[[ "$output" =~ "| COUNT(*) |" ]] || false
|
||||
[[ "$output" =~ "| 1 |" ]] || false
|
||||
@@ -1335,16 +1333,16 @@ CREATE TABLE one_pk (
|
||||
c2 BIGINT,
|
||||
PRIMARY KEY (pk1)
|
||||
);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'add tables');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_commit('-a', '-m', 'add tables');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,0,0);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed main');
|
||||
SELECT DOLT_CHECKOUT('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed main');
|
||||
call dolt_checkout('feature-branch');
|
||||
INSERT INTO one_pk (pk1,c1,c2) VALUES (0,1,1);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'changed feature branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'changed feature branch');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
SHOW WARNINGS;
|
||||
SELECT COUNT(*) FROM dolt_conflicts where num_conflicts > 0;
|
||||
rollback;
|
||||
@@ -1360,11 +1358,11 @@ SQL
|
||||
@test "sql-merge: up-to-date branch does not error" {
|
||||
dolt commit -am "commit all changes"
|
||||
run dolt sql << SQL
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
call dolt_checkout('main');
|
||||
INSERT INTO test VALUES (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'a commit');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'a commit');
|
||||
call dolt_merge('feature-branch');
|
||||
SHOW WARNINGS;
|
||||
SQL
|
||||
log_status_eq 0
|
||||
|
||||
@@ -111,8 +111,7 @@ seed_repos_with_tables_with_use_statements() {
|
||||
cd ..
|
||||
run dolt sql --data-dir ./subremotes -b -q "
|
||||
USE repo2;
|
||||
select dolt_fetch() as f;" -r csv
|
||||
call dolt_fetch();" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "${lines[1]}" =~ "f" ]] || false
|
||||
[[ "${lines[2]}" =~ "1" ]] || false
|
||||
[[ "${lines[1]}" =~ "Rows inserted: 0 Rows updated: 0 Rows deleted: 0" ]] || false
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ teardown() {
|
||||
|
||||
@test "sql-pull: dolt_pull main" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_pull('origin')"
|
||||
dolt sql -q "call dolt_pull('origin')"
|
||||
run dolt sql -q "show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 2 ]
|
||||
@@ -71,7 +71,7 @@ teardown() {
|
||||
|
||||
@test "sql-pull: dolt_pull custom remote" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_pull('test-remote')"
|
||||
dolt sql -q "call dolt_pull('test-remote')"
|
||||
run dolt sql -q "show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 2 ]
|
||||
@@ -92,7 +92,7 @@ teardown() {
|
||||
@test "sql-pull: dolt_pull default origin" {
|
||||
cd repo2
|
||||
dolt remote remove test-remote
|
||||
dolt sql -q "select dolt_pull()"
|
||||
dolt sql -q "call dolt_pull()"
|
||||
run dolt sql -q "show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 2 ]
|
||||
@@ -114,7 +114,7 @@ teardown() {
|
||||
@test "sql-pull: dolt_pull default custom remote" {
|
||||
cd repo2
|
||||
dolt remote remove origin
|
||||
dolt sql -q "select dolt_pull()"
|
||||
dolt sql -q "call dolt_pull()"
|
||||
run dolt sql -q "show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 2 ]
|
||||
@@ -135,8 +135,8 @@ teardown() {
|
||||
|
||||
@test "sql-pull: dolt_pull up to date does not error" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_pull('origin')"
|
||||
dolt sql -q "select dolt_pull('origin')"
|
||||
dolt sql -q "call dolt_pull('origin')"
|
||||
dolt sql -q "call dolt_pull('origin')"
|
||||
run dolt sql -q "show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 2 ]
|
||||
@@ -157,7 +157,7 @@ teardown() {
|
||||
|
||||
@test "sql-pull: dolt_pull unknown remote fails" {
|
||||
cd repo2
|
||||
run dolt sql -q "select dolt_pull('unknown')"
|
||||
run dolt sql -q "call dolt_pull('unknown')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "unknown remote" ]] || false
|
||||
[[ ! "$output" =~ "panic" ]] || false
|
||||
@@ -174,7 +174,7 @@ teardown() {
|
||||
@test "sql-pull: dolt_pull unknown feature branch fails" {
|
||||
cd repo2
|
||||
dolt checkout feature
|
||||
run dolt sql -q "select dolt_pull('origin')"
|
||||
run dolt sql -q "call dolt_pull('origin')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "You asked to pull from the remote 'origin', but did not specify a branch" ]] || false
|
||||
[[ ! "$output" =~ "panic" ]] || false
|
||||
@@ -203,7 +203,7 @@ teardown() {
|
||||
dolt push
|
||||
|
||||
cd ../repo2
|
||||
dolt sql -q "select dolt_pull('origin')"
|
||||
dolt sql -q "call dolt_pull('origin')"
|
||||
run dolt sql -q "show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 2 ]
|
||||
@@ -265,12 +265,12 @@ teardown() {
|
||||
dolt push -f origin main
|
||||
|
||||
cd ../repo2
|
||||
run dolt sql -q "select dolt_pull('origin')"
|
||||
run dolt sql -q "call dolt_pull('origin')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ ! "$output" =~ "panic" ]] || false
|
||||
[[ "$output" =~ "fetch failed; dataset head is not ancestor of commit" ]] || false
|
||||
|
||||
dolt sql -q "select dolt_pull('-f', 'origin')"
|
||||
dolt sql -q "call dolt_pull('-f', 'origin')"
|
||||
|
||||
run dolt log -n 1
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -314,7 +314,7 @@ teardown() {
|
||||
@test "sql-pull: dolt_pull squash" {
|
||||
skip "todo: support dolt pull --squash (cli too)"
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_pull('--squash', 'origin')"
|
||||
dolt sql -q "call dolt_pull('--squash', 'origin')"
|
||||
run dolt sql -q "show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 2 ]
|
||||
@@ -335,7 +335,7 @@ teardown() {
|
||||
|
||||
@test "sql-pull: dolt_pull --noff flag" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_pull('--no-ff', 'origin')"
|
||||
dolt sql -q "call dolt_pull('--no-ff', 'origin')"
|
||||
dolt status
|
||||
run dolt log -n 1
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -367,7 +367,7 @@ teardown() {
|
||||
|
||||
@test "sql-pull: empty remote name does not panic" {
|
||||
cd repo2
|
||||
dolt sql -q "select dolt_pull('')"
|
||||
dolt sql -q "call dolt_pull('')"
|
||||
}
|
||||
|
||||
@test "sql-pull: empty remote name does not panic on CALL" {
|
||||
@@ -378,7 +378,7 @@ teardown() {
|
||||
@test "sql-pull: dolt_pull dirty working set fails" {
|
||||
cd repo2
|
||||
dolt sql -q "create table t2 (a int)"
|
||||
run dolt sql -q "select dolt_pull('origin')"
|
||||
run dolt sql -q "call dolt_pull('origin')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "cannot merge with uncommitted changes" ]] || false
|
||||
}
|
||||
@@ -398,7 +398,7 @@ teardown() {
|
||||
dolt tag
|
||||
|
||||
cd ../repo2
|
||||
dolt sql -q "select dolt_pull('origin')"
|
||||
dolt sql -q "call dolt_pull('origin')"
|
||||
run dolt tag
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "v1" ]] || false
|
||||
@@ -432,7 +432,7 @@ teardown() {
|
||||
dolt push origin v3
|
||||
|
||||
cd ../repo2
|
||||
dolt sql -q "select dolt_pull('origin')"
|
||||
dolt sql -q "call dolt_pull('origin')"
|
||||
run dolt tag
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "v1" ]] || false
|
||||
@@ -524,7 +524,7 @@ teardown() {
|
||||
dolt push
|
||||
|
||||
cd ../repo2
|
||||
dolt sql -q "select dolt_pull()"
|
||||
dolt sql -q "call dolt_pull()"
|
||||
run dolt sql -q "show tables" -r csv
|
||||
[ "$status" -eq 0 ]
|
||||
[ "${#lines[@]}" -eq 2 ]
|
||||
@@ -563,7 +563,7 @@ teardown() {
|
||||
|
||||
dolt sql -q "insert into t1 values (2, 3)"
|
||||
dolt commit -am "add (2,3) to t1"
|
||||
run dolt sql -q "select dolt_pull()"
|
||||
run dolt sql -q "call dolt_pull()"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run dolt log --oneline -n 1
|
||||
|
||||
@@ -38,7 +38,7 @@ teardown() {
|
||||
|
||||
@test "sql-push: dolt_push origin" {
|
||||
cd repo1
|
||||
dolt sql -q "select dolt_push('origin', 'main')"
|
||||
dolt sql -q "call dolt_push('origin', 'main')"
|
||||
|
||||
cd ../repo2
|
||||
dolt pull origin
|
||||
@@ -77,7 +77,7 @@ teardown() {
|
||||
|
||||
@test "sql-push: dolt_push custom remote" {
|
||||
cd repo1
|
||||
dolt sql -q "select dolt_push('test-remote', 'main')"
|
||||
dolt sql -q "call dolt_push('test-remote', 'main')"
|
||||
|
||||
cd ../repo2
|
||||
dolt pull origin
|
||||
@@ -104,7 +104,7 @@ teardown() {
|
||||
@test "sql-push: dolt_push active branch" {
|
||||
skip "upstream state lost between sessions"
|
||||
cd repo1
|
||||
dolt sql -q "select dolt_push('origin')"
|
||||
dolt sql -q "call dolt_push('origin')"
|
||||
|
||||
cd ../repo2
|
||||
dolt pull origin
|
||||
@@ -132,7 +132,7 @@ teardown() {
|
||||
@test "sql-push: dolt_push feature branch" {
|
||||
cd repo1
|
||||
dolt checkout -b feature
|
||||
dolt sql -q "select dolt_push('origin', 'feature')"
|
||||
dolt sql -q "call dolt_push('origin', 'feature')"
|
||||
|
||||
cd ../repo2
|
||||
dolt fetch origin feature
|
||||
@@ -166,7 +166,7 @@ teardown() {
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "The current branch other has no upstream branch." ]] || false
|
||||
|
||||
dolt sql -q "select dolt_push('-u', 'origin', 'other')"
|
||||
dolt sql -q "call dolt_push('-u', 'origin', 'other')"
|
||||
# upstream should be set still
|
||||
run dolt push
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -182,7 +182,7 @@ teardown() {
|
||||
[[ "$output" =~ "The current branch other has no upstream branch." ]] || false
|
||||
|
||||
dolt config --local --add push.autoSetUpRemote true
|
||||
dolt sql -q "select dolt_push()"
|
||||
dolt sql -q "call dolt_push()"
|
||||
# upstream should be set still
|
||||
run dolt push
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -198,7 +198,7 @@ teardown() {
|
||||
[[ "$output" =~ "The current branch other has no upstream branch." ]] || false
|
||||
|
||||
dolt config --local --add push.autoSetUpRemote TRUE
|
||||
dolt sql -q "select dolt_push()"
|
||||
dolt sql -q "call dolt_push()"
|
||||
# upstream should be set still
|
||||
run dolt push
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -228,11 +228,11 @@ teardown() {
|
||||
dolt push origin main
|
||||
|
||||
cd ../repo1
|
||||
run dolt sql -q "select dolt_push('origin', 'main')"
|
||||
run dolt sql -q "call dolt_push('origin', 'main')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "the tip of your current branch is behind its remote counterpart" ]] || false
|
||||
|
||||
dolt sql -q "select dolt_push('--force', 'origin', 'main')"
|
||||
dolt sql -q "call dolt_push('--force', 'origin', 'main')"
|
||||
}
|
||||
|
||||
@test "sql-push: CALL dolt_push --force flag" {
|
||||
@@ -252,7 +252,7 @@ teardown() {
|
||||
|
||||
@test "sql-push: push to unknown remote" {
|
||||
cd repo1
|
||||
run dolt sql -q "select dolt_push('unknown', 'main')"
|
||||
run dolt sql -q "call dolt_push('unknown', 'main')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "unknown remote: 'unknown'" ]] || false
|
||||
}
|
||||
@@ -266,7 +266,7 @@ teardown() {
|
||||
|
||||
@test "sql-push: push unknown branch" {
|
||||
cd repo1
|
||||
run dolt sql -q "select dolt_push('origin', 'unknown')"
|
||||
run dolt sql -q "call dolt_push('origin', 'unknown')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "refspec not found: 'unknown'" ]] || false
|
||||
}
|
||||
@@ -280,7 +280,7 @@ teardown() {
|
||||
|
||||
@test "sql-push: not specifying a branch throws an error" {
|
||||
cd repo1
|
||||
run dolt sql -q "select dolt_push('-u', 'origin')"
|
||||
run dolt sql -q "call dolt_push('-u', 'origin')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "invalid set-upstream arguments" ]] || false
|
||||
}
|
||||
@@ -294,7 +294,7 @@ teardown() {
|
||||
|
||||
@test "sql-push: pushing empty branch does not panic" {
|
||||
cd repo1
|
||||
run dolt sql -q "select dolt_push('origin', '')"
|
||||
run dolt sql -q "call dolt_push('origin', '')"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "invalid ref spec: ''" ]] || false
|
||||
}
|
||||
|
||||
@@ -22,7 +22,7 @@ teardown() {
|
||||
@test "sql-reset: DOLT_RESET --hard works on unstaged and staged table changes" {
|
||||
dolt sql -q "INSERT INTO test VALUES (1)"
|
||||
|
||||
run dolt sql -q "SELECT DOLT_RESET('--hard')"
|
||||
run dolt sql -q "call dolt_reset('--hard')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -34,7 +34,7 @@ teardown() {
|
||||
|
||||
dolt add .
|
||||
|
||||
run dolt sql -q "SELECT DOLT_RESET('--hard')"
|
||||
run dolt sql -q "call dolt_reset('--hard')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -45,7 +45,7 @@ teardown() {
|
||||
dolt sql -q "INSERT INTO test VALUES (1)"
|
||||
|
||||
# Reset to head results in clean main.
|
||||
run dolt sql -q "SELECT DOLT_RESET('--hard', 'head');"
|
||||
run dolt sql -q "call dolt_reset('--hard', 'head');"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -130,7 +130,7 @@ teardown() {
|
||||
dolt docs upload LICENSE.md LICENSE.md
|
||||
dolt add .
|
||||
|
||||
run dolt sql -q "SELECT DOLT_RESET('--hard')"
|
||||
run dolt sql -q "call dolt_reset('--hard')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
dolt status
|
||||
@@ -171,7 +171,7 @@ teardown() {
|
||||
dolt sql -q "INSERT INTO test VALUES (1)"
|
||||
|
||||
# Table should still be unstaged
|
||||
run dolt sql -q "SELECT DOLT_RESET('--soft')"
|
||||
run dolt sql -q "call dolt_reset('--soft')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -181,7 +181,7 @@ teardown() {
|
||||
|
||||
dolt add .
|
||||
|
||||
run dolt sql -q "SELECT DOLT_RESET('--soft')"
|
||||
run dolt sql -q "call dolt_reset('--soft')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -218,7 +218,7 @@ teardown() {
|
||||
dolt docs upload LICENSE.md LICENSE.md
|
||||
dolt add .
|
||||
|
||||
run dolt sql -q "SELECT DOLT_RESET('--soft')"
|
||||
run dolt sql -q "call dolt_reset('--soft')"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -243,7 +243,7 @@ teardown() {
|
||||
dolt sql -q "INSERT INTO test VALUES (1)"
|
||||
|
||||
# Table should still be unstaged
|
||||
run dolt sql -q "SELECT DOLT_RESET('test')"
|
||||
run dolt sql -q "call dolt_reset('test')"
|
||||
|
||||
run dolt status
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -253,7 +253,7 @@ teardown() {
|
||||
dolt sql -q "CREATE TABLE test2 (pk int primary key);"
|
||||
|
||||
dolt add .
|
||||
run dolt sql -q "SELECT DOLT_RESET('test', 'test2')"
|
||||
run dolt sql -q "call dolt_reset('test', 'test2')"
|
||||
|
||||
run dolt status
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -288,7 +288,7 @@ teardown() {
|
||||
@test "sql-reset: DOLT_RESET --soft and --hard on the same table" {
|
||||
# Make a change to the table and do a soft reset
|
||||
dolt sql -q "INSERT INTO test VALUES (1)"
|
||||
run dolt sql -q "SELECT DOLT_RESET('test')"
|
||||
run dolt sql -q "call dolt_reset('test')"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -299,7 +299,7 @@ teardown() {
|
||||
# Add and unstage the table with a soft reset. Make sure the same data exists.
|
||||
dolt add .
|
||||
|
||||
run dolt sql -q "SELECT DOLT_RESET('test')"
|
||||
run dolt sql -q "call dolt_reset('test')"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
run dolt status
|
||||
@@ -312,7 +312,7 @@ teardown() {
|
||||
[[ "$output" =~ 1 ]] || false
|
||||
|
||||
# Do a hard reset and validate the insert was wiped properly
|
||||
run dolt sql -q "SELECT DOLT_RESET('--hard')"
|
||||
run dolt sql -q "call dolt_reset('--hard')"
|
||||
|
||||
run dolt status
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -369,7 +369,7 @@ CREATE TABLE test2 (
|
||||
pk int primary key
|
||||
);
|
||||
SQL
|
||||
dolt sql -q "SELECT DOLT_RESET('--hard');"
|
||||
dolt sql -q "call dolt_reset('--hard');"
|
||||
|
||||
run dolt status
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -377,7 +377,7 @@ SQL
|
||||
[[ "$output" =~ ([[:space:]]*new table:[[:space:]]*test2) ]] || false
|
||||
|
||||
dolt add .
|
||||
dolt sql -q "SELECT DOLT_RESET('--hard');"
|
||||
dolt sql -q "call dolt_reset('--hard');"
|
||||
run dolt status
|
||||
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -410,7 +410,7 @@ SQL
|
||||
@test "sql-reset: No rows in dolt_diff table after DOLT_RESET('--hard') on committed table." {
|
||||
run dolt sql << SQL
|
||||
INSERT INTO test VALUES (1);
|
||||
SELECT DOLT_RESET('--hard');
|
||||
call dolt_reset('--hard');
|
||||
SELECT count(*)=0 FROM dolt_diff_test;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
@@ -432,7 +432,7 @@ SQL
|
||||
@test "sql-reset: No rows in dolt_status table after DOLT_RESET('--hard') on committed table." {
|
||||
run dolt sql << SQL
|
||||
INSERT INTO test VALUES (1);
|
||||
SELECT DOLT_RESET('--hard');
|
||||
call dolt_reset('--hard');
|
||||
SELECT count(*)=0 FROM dolt_status;
|
||||
SQL
|
||||
[ $status -eq 0 ]
|
||||
@@ -454,7 +454,7 @@ SQL
|
||||
head_hash=$(get_head_commit)
|
||||
run dolt sql << SQL
|
||||
INSERT INTO test VALUES (1);
|
||||
SELECT DOLT_RESET('--hard');
|
||||
call dolt_reset('--hard');
|
||||
SELECT $head_variable;
|
||||
SQL
|
||||
|
||||
@@ -480,7 +480,7 @@ SQL
|
||||
INSERT INTO test VALUES (1);
|
||||
SQL
|
||||
|
||||
dolt sql -q "SELECT DOLT_RESET('test');"
|
||||
dolt sql -q "call dolt_reset('test');"
|
||||
run dolt sql -q "SELECT * FROM dolt_status;"
|
||||
|
||||
[ $status -eq 0 ]
|
||||
@@ -506,8 +506,8 @@ SQL
|
||||
|
||||
run dolt sql << SQL
|
||||
INSERT INTO test VALUES (1);
|
||||
SELECT DOLT_ADD('.');
|
||||
SELECT DOLT_RESET('test');
|
||||
call dolt_add('.');
|
||||
call dolt_reset('test');
|
||||
SELECT $working_hash_var
|
||||
SQL
|
||||
|
||||
@@ -516,7 +516,7 @@ SQL
|
||||
# These should not match as @@_working should become a new staged hash different from the original working.
|
||||
[[ ! "$output" =~ $working_hash ]] || false
|
||||
|
||||
run dolt sql -q "SELECT DOLT_RESET('--hard');"
|
||||
run dolt sql -q "call dolt_reset('--hard');"
|
||||
[ $status -eq 0 ]
|
||||
|
||||
run dolt sql -q "SELECT $working_hash_var"
|
||||
@@ -533,8 +533,8 @@ SQL
|
||||
|
||||
run dolt sql << SQL
|
||||
INSERT INTO test VALUES (1);
|
||||
SELECT DOLT_ADD('.');
|
||||
SELECT DOLT_RESET('test');
|
||||
call dolt_add('.');
|
||||
call dolt_reset('test');
|
||||
SELECT $working_hash_var
|
||||
SQL
|
||||
|
||||
|
||||
@@ -257,18 +257,18 @@ SQL
|
||||
|
||||
dolt sql --user=dolt -q "CALL DOLT_ADD('.')"
|
||||
# check that dolt_commit works properly when autocommit is on
|
||||
run dolt sql --user=dolt -q "SELECT DOLT_COMMIT('-a', '-m', 'Commit1')"
|
||||
run dolt sql --user=dolt -q "call dolt_commit('-a', '-m', 'Commit1')"
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
# check that dolt_commit throws error now that there are no working set changes.
|
||||
run dolt sql --user=dolt -q "SELECT DOLT_COMMIT('-a', '-m', 'Commit1')"
|
||||
run dolt sql --user=dolt -q "call dolt_commit('-a', '-m', 'Commit1')"
|
||||
[ "$status" -eq 1 ]
|
||||
|
||||
# Make a change to the working set but not the staged set.
|
||||
run dolt sql --user=dolt -q "INSERT INTO one_pk (pk,c1,c2) VALUES (2,2,2),(3,3,3)"
|
||||
|
||||
# check that dolt_commit throws error now that there are no staged changes.
|
||||
run dolt sql --user=dolt -q "SELECT DOLT_COMMIT('-m', 'Commit1')"
|
||||
run dolt sql --user=dolt -q "call dolt_commit('-m', 'Commit1')"
|
||||
[ "$status" -eq 1 ]
|
||||
|
||||
run dolt log
|
||||
@@ -577,14 +577,14 @@ SQL
|
||||
pk int primary key
|
||||
);
|
||||
INSERT INTO test VALUES (0),(1),(2);
|
||||
SELECT DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-m', 'Step 1');
|
||||
SELECT DOLT_CHECKOUT('-b', 'feature-branch');
|
||||
call dolt_add('.');
|
||||
call dolt_commit('-m', 'Step 1');
|
||||
call dolt_checkout('-b', 'feature-branch');
|
||||
INSERT INTO test VALUES (3);
|
||||
UPDATE test SET pk=1000 WHERE pk=0;
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'this is a ff');
|
||||
SELECT DOLT_CHECKOUT('main');
|
||||
SELECT DOLT_MERGE('feature-branch');
|
||||
call dolt_commit('-a', '-m', 'this is a ff');
|
||||
call dolt_checkout('main');
|
||||
call dolt_merge('feature-branch');
|
||||
"
|
||||
|
||||
run dolt sql-client -P $PORT -u dolt --use-db repo1 -q "SELECT * FROM test"
|
||||
@@ -836,7 +836,7 @@ SQL
|
||||
start_sql_server repo1
|
||||
|
||||
run dolt sql-client -P $PORT -u dolt --use-db repo1 -q '
|
||||
select dolt_checkout("new");
|
||||
call dolt_checkout("new");
|
||||
CREATE TABLE t (a int primary key, b int);
|
||||
INSERT INTO t VALUES (2,2),(3,3);'
|
||||
|
||||
|
||||
@@ -813,7 +813,7 @@ SQL
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "active_branch()" ]] || false
|
||||
[[ "$output" =~ "main" ]] || false
|
||||
run dolt sql <<< "select dolt_checkout('-b', 'tmp_br') as co; select active_branch()"
|
||||
run dolt sql <<< "call dolt_checkout('-b', 'tmp_br'); select active_branch()"
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "active_branch()" ]] || false
|
||||
[[ "$output" =~ "tmp_br" ]] || false
|
||||
|
||||
@@ -1291,7 +1291,7 @@ USE \`dolt_repo_$$/feature-branch\`;
|
||||
CREATE TABLE table_a(x int primary key);
|
||||
CREATE TABLE table_b(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'two new tables');
|
||||
call dolt_commit('-a', '-m', 'two new tables');
|
||||
SQL
|
||||
|
||||
run dolt sql -q "show tables" -r csv
|
||||
@@ -1317,7 +1317,7 @@ USE test1;
|
||||
CREATE TABLE table_a(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into table_a values (1), (2);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'created table_a');
|
||||
call dolt_commit('-a', '-m', 'created table_a');
|
||||
SQL
|
||||
|
||||
cd test1
|
||||
@@ -1380,7 +1380,7 @@ USE test1;
|
||||
CREATE TABLE table_a(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into table_a values (1), (2);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'created table_a');
|
||||
call dolt_commit('-a', '-m', 'created table_a');
|
||||
SQL
|
||||
|
||||
cd test1
|
||||
@@ -1474,7 +1474,7 @@ SQL
|
||||
set @@dolt_repo_$$_head_ref = 'feature-branch';
|
||||
CREATE TABLE test (x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
SQL
|
||||
|
||||
run dolt sql -q "show tables" -r csv
|
||||
@@ -1492,7 +1492,7 @@ SQL
|
||||
dolt sql <<SQL
|
||||
set @@dolt_repo_$$_head_ref = 'refs/heads/feature-branch';
|
||||
insert into test values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'inserted 3 values');
|
||||
call dolt_commit('-a', '-m', 'inserted 3 values');
|
||||
SQL
|
||||
|
||||
dolt checkout feature-branch
|
||||
@@ -1526,7 +1526,7 @@ USE \`dolt_repo_$$/feature-branch\`;
|
||||
CREATE TABLE a1(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into a1 values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
SQL
|
||||
|
||||
run dolt sql -q "select * from \`dolt_repo_$$/feature-branch\`.a1 order by x;" -r csv
|
||||
@@ -1544,7 +1544,7 @@ USE \`dolt_repo_$$/feature-branch\`;
|
||||
CREATE TABLE a1(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into a1 values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
SQL
|
||||
|
||||
run dolt sql -q "insert into \`dolt_repo_$$/feature-branch\`.a1 values (4);" -r csv
|
||||
@@ -1563,9 +1563,9 @@ SQL
|
||||
CREATE TABLE a1(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into a1 values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
insert into a1 values (4), (5), (6);
|
||||
select DOLT_COMMIT('-a', '-m', 'more values');
|
||||
call dolt_commit('-a', '-m', 'more values');
|
||||
SQL
|
||||
|
||||
# get the second to last commit hash
|
||||
@@ -1595,9 +1595,9 @@ SQL
|
||||
CREATE TABLE a1(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into a1 values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
insert into a1 values (4), (5), (6);
|
||||
select DOLT_COMMIT('-a', '-m', 'more values');
|
||||
call dolt_commit('-a', '-m', 'more values');
|
||||
SQL
|
||||
|
||||
# get the second to last commit hash
|
||||
@@ -1625,9 +1625,9 @@ SQL
|
||||
CREATE TABLE a1(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into a1 values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
insert into a1 values (4), (5), (6);
|
||||
select DOLT_COMMIT('-a', '-m', 'more values');
|
||||
call dolt_commit('-a', '-m', 'more values');
|
||||
SQL
|
||||
|
||||
# get the second to last commit hash
|
||||
@@ -1656,7 +1656,7 @@ USE \`dolt_repo_$$/feature-branch\`;
|
||||
CREATE TABLE a1(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into a1 values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
SQL
|
||||
|
||||
run dolt tag v1
|
||||
@@ -1692,9 +1692,9 @@ SQL
|
||||
CREATE TABLE a1(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into a1 values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
insert into a1 values (4), (5), (6);
|
||||
select DOLT_COMMIT('-a', '-m', 'more values');
|
||||
call dolt_commit('-a', '-m', 'more values');
|
||||
SQL
|
||||
|
||||
run dolt tag v1
|
||||
@@ -1722,9 +1722,9 @@ SQL
|
||||
CREATE TABLE a1(x int primary key);
|
||||
CALL DOLT_ADD('.');
|
||||
insert into a1 values (1), (2), (3);
|
||||
SELECT DOLT_COMMIT('-a', '-m', 'new table');
|
||||
call dolt_commit('-a', '-m', 'new table');
|
||||
insert into a1 values (4), (5), (6);
|
||||
select DOLT_COMMIT('-a', '-m', 'more values');
|
||||
call dolt_commit('-a', '-m', 'more values');
|
||||
SQL
|
||||
|
||||
run dolt tag v1
|
||||
|
||||
@@ -12,14 +12,14 @@ char *queries[QUERIES_SIZE] =
|
||||
"select * from test",
|
||||
"insert into test (pk, `value`) values (0,0)",
|
||||
"select * from test",
|
||||
"select dolt_add('-A');",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"call dolt_add('-A');",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (10,10)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')",
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
};
|
||||
|
||||
|
||||
@@ -33,14 +33,14 @@ std::string queries[QUERIES_SIZE] =
|
||||
"select * from test",
|
||||
"insert into test (pk, `value`) values (0,0)",
|
||||
"select * from test",
|
||||
"select dolt_add('-A');",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"call dolt_add('-A');",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (1,1)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')",
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
};
|
||||
|
||||
|
||||
@@ -82,13 +82,13 @@ public class DoltSQL
|
||||
public static void DoltSqlTest(MySqlConnection conn)
|
||||
{
|
||||
string[] queries = new string[] {
|
||||
"select dolt_add('-A');",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
"call dolt_add('-A');",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (1,1)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')",
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')",
|
||||
};
|
||||
|
||||
for (int i = 0; i < queries.Length ; i++) {
|
||||
|
||||
@@ -87,13 +87,13 @@ namespace MySqlConnectorTest
|
||||
public static void DoltSqlTest(MySqlConnection conn)
|
||||
{
|
||||
string[] queries = new string[] {
|
||||
"select dolt_add('-A');",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
"call dolt_add('-A');",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (1,1)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')",
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')",
|
||||
};
|
||||
|
||||
for (int i = 0; i < queries.Length ; i++) {
|
||||
|
||||
@@ -33,14 +33,14 @@ defmodule SmokeTest do
|
||||
myTestFunc(result.num_rows, 1)
|
||||
myTestFunc(result.rows, [[0,0]])
|
||||
|
||||
{:ok, _} = MyXQL.query(pid, "select dolt_add('-A');")
|
||||
{:ok, _} = MyXQL.query(pid, "select dolt_commit('-m', 'my commit')")
|
||||
{:ok, _} = MyXQL.query(pid, "call dolt_add('-A');")
|
||||
{:ok, _} = MyXQL.query(pid, "call dolt_commit('-m', 'my commit')")
|
||||
{:ok, _} = MyXQL.query(pid, "select COUNT(*) FROM dolt_log")
|
||||
{:ok, _} = MyXQL.query(pid, "select dolt_checkout('-b', 'mybranch')")
|
||||
{:ok, _} = MyXQL.query(pid, "call dolt_checkout('-b', 'mybranch')")
|
||||
{:ok, _} = MyXQL.query(pid, "insert into test (pk, `value`) values (1,1)")
|
||||
{:ok, _} = MyXQL.query(pid, "select dolt_commit('-a', '-m', 'my commit2')")
|
||||
{:ok, _} = MyXQL.query(pid, "select dolt_checkout('main')")
|
||||
{:ok, _} = MyXQL.query(pid, "select dolt_merge('mybranch')")
|
||||
{:ok, _} = MyXQL.query(pid, "call dolt_commit('-a', '-m', 'my commit2')")
|
||||
{:ok, _} = MyXQL.query(pid, "call dolt_checkout('main')")
|
||||
{:ok, _} = MyXQL.query(pid, "call dolt_merge('mybranch')")
|
||||
|
||||
{:ok, result} = MyXQL.query(pid, "select COUNT(*) FROM dolt_log")
|
||||
myTestFunc(result.num_rows, 1)
|
||||
|
||||
@@ -14,13 +14,13 @@ var queries = [12]string{
|
||||
"select * from test",
|
||||
"insert into test (pk, `value`) values (0,0)",
|
||||
"select * from test",
|
||||
"select dolt_add('-A')",
|
||||
"select dolt_commit('-m', 'added table test')",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
"call dolt_add('-A')",
|
||||
"call dolt_commit('-m', 'added table test')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test values (1,1)",
|
||||
"select dolt_commit('-a', '-m', 'updated test')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')"}
|
||||
"call dolt_commit('-a', '-m', 'updated test')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')"}
|
||||
|
||||
type ResFunc func(rows *sql.Rows) error
|
||||
|
||||
|
||||
@@ -27,14 +27,14 @@ public class MySQLConnectorTest {
|
||||
"select * from test",
|
||||
"insert into test (pk, `value`) values (0,0)",
|
||||
"select * from test",
|
||||
"select dolt_add('-A')",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"call dolt_add('-A')",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (1,1)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')",
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
};
|
||||
|
||||
@@ -52,7 +52,7 @@ public class MySQLConnectorTest {
|
||||
"1",
|
||||
"1",
|
||||
"0",
|
||||
"0",
|
||||
"1",
|
||||
"3"
|
||||
};
|
||||
|
||||
|
||||
@@ -46,14 +46,14 @@ async function main() {
|
||||
"select * from test",
|
||||
"insert into test (pk, `value`) values (0,0)",
|
||||
"select * from test",
|
||||
"select dolt_add('-A');",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"call dolt_add('-A');",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (1,1)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')",
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
];
|
||||
|
||||
@@ -93,10 +93,10 @@ async function main() {
|
||||
changedRows: 0
|
||||
},
|
||||
[ { pk: 0, value: 0 } ],
|
||||
[ { "dolt_add('-A')": 0 } ],
|
||||
[ { status: 0 } ],
|
||||
[],
|
||||
[ { "COUNT(*)": 2 } ],
|
||||
[ { "dolt_checkout('-b', 'mybranch')": 0 } ],
|
||||
[ { status: 0 } ],
|
||||
{
|
||||
fieldCount: 0,
|
||||
affectedRows: 1,
|
||||
@@ -108,8 +108,8 @@ async function main() {
|
||||
changedRows: 0
|
||||
},
|
||||
[],
|
||||
[ { "dolt_checkout('main')": 0 } ],
|
||||
[ { "dolt_merge('mybranch')": 0 } ],
|
||||
[ { status: 0 } ],
|
||||
[ { fast_forward: 1, conflicts: 0 } ],
|
||||
[ { "COUNT(*)": 3 } ],
|
||||
];
|
||||
|
||||
|
||||
@@ -7,13 +7,13 @@ my $QUERY_RESPONSE = [
|
||||
{ "describe test" => 2 },
|
||||
{ "insert into test (pk, `value`) values (0,0)" => 1 },
|
||||
{ "select * from test" => 1 },
|
||||
{"select dolt_add('-A');" => 1 },
|
||||
{"select dolt_commit('-m', 'my commit')" => 1},
|
||||
{"select dolt_checkout('-b', 'mybranch')" => 1 },
|
||||
{"call dolt_add('-A');" => 1 },
|
||||
{"call dolt_commit('-m', 'my commit')" => 1},
|
||||
{"call dolt_checkout('-b', 'mybranch')" => 1 },
|
||||
{"insert into test (pk, `value`) values (1,1)" => 1 },
|
||||
{"select dolt_commit('-a', '-m', 'my commit2')" => 1 },
|
||||
{"select dolt_checkout('main')" => 1 },
|
||||
{"select dolt_merge('mybranch')" => 1 },
|
||||
{"call dolt_commit('-a', '-m', 'my commit2')" => 1 },
|
||||
{"call dolt_checkout('main')" => 1 },
|
||||
{"call dolt_merge('mybranch')" => 1 },
|
||||
{"select COUNT(*) FROM dolt_log" => 1 },
|
||||
];
|
||||
|
||||
|
||||
@@ -16,14 +16,14 @@ QUERY_RESPONSE = [
|
||||
{"select * from test; ": [(0, 0)]},
|
||||
{"select * from test; ": [(0, 0)]},
|
||||
# Test the Dolt SQL functions
|
||||
{"select dolt_add('-A');": [(0,)]},
|
||||
{"select dolt_commit('-m', 'my commit')": [('',)]},
|
||||
{"call dolt_add('-A');": [(0,)]},
|
||||
{"call dolt_commit('-m', 'my commit')": [('',)]},
|
||||
{"select COUNT(*) FROM dolt_log": [(2,)]},
|
||||
{"select dolt_checkout('-b', 'mybranch')": [(0,)]},
|
||||
{"call dolt_checkout('-b', 'mybranch')": [(0,)]},
|
||||
{"insert into test (pk, `value`) values (1,1)": []},
|
||||
{"select dolt_commit('-a', '-m', 'my commit2')": [('',)]},
|
||||
{"select dolt_checkout('main')": [(0,)]},
|
||||
{"select dolt_merge('mybranch')": [(0,)]},
|
||||
{"call dolt_commit('-a', '-m', 'my commit2')": [('',)]},
|
||||
{"call dolt_checkout('main')": [(0,)]},
|
||||
{"call dolt_merge('mybranch')": [(1,0,)]},
|
||||
{"select COUNT(*) FROM dolt_log": [(3,)]},
|
||||
]
|
||||
|
||||
|
||||
@@ -9,14 +9,14 @@ QUERY_RESPONSE = [
|
||||
)},
|
||||
{"insert into test (pk, `value`) values (0,0)": ()},
|
||||
{"select * from test": ((0, 0),)},
|
||||
{"select dolt_add('-A');": ((0,),)},
|
||||
{"select dolt_commit('-m', 'my commit')": (('',),)},
|
||||
{"call dolt_add('-A');": ((0,),)},
|
||||
{"call dolt_commit('-m', 'my commit')": (('',),)},
|
||||
{"select COUNT(*) FROM dolt_log": ((2,),)},
|
||||
{"select dolt_checkout('-b', 'mybranch')": ((0,),)},
|
||||
{"call dolt_checkout('-b', 'mybranch')": ((0,),)},
|
||||
{"insert into test (pk, `value`) values (1,1)": ()},
|
||||
{"select dolt_commit('-a', '-m', 'my commit2')": (('',),)},
|
||||
{"select dolt_checkout('main')": ((0,),)},
|
||||
{"select dolt_merge('mybranch')": ((0,),)},
|
||||
{"call dolt_commit('-a', '-m', 'my commit2')": (('',),)},
|
||||
{"call dolt_checkout('main')": ((0,),)},
|
||||
{"call dolt_merge('mybranch')": ((1,0,),)},
|
||||
{"select COUNT(*) FROM dolt_log": ((3,),)},
|
||||
]
|
||||
|
||||
|
||||
@@ -13,14 +13,14 @@ QUERY_RESPONSE = [
|
||||
]},
|
||||
{"insert into test (pk, `value`) values (0,0)": ()},
|
||||
{"select * from test": [(0, 0)]},
|
||||
{"select dolt_add('-A');": [(0,)]},
|
||||
{"select dolt_commit('-m', 'my commit')": [('',)]},
|
||||
{"call dolt_add('-A');": [(0,)]},
|
||||
{"call dolt_commit('-m', 'my commit')": [('',)]},
|
||||
{"select COUNT(*) FROM dolt_log": [(2,)]},
|
||||
{"select dolt_checkout('-b', 'mybranch')": [(0,)]},
|
||||
{"call dolt_checkout('-b', 'mybranch')": [(0,)]},
|
||||
{"insert into test (pk, `value`) values (1,1)": []},
|
||||
{"select dolt_commit('-a', '-m', 'my commit2')": [('',)]},
|
||||
{"select dolt_checkout('main')": [(0,)]},
|
||||
{"select dolt_merge('mybranch')": [(0,)]},
|
||||
{"call dolt_commit('-a', '-m', 'my commit2')": [('',)]},
|
||||
{"call dolt_checkout('main')": [(0,)]},
|
||||
{"call dolt_merge('mybranch')": [(1,0,)]},
|
||||
{"select COUNT(*) FROM dolt_log": [(3,)]},
|
||||
]
|
||||
|
||||
|
||||
@@ -56,13 +56,13 @@ if (!isTRUE(all.equal(want, got))) {
|
||||
quit(1)
|
||||
}
|
||||
|
||||
dolt_queries = list("SELECT DOLT_ADD('-A')",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
dolt_queries = list("call DOLT_ADD('-A')",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (2,2)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')")
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')")
|
||||
|
||||
for(i in 1:length(dolt_queries)) {
|
||||
q = dolt_queries[[i]]
|
||||
|
||||
@@ -37,13 +37,13 @@ for(i in 1:length(queries)) {
|
||||
}
|
||||
}
|
||||
|
||||
dolt_queries = list("SELECT DOLT_ADD('-A')",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
dolt_queries = list("call DOLT_ADD('-A')",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (1,1)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')")
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')")
|
||||
|
||||
for(i in 1:length(dolt_queries)) {
|
||||
q = dolt_queries[[i]]
|
||||
|
||||
@@ -12,14 +12,14 @@ queries = [
|
||||
"select * from test",
|
||||
"insert into test (pk, `value`) values (0,0)",
|
||||
"select * from test",
|
||||
"select dolt_add('-A');",
|
||||
"select dolt_commit('-m', 'my commit')",
|
||||
"call dolt_add('-A');",
|
||||
"call dolt_commit('-m', 'my commit')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
"select dolt_checkout('-b', 'mybranch')",
|
||||
"call dolt_checkout('-b', 'mybranch')",
|
||||
"insert into test (pk, `value`) values (1,1)",
|
||||
"select dolt_commit('-a', '-m', 'my commit2')",
|
||||
"select dolt_checkout('main')",
|
||||
"select dolt_merge('mybranch')",
|
||||
"call dolt_commit('-a', '-m', 'my commit2')",
|
||||
"call dolt_checkout('main')",
|
||||
"call dolt_merge('mybranch')",
|
||||
"select COUNT(*) FROM dolt_log",
|
||||
]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user