Skip to content

Commit eafe6fe

Browse files
authored
Merge pull request #1786 from dolthub/fix/schema-diff-working-ref
Resolve WORKING/STAGED in dolt_schema_diff
2 parents a8e5528 + 099ca9e commit eafe6fe

3 files changed

Lines changed: 74 additions & 15 deletions

File tree

‎src/doltlite_schema_diff.c‎

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -733,24 +733,13 @@ static int sdResolveOne(
733733
const char *zWhich,
734734
ProllyHash *pCatHash
735735
){
736-
ProllyHash commitHash;
737-
int rc;
738-
739-
rc = doltliteResolveRef(db, zRef, &commitHash);
736+
int rc = doltliteResolveCatalogHashForRef(db, zRef, pCatHash);
740737
if( rc!=SQLITE_OK ){
741738
sqlite3_free(pVtab->zErrMsg);
742739
pVtab->zErrMsg = sqlite3_mprintf(
743740
"dolt_schema_diff: %s '%s' could not be resolved", zWhich, zRef);
744741
return SQLITE_ERROR;
745742
}
746-
rc = doltliteCommitCatalogHash(db, &commitHash, pCatHash);
747-
if( rc!=SQLITE_OK ){
748-
sqlite3_free(pVtab->zErrMsg);
749-
pVtab->zErrMsg = sqlite3_mprintf(
750-
"dolt_schema_diff: %s '%s' resolved to a hash but the "
751-
"commit could not be loaded", zWhich, zRef);
752-
return SQLITE_ERROR;
753-
}
754743
return SQLITE_OK;
755744
}
756745

@@ -829,12 +818,23 @@ static int sdParseArgs(
829818
return SQLITE_NOMEM;
830819
}
831820

832-
rc = doltliteResolveRef(db, zRangeFrom, &probe);
833-
if( rc==SQLITE_OK ) rc = doltliteResolveRef(db, zRangeTo, &probe);
821+
rc = doltliteResolveCatalogHashForRef(db, zRangeFrom, &probe);
822+
if( rc==SQLITE_OK ){
823+
rc = doltliteResolveCatalogHashForRef(db, zRangeTo, &probe);
824+
if( rc!=SQLITE_OK ){
825+
sqlite3_free(pVtab->zErrMsg);
826+
pVtab->zErrMsg = sqlite3_mprintf(
827+
"dolt_schema_diff: to_ref '%s' could not be resolved", zRangeTo);
828+
}
829+
}else{
830+
sqlite3_free(pVtab->zErrMsg);
831+
pVtab->zErrMsg = sqlite3_mprintf(
832+
"dolt_schema_diff: from_ref '%s' could not be resolved", zRangeFrom);
833+
}
834834
if( rc!=SQLITE_OK ){
835835
sqlite3_free(zRangeFrom);
836836
sqlite3_free(zRangeTo);
837-
return rc;
837+
return SQLITE_ERROR;
838838
}
839839

840840
zFromRef = zRangeFrom;

‎test/doltlite_schema_diff.sh‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,14 @@ run_test_match "bad_to_ref_errors" \
6161
run_test_match "bad_single_arg_errors" \
6262
"SELECT count(*) FROM dolt_schema_diff('definitely_not_a_ref');" \
6363
"Error" "$DB"
64+
# A malformed range endpoint must name the unresolvable ref, not emit a
65+
# generic error, matching the two-arg form.
66+
run_test_match "bad_range_from_names_endpoint" \
67+
"SELECT count(*) FROM dolt_schema_diff('does-not-exist..HEAD');" \
68+
"from_ref 'does-not-exist' could not be resolved" "$DB"
69+
run_test_match "bad_range_to_names_endpoint" \
70+
"SELECT count(*) FROM dolt_schema_diff('HEAD..does-not-exist');" \
71+
"to_ref 'does-not-exist' could not be resolved" "$DB"
6472

6573
rm -f "$DB"
6674

@@ -386,4 +394,26 @@ run_test_match "rebase_replay_u_to_stmt" \
386394

387395
rm -f "$DB"
388396

397+
# WORKING / STAGED pseudo-refs must resolve like the other dolt_* surfaces.
398+
# Before the catalog-aware resolver fix, schema_diff only accepted commit refs,
399+
# so HEAD/WORKING (and HEAD..WORKING, HEAD/STAGED) errored with
400+
# "to_ref 'WORKING' could not be resolved".
401+
DB=/tmp/test_sd_working_$$.db; rm -f "$DB"
402+
echo "CREATE TABLE t(id INTEGER PRIMARY KEY, v TEXT);
403+
INSERT INTO t VALUES(1,'a');
404+
SELECT dolt_commit('-A','-m','c1');" | $DOLTLITE "$DB" > /dev/null 2>&1
405+
echo "CREATE TABLE w(id INTEGER PRIMARY KEY, x TEXT);" | $DOLTLITE "$DB" > /dev/null 2>&1
406+
407+
run_test "working_count" "SELECT count(*) FROM dolt_schema_diff('HEAD','WORKING');" "1" "$DB"
408+
run_test "working_to_name" "SELECT to_table_name FROM dolt_schema_diff('HEAD','WORKING');" "w" "$DB"
409+
run_test "working_from_empty" "SELECT length(from_table_name) FROM dolt_schema_diff('HEAD','WORKING');" "0" "$DB"
410+
run_test "working_range_count" "SELECT count(*) FROM dolt_schema_diff('HEAD..WORKING');" "1" "$DB"
411+
run_test "working_self_empty" "SELECT count(*) FROM dolt_schema_diff('WORKING','WORKING');" "0" "$DB"
412+
413+
echo "SELECT dolt_add('-A');" | $DOLTLITE "$DB" > /dev/null 2>&1
414+
run_test "staged_count" "SELECT count(*) FROM dolt_schema_diff('HEAD','STAGED');" "1" "$DB"
415+
run_test "staged_to_name" "SELECT to_table_name FROM dolt_schema_diff('HEAD','STAGED');" "w" "$DB"
416+
417+
rm -f "$DB"
418+
389419
dltest_finish

‎test/vc_oracle_schema_diff_test.sh‎

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -906,6 +906,35 @@ filter_check() {
906906
filter_check "filter_by_index_name" "idx" "ROW|~|idx"
907907
filter_check "filter_by_owning_table" "t" ""
908908

909+
echo "--- WORKING / STAGED pseudo-refs ---"
910+
911+
oracle "working_added_table" "
912+
$SEED
913+
CREATE TABLE u(id INTEGER PRIMARY KEY, x TEXT);
914+
" "HEAD" "WORKING"
915+
916+
oracle "working_dropped_table" "
917+
$SEED
918+
DROP TABLE t;
919+
" "HEAD" "WORKING"
920+
921+
oracle "working_no_change" "
922+
$SEED
923+
" "HEAD" "WORKING" "" "EXPECT_EMPTY"
924+
925+
oracle "staged_added_table" "
926+
$SEED
927+
CREATE TABLE u(id INTEGER PRIMARY KEY, x TEXT);
928+
SELECT dolt_add('-A');
929+
" "HEAD" "STAGED"
930+
931+
oracle "staged_to_working" "
932+
$SEED
933+
CREATE TABLE u(id INTEGER PRIMARY KEY, x TEXT);
934+
SELECT dolt_add('-A');
935+
CREATE TABLE w2(id INTEGER PRIMARY KEY);
936+
" "STAGED" "WORKING"
937+
909938
echo ""
910939
echo "=== Results: $pass passed, $fail failed ==="
911940
if [ $fail -gt 0 ]; then

0 commit comments

Comments
 (0)