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
- Simplify the SET expression to a literal, bind variable, or supported arithmetic expression
- Compute the value in the application and pass it as a bind variable
- Check the evalengine's supported expression set for the Vitess version and avoid unsupported constructs
- 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
- Assign literals or bind variables to vindex columns, not subqueries/exotic functions
- Compute complex values in the application before the UPDATE
- Test SET expressions against your Vitess version's evalengine support
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.