Properly handle IS (NOT) NULL in dolt_diff_ and dolt_commit_diff_ table lookups.

This commit is contained in:
Nick Tobey
2025-07-09 22:09:32 -07:00
parent ab0352f601
commit 34bba425f8
3 changed files with 102 additions and 2 deletions
@@ -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():
@@ -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"},
},
},
},
},
{
+4
View File
@@ -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]
}