vitessio/vitess · error

invalidUpdateExpr(...)

Error message

invalidUpdateExpr(...)

What it means

An expression in the UPDATE's SET clause for a vindex column could not be translated to the evalengine (invalidUpdateExpr). The expression type is unsupported for vindex value evaluation, so planning panics.

Source

Thrown at go/vt/vtgate/planbuilder/operators/update.go:1136

	compExprs []sqlparser.Expr,
) ([]string, []sqlparser.Expr) {
	// Searching in order of columns in colvindex.
	found := false
	for _, assignment := range assignments {
		if !vcol.Equal(assignment.Name.Name) {
			continue
		}
		if found {
			panic(vterrors.VT03015(assignment.Name.Name))
		}
		found = true
		pv, err := evalengine.Translate(assignment.Expr.EvalExpr, &evalengine.Config{
			ResolveType: ctx.TypeForExpr,
			Collation:   ctx.SemTable.Collation,
			Environment: ctx.VSchema.Environment(),
		})
		if err != nil {
			panic(invalidUpdateExpr(assignment.Name.Name.String(), assignment.Expr.EvalExpr))
		}

		if assignment.Expr.Info != nil {
			sqe, ok := assignment.Expr.Info.(SubQueryExpression)
			if ok {
				for _, sq := range sqe {
					subQueriesArgOnChangedVindex = append(subQueriesArgOnChangedVindex, sq.ArgName)
				}
			}
		}

		vindexValueMap[vcol.String()] = pv
		compExprs = append(compExprs, sqlparser.NewComparisonExpr(sqlparser.EqualOp, assignment.Name, assignment.Expr.EvalExpr, nil))
	}
	return subQueriesArgOnChangedVindex, compExprs
}

func invalidUpdateExpr(upd string, expr sqlparser.Expr) error {

View on GitHub (pinned to 01a25a7d17)

Solutions

  1. Simplify the SET expression to a literal, bind variable, or supported arithmetic expression
  2. Compute the value in the application and pass it as a bind variable
  3. Check the evalengine's supported expression set for the Vitess version and avoid unsupported constructs
  4. If a valid expression is rejected, file a Vitess bug with the query

Example fix

// before
UPDATE t SET vk = (SELECT MAX(x) FROM other) WHERE id = 3;
// after (app computes value first)
UPDATE t SET vk = :new_vk WHERE id = 3;
Defensive patterns

Strategy: validation

Validate before calling

// pre-validate SET expressions for vindex columns
for _, a := range setExpressions {
    if _, err := evalengine.Translate(a.Expr, cfg); err != nil {
        return fmt.Errorf("SET expression for %s unsupported: %v", a.Name, err)
    }
}

Try / catch

if err != nil && strings.Contains(err.Error(), "invalid update expression") {
    // fall back to computing the value client-side and rebinding
}

Prevention

When it happens

Trigger: evalengine.Translate fails on an assignment expression (assignment.Expr.EvalExpr) for a vindex column in createAssignmentExpressions — e.g. unsupported functions, subqueries, or typed expressions the engine cannot handle.

Common situations: SET vindex_col = some_subquery or exotic expression; using expressions with unsupported collations/types; prepared statements with untranslatable placeholders.

Related errors


AI-assisted analysis of vitessio/vitess@01a25a7d17 (2026-09-01). Data as JSON: /api/errors/6de7a562104017ca. Report an issue: GitHub.