From 25fa4f6e88974518dbd104a7efdcdcb12cc352c9 Mon Sep 17 00:00:00 2001 From: Zach Musgrave Date: Mon, 18 Sep 2023 11:34:41 -0700 Subject: [PATCH] Return not found for non-existent DB refs --- .../doltcore/sqle/database_provider.go | 39 +++++++++++++++++-- .../doltcore/sqle/enginetest/dolt_queries.go | 32 +++++++++++++++ go/store/datas/commit.go | 2 +- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/go/libraries/doltcore/sqle/database_provider.go b/go/libraries/doltcore/sqle/database_provider.go index 96691caa24..7358d84101 100644 --- a/go/libraries/doltcore/sqle/database_provider.go +++ b/go/libraries/doltcore/sqle/database_provider.go @@ -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 diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_queries.go b/go/libraries/doltcore/sqle/enginetest/dolt_queries.go index 36a5642e70..38624cecb4 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_queries.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_queries.go @@ -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{ diff --git a/go/store/datas/commit.go b/go/store/datas/commit.go index 530a0d5c85..dc9b6781af 100644 --- a/go/store/datas/commit.go +++ b/go/store/datas/commit.go @@ -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) }