mirror of
https://github.com/dolthub/dolt.git
synced 2026-02-11 18:49:14 -06:00
Merge pull request #5503 from dolthub/macneale4/dolt-diff-schema-table-2
Display DDL for views and triggers in dolt diff
This commit is contained in:
@@ -22,6 +22,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
textdiff "github.com/andreyvit/diff"
|
||||
"github.com/dolthub/go-mysql-server/sql"
|
||||
"github.com/dolthub/go-mysql-server/sql/types"
|
||||
|
||||
@@ -293,14 +294,14 @@ func (dArgs *diffArgs) applyDiffRoots(ctx context.Context, dEnv *env.DoltEnv, ar
|
||||
}
|
||||
|
||||
dArgs.fromRoot = stagedRoot
|
||||
dArgs.fromRef = "STAGED"
|
||||
dArgs.fromRef = doltdb.Staged
|
||||
dArgs.toRoot = workingRoot
|
||||
dArgs.toRef = "WORKING"
|
||||
dArgs.toRef = doltdb.Working
|
||||
if isCached {
|
||||
dArgs.fromRoot = headRoot
|
||||
dArgs.fromRef = "HEAD"
|
||||
dArgs.toRoot = stagedRoot
|
||||
dArgs.toRef = "STAGED"
|
||||
dArgs.toRef = doltdb.Staged
|
||||
}
|
||||
|
||||
if len(args) == 0 {
|
||||
@@ -501,12 +502,12 @@ func diffUserTables(ctx context.Context, dEnv *env.DoltEnv, dArgs *diffArgs) err
|
||||
return errhand.BuildDError("error: unable to diff tables").AddCause(err).Build()
|
||||
}
|
||||
|
||||
engine, dbName, err := engine.NewSqlEngineForEnv(ctx, dEnv)
|
||||
sqlEng, dbName, err := engine.NewSqlEngineForEnv(ctx, dEnv)
|
||||
if err != nil {
|
||||
return errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
|
||||
sqlCtx, err := engine.NewLocalContext(ctx)
|
||||
sqlCtx, err := sqlEng.NewLocalContext(ctx)
|
||||
if err != nil {
|
||||
return errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
@@ -526,9 +527,20 @@ func diffUserTables(ctx context.Context, dEnv *env.DoltEnv, dArgs *diffArgs) err
|
||||
}
|
||||
|
||||
for _, td := range tableDeltas {
|
||||
verr := diffUserTable(sqlCtx, td, engine, dArgs, dw)
|
||||
if verr != nil {
|
||||
return verr
|
||||
if !dArgs.tableSet.Contains(td.FromName) && !dArgs.tableSet.Contains(td.ToName) {
|
||||
continue
|
||||
}
|
||||
if strings.ToLower(td.ToName) != doltdb.SchemasTableName {
|
||||
verr := diffUserTable(sqlCtx, td, sqlEng, dArgs, dw)
|
||||
if verr != nil {
|
||||
return verr
|
||||
}
|
||||
} else {
|
||||
// dolt_schemas table is treated as a special case. diff the rows of the table, and print fragments as DDL
|
||||
verr := diffDoltSchemasTable(sqlCtx, td, sqlEng, dArgs, dw)
|
||||
if verr != nil {
|
||||
return verr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -543,14 +555,10 @@ func diffUserTables(ctx context.Context, dEnv *env.DoltEnv, dArgs *diffArgs) err
|
||||
func diffUserTable(
|
||||
ctx *sql.Context,
|
||||
td diff.TableDelta,
|
||||
engine *engine.SqlEngine,
|
||||
sqlEng *engine.SqlEngine,
|
||||
dArgs *diffArgs,
|
||||
dw diffWriter,
|
||||
) errhand.VerboseError {
|
||||
if !dArgs.tableSet.Contains(td.FromName) && !dArgs.tableSet.Contains(td.ToName) {
|
||||
return nil
|
||||
}
|
||||
|
||||
fromTable := td.FromTable
|
||||
toTable := td.ToTable
|
||||
|
||||
@@ -585,7 +593,7 @@ func diffUserTable(
|
||||
fromSch = toSch
|
||||
}
|
||||
|
||||
verr := diffRows(ctx, engine, td, dArgs, dw)
|
||||
verr := diffRows(ctx, sqlEng, td, dArgs, dw)
|
||||
if verr != nil {
|
||||
return verr
|
||||
}
|
||||
@@ -593,6 +601,50 @@ func diffUserTable(
|
||||
return nil
|
||||
}
|
||||
|
||||
func diffDoltSchemasTable(
|
||||
sqlCtx *sql.Context,
|
||||
td diff.TableDelta,
|
||||
sqlEng *engine.SqlEngine,
|
||||
dArgs *diffArgs,
|
||||
dw diffWriter,
|
||||
) errhand.VerboseError {
|
||||
err := dw.BeginTable(sqlCtx, td)
|
||||
if err != nil {
|
||||
return errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
|
||||
query := fmt.Sprintf("select from_fragment,to_fragment from dolt_diff('%s','%s','%s')", dArgs.fromRef, dArgs.toRef, doltdb.SchemasTableName)
|
||||
|
||||
_, rowIter, err := sqlEng.Query(sqlCtx, query)
|
||||
if err != nil {
|
||||
return errhand.BuildDError("Error running diff query:\n%s", query).AddCause(err).Build()
|
||||
}
|
||||
|
||||
defer rowIter.Close(sqlCtx)
|
||||
for {
|
||||
row, err := rowIter.Next(sqlCtx)
|
||||
if err == io.EOF {
|
||||
break
|
||||
} else if err != nil {
|
||||
return errhand.VerboseErrorFromError(err)
|
||||
}
|
||||
|
||||
from := ""
|
||||
if row[0] != nil {
|
||||
from = fmt.Sprintf("%v;", row[0])
|
||||
}
|
||||
to := ""
|
||||
if row[1] != nil {
|
||||
to = fmt.Sprintf("%v;", row[1])
|
||||
}
|
||||
if from != to {
|
||||
cli.Println(textdiff.LineDiff(from, to))
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func writeSqlSchemaDiff(ctx context.Context, td diff.TableDelta, toSchemas map[string]schema.Schema) errhand.VerboseError {
|
||||
ddlStatements, err := diff.SqlSchemaDiff(ctx, td, toSchemas)
|
||||
if err != nil {
|
||||
@@ -608,7 +660,7 @@ func writeSqlSchemaDiff(ctx context.Context, td diff.TableDelta, toSchemas map[s
|
||||
|
||||
func diffRows(
|
||||
ctx *sql.Context,
|
||||
se *engine.SqlEngine,
|
||||
sqlEng *engine.SqlEngine,
|
||||
td diff.TableDelta,
|
||||
dArgs *diffArgs,
|
||||
dw diffWriter,
|
||||
@@ -685,7 +737,7 @@ func diffRows(
|
||||
query += " limit " + strconv.Itoa(dArgs.limit)
|
||||
}
|
||||
|
||||
sch, rowIter, err := se.Query(ctx, query)
|
||||
sch, rowIter, err := sqlEng.Query(ctx, query)
|
||||
if sql.ErrSyntaxError.Is(err) {
|
||||
return errhand.BuildDError("Failed to parse diff query. Invalid where clause?\nDiff query: %s", query).AddCause(err).Build()
|
||||
} else if err != nil {
|
||||
@@ -724,7 +776,7 @@ func diffRows(
|
||||
if err != nil {
|
||||
return errhand.BuildDError("Error closing row iterator:\n%s", query).AddCause(err).Build()
|
||||
}
|
||||
_, rowIter, err = se.Query(ctx, query)
|
||||
_, rowIter, err = sqlEng.Query(ctx, query)
|
||||
defer rowIter.Close(ctx)
|
||||
if sql.ErrSyntaxError.Is(err) {
|
||||
return errhand.BuildDError("Failed to parse diff query. Invalid where clause?\nDiff query: %s", query).AddCause(err).Build()
|
||||
|
||||
@@ -374,7 +374,7 @@ SQL
|
||||
dolt commit -am "First commit"
|
||||
|
||||
dolt sql <<SQL
|
||||
alter table test
|
||||
alter table test
|
||||
drop column c2,
|
||||
add column c3 varchar(10);
|
||||
insert into test values (7,8,9);
|
||||
@@ -410,7 +410,7 @@ EOF
|
||||
run dolt diff --data --schema
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "$EXPECTED" ]] || false
|
||||
|
||||
|
||||
run dolt diff --schema
|
||||
|
||||
EXPECTED=$(cat <<'EOF'
|
||||
@@ -427,7 +427,7 @@ EOF
|
||||
[[ "$output" =~ "$EXPECTED" ]] || false
|
||||
# Count the line numbers to make sure there are no data changes output
|
||||
[ "${#lines[@]}" -eq 10 ]
|
||||
|
||||
|
||||
run dolt diff --data
|
||||
EXPECTED=$(cat <<'EOF'
|
||||
+---+----+-----+------+------+
|
||||
@@ -465,16 +465,16 @@ EOF
|
||||
dolt commit -am "First commit"
|
||||
|
||||
dolt sql <<SQL
|
||||
alter table test
|
||||
drop column c3,
|
||||
add column c6 varchar(10) after c2,
|
||||
alter table test
|
||||
drop column c3,
|
||||
add column c6 varchar(10) after c2,
|
||||
modify column c4 tinyint comment 'new comment'
|
||||
SQL
|
||||
|
||||
dolt diff
|
||||
run dolt diff
|
||||
[ "$status" -eq 0 ]
|
||||
|
||||
|
||||
EXPECTED=$(cat <<'EOF'
|
||||
CREATE TABLE `test` (
|
||||
`pk` bigint NOT NULL COMMENT 'tag:0',
|
||||
@@ -735,7 +735,7 @@ ALTER TABLE test DROP FOREIGN KEY fk1;
|
||||
ALTER TABLE parent DROP INDEX c1;
|
||||
ALTER TABLE test ADD CONSTRAINT fk2 FOREIGN KEY (c2) REFERENCES parent(c2);
|
||||
SQL
|
||||
|
||||
|
||||
dolt diff test
|
||||
run dolt diff test
|
||||
[ "$status" -eq 0 ]
|
||||
@@ -767,7 +767,7 @@ SQL
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "222" ]] || false
|
||||
! [[ "$output" =~ "333" ]] || false
|
||||
|
||||
|
||||
dolt add test
|
||||
dolt commit -m "added two rows"
|
||||
|
||||
@@ -797,7 +797,7 @@ SQL
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "44" ]] || false
|
||||
[[ "$output" =~ "55" ]] || false
|
||||
|
||||
|
||||
run dolt diff test1 test2 --where "from_pk=4"
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "44" ]] || false
|
||||
@@ -833,7 +833,7 @@ SQL
|
||||
[ "$status" -eq 0 ]
|
||||
[[ "$output" =~ "44" ]] || false
|
||||
[[ "$output" =~ "55" ]] || false
|
||||
|
||||
|
||||
run dolt diff test1..test2 --where "pk=4"
|
||||
[ "$status" -eq 1 ]
|
||||
[[ "$output" =~ "Error running diff query" ]] || false
|
||||
@@ -876,7 +876,7 @@ SQL
|
||||
dolt add test
|
||||
run dolt diff --cached
|
||||
[ $status -eq 0 ]
|
||||
[[ $output =~ "added table" ]] || false
|
||||
[[ $output =~ "added table" ]] || false
|
||||
|
||||
dolt commit -m "First commit"
|
||||
dolt sql -q "insert into test values (0, 0, 0, 0, 0, 0)"
|
||||
@@ -1143,7 +1143,7 @@ SQL
|
||||
}
|
||||
|
||||
@test "diff: keyless sql diffs" {
|
||||
|
||||
|
||||
dolt sql -q "create table t(pk int, val int)"
|
||||
dolt add .
|
||||
dolt commit -am "cm1"
|
||||
@@ -1212,7 +1212,7 @@ SQL
|
||||
dolt commit -am "creating table"
|
||||
|
||||
dolt sql -q "alter table t add primary key (pk)"
|
||||
|
||||
|
||||
run dolt diff -r sql
|
||||
[ $status -eq 0 ]
|
||||
[ "${lines[0]}" = 'ALTER TABLE `t` DROP PRIMARY KEY;' ]
|
||||
@@ -1224,7 +1224,7 @@ SQL
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ '+ PRIMARY KEY (`pk`)' ]] || false
|
||||
[[ "$output" =~ "Primary key sets differ between revisions for table 't', skipping data diff" ]] || false
|
||||
|
||||
|
||||
|
||||
dolt commit -am 'added primary key'
|
||||
|
||||
@@ -1418,7 +1418,7 @@ EOF
|
||||
[[ "$output" =~ "diff --dolt a/test2 b/test2" ]] || false
|
||||
[[ "$output" =~ "--- a/test2 @" ]] || false
|
||||
[[ "$output" =~ "+++ b/test2 @" ]] || false
|
||||
|
||||
|
||||
run dolt diff --limit
|
||||
[ "$status" -ne 0 ]
|
||||
}
|
||||
@@ -1489,3 +1489,51 @@ EOF
|
||||
[ $status -eq 0 ]
|
||||
[[ ! "$output" =~ "1 Row Modified" ]] || false
|
||||
}
|
||||
|
||||
@test "diff: dolt_schema table changes are special" {
|
||||
dolt sql <<SQL
|
||||
CREATE TABLE people (name varchar(255), nickname varchar(255), gender varchar(255), age int);
|
||||
CREATE TABLE average_age (average double);
|
||||
CREATE TRIGGER avg_age AFTER INSERT ON people
|
||||
for each row
|
||||
update average_age set average = (SELECT AVG(age) FROM people);
|
||||
SQL
|
||||
dolt add .
|
||||
dolt commit -m "commit 1"
|
||||
|
||||
dolt sql <<SQL
|
||||
CREATE VIEW adults AS SELECT name FROM people WHERE age >= 18;
|
||||
DROP TRIGGER avg_age;
|
||||
CREATE TRIGGER avg_age AFTER INSERT ON people
|
||||
FOR EACH ROW
|
||||
update average_age set average = (SELECT AVG(age) FROM people);
|
||||
SQL
|
||||
dolt add .
|
||||
dolt commit -m "commit 2"
|
||||
|
||||
run dolt diff HEAD~1 HEAD
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "CREATE TRIGGER avg_age AFTER INSERT ON people" ]] || false
|
||||
[[ "$output" =~ "- for each row" ]] || false
|
||||
[[ "$output" =~ "+ FOR EACH ROW" ]] || false
|
||||
[[ "$output" =~ " update average_age set average = (SELECT AVG(age) FROM people);" ]] || false
|
||||
[[ "$output" =~ "+CREATE VIEW adults AS SELECT name FROM people WHERE age >= 18;" ]] || false
|
||||
|
||||
dolt sql <<SQL
|
||||
DROP VIEW adults;
|
||||
CREATE VIEW adults AS SELECT nickname FROM people WHERE age >= 18;
|
||||
DROP TRIGGER avg_age;
|
||||
SQL
|
||||
dolt add .
|
||||
dolt commit -m "commit 3"
|
||||
|
||||
run dolt diff HEAD~1 HEAD
|
||||
[ $status -eq 0 ]
|
||||
[[ "$output" =~ "-CREATE TRIGGER avg_age AFTER INSERT ON people" ]] || false
|
||||
[[ "$output" =~ "- FOR EACH ROW" ]] || false
|
||||
[[ "$output" =~ "- update average_age set average = (SELECT AVG(age) FROM people);" ]] || false
|
||||
[[ "$output" =~ "-CREATE VIEW adults AS SELECT name FROM people WHERE age >= 18;" ]] || false
|
||||
[[ "$output" =~ "+CREATE VIEW adults AS SELECT nickname FROM people WHERE age >= 18;" ]] || false
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user