diff --git a/go/libraries/doltcore/sqle/dtables/diff_iter.go b/go/libraries/doltcore/sqle/dtables/diff_iter.go index 68ed1130af..054007c385 100644 --- a/go/libraries/doltcore/sqle/dtables/diff_iter.go +++ b/go/libraries/doltcore/sqle/dtables/diff_iter.go @@ -392,7 +392,13 @@ func (itr prollyDiffIter) queueRows(ctx context.Context) { } } for _, rng := range itr.ranges { - err := prolly.RangeDiffMaps(ctx, itr.from, itr.to, rng, cb) + var err error + // if the filter can match all NILs, then we need to return every added/removed diff + if rng.Matches(ctx, val.EmptyTuple) { + err = prolly.DiffMaps(ctx, itr.from, itr.to, false, cb) + } else { + err = prolly.RangeDiffMaps(ctx, itr.from, itr.to, rng, cb) + } if err != nil && err != io.EOF { select { case <-ctx.Done(): diff --git a/go/libraries/doltcore/sqle/enginetest/dolt_queries_diff.go b/go/libraries/doltcore/sqle/enginetest/dolt_queries_diff.go index 6cb9e28279..19689f622c 100644 --- a/go/libraries/doltcore/sqle/enginetest/dolt_queries_diff.go +++ b/go/libraries/doltcore/sqle/enginetest/dolt_queries_diff.go @@ -594,13 +594,14 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{ "set @Commit2 = '';", "CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'second commit');", "update t set c1 = 0 where pk > 5;", + "delete from t where pk = 1;", "set @Commit3 = '';", "CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'third commit');", }, Assertions: []queries.ScriptTestAssertion{ { Query: "SELECT COUNT(*) FROM DOLT_DIFF_t;", - Expected: []sql.Row{{4}}, + Expected: []sql.Row{{5}}, }, { Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_DIFF_t WHERE to_pk = 1 ORDER BY to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type;", @@ -608,6 +609,21 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{ {1, 2, 3, nil, nil, nil, "added"}, }, }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_DIFF_t WHERE to_pk IS NULL ORDER BY to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type;", + Expected: []sql.Row{ + {nil, nil, nil, 1, 2, 3, "removed"}, + }, + }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_DIFF_t WHERE to_pk IS NOT NULL ORDER BY to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type;", + Expected: []sql.Row{ + {1, 2, 3, nil, nil, nil, "added"}, + {4, 5, 6, nil, nil, nil, "added"}, + {7, 0, 9, 7, 8, 9, "modified"}, + {7, 8, 9, nil, nil, nil, "added"}, + }, + }, { Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_DIFF_t WHERE to_pk > 1 ORDER BY to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type;", Expected: []sql.Row{ @@ -618,6 +634,56 @@ var DiffSystemTableScriptTests = []queries.ScriptTest{ }, }, }, + { + Name: "selecting from_pk columns", + SetUpScript: []string{ + "create table t (pk int primary key, c1 int, c2 int);", + "call dolt_add('.')", + "insert into t values (1, 2, 3), (4, 5, 6);", + "set @Commit1 = '';", + "CALL DOLT_COMMIT_HASH_OUT(@Commit1, '-am', 'first commit');", + "insert into t values (7, 8, 9);", + "set @Commit2 = '';", + "CALL DOLT_COMMIT_HASH_OUT(@Commit2, '-am', 'second commit');", + "update t set c1 = 0 where pk > 5;", + "delete from t where pk = 1;", + "set @Commit3 = '';", + "CALL DOLT_COMMIT_HASH_OUT(@Commit3, '-am', 'third commit');", + }, + Assertions: []queries.ScriptTestAssertion{ + { + Query: "SELECT COUNT(*) FROM DOLT_DIFF_t;", + Expected: []sql.Row{{5}}, + }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_DIFF_t WHERE from_pk = 1 ORDER BY to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type;", + Expected: []sql.Row{ + {nil, nil, nil, 1, 2, 3, "removed"}, + }, + }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_DIFF_t WHERE from_pk IS NULL ORDER BY to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type;", + Expected: []sql.Row{ + {1, 2, 3, nil, nil, nil, "added"}, + {4, 5, 6, nil, nil, nil, "added"}, + {7, 8, 9, nil, nil, nil, "added"}, + }, + }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_DIFF_t WHERE from_pk IS NOT NULL ORDER BY to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type;", + Expected: []sql.Row{ + {nil, nil, nil, 1, 2, 3, "removed"}, + {7, 0, 9, 7, 8, 9, "modified"}, + }, + }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_DIFF_t WHERE from_pk > 1 ORDER BY to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type;", + Expected: []sql.Row{ + {7, 0, 9, 7, 8, 9, "modified"}, + }, + }, + }, + }, { Name: "selecting to_pk1 and to_pk2 columns", SetUpScript: []string{ @@ -5038,6 +5104,30 @@ var CommitDiffSystemTableScriptTests = []queries.ScriptTest{ {4, 5, 6, nil, nil, nil, "added"}, }, }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_COMMIT_DIFF_t WHERE TO_COMMIT=@Commit5 and FROM_COMMIT=@Commit0 AND from_pk IS NULL;", + Expected: []sql.Row{ + {4, 5, 6, nil, nil, nil, "added"}, + }, + }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_COMMIT_DIFF_t WHERE TO_COMMIT=@Commit5 and FROM_COMMIT=@Commit3 AND from_pk IS NOT NULL;", + Expected: []sql.Row{ + {nil, nil, nil, 1, 2, -1, "removed"}, + }, + }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_commit_DIFF_t WHERE TO_COMMIT=@Commit5 and FROM_COMMIT=@Commit4 AND to_pk IS NULL;", + Expected: []sql.Row{ + {nil, nil, nil, 1, 2, -2, "removed"}, + }, + }, + { + Query: "SELECT to_pk, to_c1, to_c2, from_pk, from_c1, from_c2, diff_type FROM DOLT_commit_DIFF_t WHERE TO_COMMIT=@Commit5 and FROM_COMMIT=@Commit0 AND to_pk IS NOT NULL;", + Expected: []sql.Row{ + {4, 5, 6, nil, nil, nil, "added"}, + }, + }, }, }, { diff --git a/go/store/val/tuple_descriptor.go b/go/store/val/tuple_descriptor.go index 9b1e582f68..d47dcfb886 100644 --- a/go/store/val/tuple_descriptor.go +++ b/go/store/val/tuple_descriptor.go @@ -160,6 +160,10 @@ func (td TupleDesc) PrefixDesc(n int) TupleDesc { // GetField returns the ith field of |tup|. func (td TupleDesc) GetField(i int, tup Tuple) []byte { if i < len(td.fast) { + cnt := tup.Count() + if i >= cnt { + return nil + } start, stop := td.fast[i][0], td.fast[i][1] return tup[start:stop] }