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 an

View on GitHub (pinned to 71377f2769)

Solutions

  1. Abort the merge (`CALL dolt_merge_conflicts_cleanup` / roll back) and redo the merge after schemas are aligned
  2. Check both branches' schemas: `SHOW CREATE TABLE` on base and both branches to spot the key-column divergence
  3. Upgrade or align the dolt version between peers before merging
  4. 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

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


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/c74408a1e63d9574. Report an issue: GitHub.