gastownhall/beads · error
conflict table dolt_conflicts_%s has no our_%s/their_%s colu
Error message
conflict table dolt_conflicts_%s has no our_%s/their_%s column
What it means
resolveOneConflictRow could not find the expected our_<keyCol> and/or their_<keyCol> columns in the scanned conflict row. Dolt's conflict tables expose each side's key as our_/their_-prefixed columns; their absence means the conflict table shape differs from what row-level resolution requires (schema drift, dolt version difference, or a corrupted conflict table). Row-level resolution cannot proceed without both key values.
Source
Thrown at internal/storage/versioncontrolops/conflicts.go:377
q := fmt.Sprintf("SELECT COUNT(*) FROM `%s` WHERE `%s` = ?", table, keyCol)
var n int
if err := db.QueryRowContext(ctx, q, key).Scan(&n); err != nil {
return false, err
}
return n > 0, nil
}
// resolveOneConflictRow applies strategy to a single modify/modify row.
//
// "ours" is dolt's manual-resolution path: the working set already holds our
// values, so deleting the conflict row *is* the resolution. "theirs" first
// writes their values over ours, then deletes the conflict row — the order
// matters, since the delete is what tells dolt the row is settled.
func resolveOneConflictRow(ctx context.Context, db DBConn, table, keyCol, key, strategy string, row rawConflictRow) error {
ourKey, ourOK := row.value("our", keyCol)
theirKey, theirOK := row.value("their", keyCol)
if !ourOK || !theirOK {
return fmt.Errorf("conflict table dolt_conflicts_%s has no our_%s/their_%s column", table, keyCol, keyCol)
}
if ourKey == nil || theirKey == nil {
// delete/modify (one side removed the row) or add/add against a
// missing key: refuse by name. Row-level ours/theirs would silently
// resurrect or destroy a row the operator never looked at.
return fmt.Errorf("conflict for %s %s is not a modify/modify conflict (one side has no row); "+
"resolve it with a whole-table strategy or edit the row directly", table, key)
}
if strategy == ConflictStrategyTheirs {
names, vals := row.theirFields(keyCol)
if len(names) == 0 {
return fmt.Errorf("conflict for %s %s carries no their_* data columns", table, key)
}
sets := make([]string, len(names))
args := make([]any, 0, len(names)+1)
for i, n := range names {
// Column names are interpolated (MySQL cannot bind anView on GitHub (pinned to 71377f2769)
Solutions
- Abort the merge (`CALL dolt_merge_conflicts_cleanup` / roll back) and redo the merge after schemas are aligned
- Check both branches' schemas: `SHOW CREATE TABLE` on base and both branches to spot the key-column divergence
- Upgrade or align the dolt version between peers before merging
- Resolve at whole-table level and then reconcile the key column manually
Example fix
null
Defensive patterns
Strategy: validation
Validate before calling
// confirm both key columns exist before row-level resolution
cols, _ := conflictTableColumns(ctx, db, table)
if !slices.Contains(cols, "our_"+keyCol) || !slices.Contains(cols, "their_"+keyCol) {
return fmt.Errorf("key column %s diverged between branches; reconcile schema first", keyCol)
} Try / catch
err := resolveOne(ctx, db, table, keyCol, key, strategy)
if err != nil && strings.Contains(err.Error(), "has no our_") {
return abortMergeAndReconcileSchema(ctx, db, table)
}
return err Prevention
- Freeze schema changes while a merge with conflicts is open
- Compare branch schemas before pulling from peers
- Align dolt versions across all peers
- Recreate key columns via migrations, never ad-hoc renames mid-merge
When it happens
Trigger: ResolveConflictRows -> resolveOneConflictRow checks row.value("our", keyCol)/row.value("their", keyCol) after a `SELECT *` on dolt_conflicts_<table>; the returned column set lacks one of the key columns, e.g. after a schema merge that renamed/removed the key column or a dolt version with a different conflict-table layout.
Common situations: Peer merged a schema change that renamed the key column while a merge was open; upgrading dolt sql-server while conflicts exist; manually manipulating dolt_conflicts_<table> previously.
Related errors
- query conflicts for table %s: %w
- query conflict for %s %s: %w
- no live conflict for %s %s
- multiple conflict rows for %s %s; resolve the whole table in
- conflict for %s %s is not a modify/modify conflict (one side
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/c74408a1e63d9574.
Report an issue: GitHub.