Return not found for non-existent DB refs

This commit is contained in:
Zach Musgrave
2023-09-18 11:34:41 -07:00
parent 1ae3a49864
commit 25fa4f6e88
3 changed files with 68 additions and 5 deletions

View File

@@ -16,11 +16,13 @@ package sqle
import (
"context"
"errors"
"fmt"
"sort"
"strings"
"sync"
"github.com/dolthub/dolt/go/store/datas"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/dolt/go/cmd/dolt/cli"
@@ -794,6 +796,7 @@ func (p DoltDatabaseProvider) databaseForRevision(ctx *sql.Context, revisionQual
if !ok {
return nil, false, nil
}
db, err := revisionDbForCommit(ctx, srcDb.(Database), rev, requestedName)
if err != nil {
return nil, false, err
@@ -814,12 +817,12 @@ func (p DoltDatabaseProvider) databaseForRevision(ctx *sql.Context, revisionQual
func revisionDbType(ctx *sql.Context, srcDb dsess.SqlDatabase, revSpec string) (revType dsess.RevisionType, resolvedRevSpec string, err error) {
resolvedRevSpec, err = resolveAncestorSpec(ctx, revSpec, srcDb.DbData().Ddb)
if err != nil {
return 0, "", err
return dsess.RevisionTypeNone, "", err
}
caseSensitiveBranchName, isBranch, err := isBranch(ctx, srcDb, resolvedRevSpec)
if err != nil {
return 0, "", err
return dsess.RevisionTypeNone, "", err
}
if isBranch {
@@ -828,7 +831,7 @@ func revisionDbType(ctx *sql.Context, srcDb dsess.SqlDatabase, revSpec string) (
isTag, err := isTag(ctx, srcDb, resolvedRevSpec)
if err != nil {
return 0, "", err
return dsess.RevisionTypeNone, "", err
}
if isTag {
@@ -836,12 +839,40 @@ func revisionDbType(ctx *sql.Context, srcDb dsess.SqlDatabase, revSpec string) (
}
if doltdb.IsValidCommitHash(resolvedRevSpec) {
return dsess.RevisionTypeCommit, resolvedRevSpec, nil
// IsValidCommitHash just checks a regex, we need to see if the commit actually exists
valid, err := isValidCommitHash(ctx, srcDb, resolvedRevSpec)
if err != nil {
return 0, "", err
}
if valid {
return dsess.RevisionTypeCommit, resolvedRevSpec, nil
}
}
return dsess.RevisionTypeNone, "", nil
}
func isValidCommitHash(ctx *sql.Context, db dsess.SqlDatabase, commitHash string) (bool, error) {
cs, err := doltdb.NewCommitSpec(commitHash)
if err != nil {
return false, err
}
for _, ddb := range db.DoltDatabases() {
_, err = ddb.Resolve(ctx, cs, nil)
if errors.Is(err, datas.ErrCommitNotFound) {
continue
} else if err != nil {
return false, err
}
return true, nil
}
return false, nil
}
func initialDbState(ctx context.Context, db dsess.SqlDatabase, branch string) (dsess.InitialDbState, error) {
rsr := db.DbData().Rsr
ddb := db.DbData().Ddb

View File

@@ -2590,6 +2590,38 @@ var DoltCheckoutScripts = []queries.ScriptTest{
},
},
},
{
Name: "Using non-existent refs",
SetUpScript: []string{
"create table t (a int primary key, b int);",
"insert into t values (1, 1);",
"call dolt_commit('-Am', 'creating table t');",
"call dolt_branch('b1');",
"call dolt_tag('tag1');",
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "use mydb/b1",
Expected: []sql.Row{},
},
{
Query: "use mydb/b2",
ExpectedErrStr: "database not found: mydb/b2",
},
{
Query: "use mydb/tag1",
Expected: []sql.Row{},
},
{
Query: "use mydb/tag2",
ExpectedErrStr: "database not found: mydb/tag2",
},
{
Query: "use mydb/h4jks5lomp9u41r6902knn0pfr7lsgth",
ExpectedErrStr: "database not found: mydb/h4jks5lomp9u41r6902knn0pfr7lsgth",
},
},
},
}
var DoltInfoSchemaScripts = []queries.ScriptTest{

View File

@@ -333,7 +333,7 @@ func LoadCommitAddr(ctx context.Context, vr types.ValueReader, addr hash.Hash) (
return nil, err
}
if v == nil {
return nil, errors.New("target commit not found")
return nil, ErrCommitNotFound
}
return CommitFromValue(vr.Format(), v)
}