This commit is contained in:
Andy Arthur
2020-06-18 17:09:14 -05:00
parent 31ac9edb80
commit c87927a40e
3 changed files with 29 additions and 11 deletions

View File

@@ -30,11 +30,14 @@ teardown() {
dolt sql -q 'insert into test values (0,0,"0"), (1,1,"1")'
dolt add .
dolt commit -m rows
dolt sql -q 'update test set c1 = 9 where pk = 0'
dolt sql -q 'delete from test where pk=1'
dolt sql -q 'insert into test values (2,2,"2")'
run dolt query_diff 'select * from test'
[ "$status" -eq 0 ]
[[ "$output" =~ "| | pk | c1 | c2 |" ]]
[[ "$output" =~ "| < | 1 | 1 | 1 |" ]]
[[ "$output" =~ "| > | 1 | 9 | 1 |" ]]
[[ "$output" =~ "| - | 1 | 1 | 1 |" ]]
[[ "$output" =~ "| + | 2 | 2 | 2 |" ]]
}

View File

@@ -51,28 +51,25 @@ func lazyQueryPlan(node sql.Node) (lazyNode sql.Node, projections []sql.Expressi
}
offset := 0
newChildren := make([]sql.Node, len(children))
lazyChildren := make([]sql.Node, len(children))
for i, c := range children {
c, pjs, err := lazyQueryPlan(c)
if err != nil {
return nil, nil, err
}
if len(c.Schema()) != len(pjs) {
return nil, nil, fmt.Errorf("node schema mismatched with node projections")
}
newChildren[i] = c
lazyChildren[i] = c
pjs = shiftFieldIndexes(pjs, offset)
projections = append(projections, pjs...)
offset += len(pjs)
}
lazyNode, err = node.WithChildren(newChildren...)
node, err = node.WithChildren(lazyChildren...)
if err != nil {
return nil, nil, err
}
lazyNode, err = plan.TransformExpressions(lazyNode, func(e sql.Expression) (sql.Expression, error) {
lazyNode, err = plan.TransformExpressions(node, func(e sql.Expression) (sql.Expression, error) {
return makeExpressionLazy(e, projections)
})
if err != nil {
@@ -84,7 +81,12 @@ func lazyQueryPlan(node sql.Node) (lazyNode sql.Node, projections []sql.Expressi
projections = p.Expressions()
}
return lazyNode, projections, err
err = validateProjections(lazyNode.Schema(), projections)
if err != nil {
return nil, nil, err
}
return lazyNode, projections, nil
}
func extractRowOrder(node sql.Node) (composite []plan.SortField) {
@@ -150,6 +152,19 @@ func shiftFieldIndexes(composite []sql.Expression, offset int) []sql.Expression
return shifted
}
func validateProjections(sch sql.Schema, projections []sql.Expression) error {
if len(sch) != len(projections) {
return fmt.Errorf("lazy node schema does not match lazy projections")
}
for i, col := range sch {
if col.Type != projections[i].Type() {
return fmt.Errorf("lazy node schema col type %s does not match lazy projection type %s",
col.Type.String(), projections[i].Type().String())
}
}
return nil
}
func errWithQueryPlan(ctx *sql.Context, eng *sqle.Engine, query string, cause error) error {
_, iter, err := eng.Query(ctx, fmt.Sprintf("describe %s", query))
if err != nil {

View File

@@ -16,7 +16,6 @@ package querydiff
import (
"context"
"errors"
"fmt"
"io"
"math"
@@ -39,8 +38,6 @@ const (
Unknown rowOrder = math.MaxInt8
)
var errSkip = errors.New("errSkip") // u lyk hax?
type rowOrder int8
type QueryDiffer struct {
@@ -108,6 +105,9 @@ func (qd *QueryDiffer) Start() {
func (qd *QueryDiffer) NextDiff() (fromRow sql.Row, toRow sql.Row, err error) {
for {
if qd.ae.IsSet() {
return nil, nil, qd.ae.Get()
}
if qd.from.isDone() && qd.to.isDone() {
return nil, nil, io.EOF
}