{"record":{"id":"6de7a562104017ca","repo":"vitessio/vitess","slug":"invalidupdateexpr","errorCode":null,"errorMessage":"invalidUpdateExpr(...)","messagePattern":"invalidUpdateExpr\\(\\.\\.\\.\\)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/vt/vtgate/planbuilder/operators/update.go","lineNumber":1136,"sourceCode":"\tcompExprs []sqlparser.Expr,\n) ([]string, []sqlparser.Expr) {\n\t// Searching in order of columns in colvindex.\n\tfound := false\n\tfor _, assignment := range assignments {\n\t\tif !vcol.Equal(assignment.Name.Name) {\n\t\t\tcontinue\n\t\t}\n\t\tif found {\n\t\t\tpanic(vterrors.VT03015(assignment.Name.Name))\n\t\t}\n\t\tfound = true\n\t\tpv, err := evalengine.Translate(assignment.Expr.EvalExpr, &evalengine.Config{\n\t\t\tResolveType: ctx.TypeForExpr,\n\t\t\tCollation:   ctx.SemTable.Collation,\n\t\t\tEnvironment: ctx.VSchema.Environment(),\n\t\t})\n\t\tif err != nil {\n\t\t\tpanic(invalidUpdateExpr(assignment.Name.Name.String(), assignment.Expr.EvalExpr))\n\t\t}\n\n\t\tif assignment.Expr.Info != nil {\n\t\t\tsqe, ok := assignment.Expr.Info.(SubQueryExpression)\n\t\t\tif ok {\n\t\t\t\tfor _, sq := range sqe {\n\t\t\t\t\tsubQueriesArgOnChangedVindex = append(subQueriesArgOnChangedVindex, sq.ArgName)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvindexValueMap[vcol.String()] = pv\n\t\tcompExprs = append(compExprs, sqlparser.NewComparisonExpr(sqlparser.EqualOp, assignment.Name, assignment.Expr.EvalExpr, nil))\n\t}\n\treturn subQueriesArgOnChangedVindex, compExprs\n}\n\nfunc invalidUpdateExpr(upd string, expr sqlparser.Expr) error {","sourceCodeStart":1118,"sourceCodeEnd":1154,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/vtgate/planbuilder/operators/update.go#L1118-L1154","documentation":"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.","triggerScenarios":"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.","commonSituations":"SET vindex_col = some_subquery or exotic expression; using expressions with unsupported collations/types; prepared statements with untranslatable placeholders.","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"],"exampleFix":"// before\nUPDATE t SET vk = (SELECT MAX(x) FROM other) WHERE id = 3;\n// after (app computes value first)\nUPDATE t SET vk = :new_vk WHERE id = 3;","handlingStrategy":"validation","validationCode":"// pre-validate SET expressions for vindex columns\nfor _, a := range setExpressions {\n    if _, err := evalengine.Translate(a.Expr, cfg); err != nil {\n        return fmt.Errorf(\"SET expression for %s unsupported: %v\", a.Name, err)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"invalid update expression\") {\n    // fall back to computing the value client-side and rebinding\n}","preventionTips":["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"],"tags":["vitess","vtgate","evalengine","update","expression"],"backgroundTag":"invalid-update-expression","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}