Fixes and more tests

This commit is contained in:
Taylor Bantle
2022-10-18 12:04:04 -07:00
parent 8fd9c18c3e
commit 0748c7c49b
3 changed files with 112 additions and 28 deletions
@@ -346,9 +346,11 @@ func (i *dotDotCommiterator) Next(ctx context.Context) (hash.Hash, *doltdb.Commi
}
}
// If not invisible, return commit. Otherwise get next commit
if !nextC.invisible {
return nextC.hash, nextC.commit, nil
}
return i.Next(ctx)
}
return hash.Hash{}, nil, io.EOF
@@ -161,35 +161,46 @@ func (ltf *LogTableFunction) WithExpressions(expression ...sql.Expression) (sql.
ltf.secondRevisionExpr = expression[1]
}
// validate the expressions
if err := ltf.validateRevisionExpressions(); err != nil {
return nil, err
}
return ltf, nil
}
func (ltf *LogTableFunction) validateRevisionExpressions() error {
if ltf.revisionExpr != nil {
if !sql.IsText(ltf.revisionExpr.Type()) {
return nil, sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr.String())
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr.String())
}
// Second revision must exist if first revision contains '^'
if ltf.secondRevisionExpr == nil && strings.Contains(ltf.revisionExpr.String(), "^") {
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr.String())
}
}
if ltf.secondRevisionExpr != nil {
// Neither revision expression can contain '..' if two revisions provided
if !sql.IsText(ltf.secondRevisionExpr.Type()) || strings.Contains(ltf.secondRevisionExpr.String(), "..") {
return nil, sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.secondRevisionExpr.String())
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.secondRevisionExpr.String())
}
if strings.Contains(ltf.revisionExpr.String(), "..") {
return nil, sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr)
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr)
}
}
if ltf.revisionExpr != nil && ltf.secondRevisionExpr != nil {
// Both revisions cannot contain '^'
if strings.Contains(ltf.revisionExpr.String(), "^") && strings.Contains(ltf.secondRevisionExpr.String(), "^") {
return nil, sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr)
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr)
}
// One revision must contain '^'
if !strings.Contains(ltf.revisionExpr.String(), "^") && !strings.Contains(ltf.secondRevisionExpr.String(), "^") {
return nil, sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr)
return sql.ErrInvalidArgumentDetails.New(ltf.FunctionName(), ltf.revisionExpr)
}
}
return ltf, nil
return nil
}
// RowIter implements the sql.Node interface
@@ -275,26 +286,26 @@ func (ltf *LogTableFunction) evaluateArguments() (string, string, error) {
// Gets revisionName and/or excludingRevisionName from sql expression
func getRevisionsFromExpr(ctx *sql.Context, expr sql.Expression, canDot bool) (string, string, error) {
commitVal, err := expr.Eval(ctx, nil)
revisionVal, err := expr.Eval(ctx, nil)
if err != nil {
return "", "", err
}
commitValStr, ok := commitVal.(string)
revisionValStr, ok := revisionVal.(string)
if !ok {
return "", "", fmt.Errorf("received '%v' when expecting revision string", commitVal)
return "", "", fmt.Errorf("received '%v' when expecting revision string", revisionVal)
}
if canDot && strings.Contains(commitValStr, "..") {
refs := strings.Split(commitValStr, "..")
if canDot && strings.Contains(revisionValStr, "..") {
refs := strings.Split(revisionValStr, "..")
return refs[1], refs[0], nil
}
if strings.Contains(commitValStr, "^") {
return "", strings.TrimPrefix(commitValStr, "^"), nil
if strings.Contains(revisionValStr, "^") {
return "", strings.TrimPrefix(revisionValStr, "^"), nil
}
return commitValStr, "", nil
return revisionValStr, "", nil
}
//------------------------------------
@@ -348,7 +359,7 @@ func NewDotDotLogTableFunctionRowIter(ctx *sql.Context, ddb *doltdb.DoltDB, comm
return nil, err
}
exHash, err := commit.HashOf()
exHash, err := excludingCommit.HashOf()
if err != nil {
return nil, err
}
@@ -4972,26 +4972,42 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
Query: "SELECT * from dolt_log(@Commit1, 123);",
ExpectedErr: sql.ErrInvalidArgumentDetails,
},
// {
// Query: "SELECT * from dolt_log(@Commit1..@Commit2, @Commit1);",
// ExpectedErr: sql.ErrInvalidArgumentDetails,
// },
// {
// Query: "SELECT * from dolt_log(@Commit1, @Commit1..@Commit2);",
// ExpectedErr: sql.ErrInvalidArgumentDetails,
// },
{
Query: "SELECT * from dolt_log('main..branch1', @Commit1);",
ExpectedErr: sql.ErrInvalidArgumentDetails,
},
{
Query: "SELECT * from dolt_log(@Commit1, 'main..branch1');",
ExpectedErr: sql.ErrInvalidArgumentDetails,
},
{
Query: "SELECT * from dolt_log(@Commit1, @Commit2);",
ExpectedErr: sql.ErrInvalidArgumentDetails,
},
// {
// Query: "SELECT * from dolt_log(^@Commit1, ^@Commit2);",
// ExpectedErr: sql.ErrInvalidArgumentDetails,
// },
{
Query: "SELECT * from dolt_log('^main', '^branch1');",
ExpectedErr: sql.ErrInvalidArgumentDetails,
},
{
Query: "SELECT * from dolt_log('^main');",
ExpectedErr: sql.ErrInvalidArgumentDetails,
},
{
Query: "SELECT * from dolt_log('fake-branch');",
ExpectedErrStr: "branch not found: fake-branch",
},
{
Query: "SELECT * from dolt_log('^fake-branch', 'main');",
ExpectedErrStr: "branch not found: fake-branch",
},
{
Query: "SELECT * from dolt_log('fake-branch', '^main');",
ExpectedErrStr: "branch not found: fake-branch",
},
{
Query: "SELECT * from dolt_log('main..fake-branch');",
ExpectedErrStr: "branch not found: fake-branch",
},
{
Query: "SELECT * from dolt_log(concat('fake', '-', 'branch'));",
ExpectedErr: sqle.ErrInvalidNonLiteralArgument,
@@ -5046,10 +5062,65 @@ var LogTableFunctionScriptTests = []queries.ScriptTest{
Query: "SELECT count(*) from dolt_log('new-branch');",
Expected: []sql.Row{{5}},
},
},
},
{
Name: "basic case with more than one revision or revision range",
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');",
"insert into t values(1, 'one', 'two'), (2, 'two', 'three');",
"set @Commit2 = dolt_commit('-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');",
"insert into t values (4, 'four', 'five');",
"set @Commit4 = dolt_commit('-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');",
},
Assertions: []queries.ScriptTestAssertion{
{
Query: "SELECT count(*) from dolt_log('^main', 'new-branch');",
Expected: []sql.Row{{2}},
},
{
Query: "SELECT count(*) from dolt_log('main..new-branch');",
Expected: []sql.Row{{2}},
},
{
Query: "SELECT count(*) from dolt_log('new-branch', '^main');",
Expected: []sql.Row{{2}},
},
{
Query: "SELECT count(*) from dolt_log('^new-branch', 'main');",
Expected: []sql.Row{{1}},
},
{
Query: "SELECT count(*) from dolt_log('^main', 'main');",
Expected: []sql.Row{{0}},
},
{
Query: "SELECT count(*) from dolt_log('^main~', 'main');",
Expected: []sql.Row{{1}},
},
{
Query: "SELECT count(*) from dolt_log('^main', @Commit3);",
Expected: []sql.Row{{1}},
},
{
Query: "SELECT count(*) from dolt_log('^new-branch', @Commit5);",
Expected: []sql.Row{{1}},
},
{
Query: "SELECT count(*) from dolt_log('main..new-branch');",
Expected: []sql.Row{{2}},
},
},
},
{