{"record":{"id":"bffef2dac1b4913b","repo":"vitessio/vitess","slug":"vt03014-bffef2","errorCode":"VT03014","errorMessage":"unknown column '%s' in '%s'","messagePattern":"unknown column '(.+?)' in '(.+?)'","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"go/vt/vtgate/planbuilder/operators/upsert.go","lineNumber":116,"sourceCode":"\t\t\t\texpr = pIdx.def\n\t\t\t} else {\n\t\t\t\texpr = row[pIdx.idx]\n\t\t\t}\n\t\t\tcomparisons = append(comparisons,\n\t\t\t\tsqlparser.NewComparisonExpr(sqlparser.EqualOp, sqlparser.NewColName(pIdx.col.String()), expr, nil))\n\t\t}\n\t\twhereExpr := sqlparser.AndExpressions(comparisons...)\n\n\t\tvar updExprs sqlparser.UpdateExprs\n\t\tfor _, ue := range ins.OnDup {\n\t\t\texpr := sqlparser.CopyOnRewrite(ue.Expr, nil, func(cursor *sqlparser.CopyOnWriteCursor) {\n\t\t\t\tvfExpr, ok := cursor.Node().(*sqlparser.ValuesFuncExpr)\n\t\t\t\tif !ok {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tidx := ins.Columns.FindColumn(vfExpr.Name.Name)\n\t\t\t\tif idx == -1 {\n\t\t\t\t\tpanic(vterrors.VT03014(sqlparser.String(vfExpr.Name), \"field list\"))\n\t\t\t\t}\n\t\t\t\tcursor.Replace(row[idx])\n\t\t\t}, nil).(sqlparser.Expr)\n\t\t\tupdExprs = append(updExprs, &sqlparser.UpdateExpr{\n\t\t\t\tName: ue.Name,\n\t\t\t\tExpr: expr,\n\t\t\t})\n\t\t}\n\n\t\tupd := &sqlparser.Update{\n\t\t\tComments:   ins.Comments,\n\t\t\tTableExprs: sqlparser.TableExprs{ins.Table},\n\t\t\tExprs:      updExprs,\n\t\t\tWhere:      sqlparser.NewWhere(sqlparser.WhereClause, whereExpr),\n\t\t}\n\t\tupdOp := createOpFromStmt(ctx, upd, false, \"\")\n\n\t\t// replan insert statement without on duplicate key update.","sourceCodeStart":98,"sourceCodeEnd":134,"githubUrl":"https://github.com/vitessio/vitess/blob/01a25a7d176f94613b8d59d799f438380a8760e4/go/vt/vtgate/planbuilder/operators/upsert.go#L98-L134","documentation":"Inside ON DUPLICATE KEY UPDATE, VALUES(col) references a column that is not present in the INSERT's column list. When Vitess rewrites VALUES(...) expressions to the actual row values, FindColumn returns -1 and it panics with VT03014 ('unknown column ... in field list').","triggerScenarios":"createUpsertOperator's CopyOnRewrite callback encounters a ValuesFuncExpr whose column name is not found in ins.Columns while expanding each values row.","commonSituations":"Typo in VALUES(col) name; column exists in the table but was omitted from the INSERT column list; dynamically generated upserts referencing the wrong column.","solutions":["Add the missing column to the INSERT's column list so VALUES(col) can resolve","Fix the column name typo inside VALUES(...)","Only reference columns actually listed in the INSERT statement"],"exampleFix":"// before\nINSERT INTO t (a) VALUES (1) ON DUPLICATE KEY UPDATE b = VALUES(b);\n// after\nINSERT INTO t (a, b) VALUES (1, 2) ON DUPLICATE KEY UPDATE b = VALUES(b);","handlingStrategy":"validation","validationCode":"// validate VALUES() references against the INSERT column list\ncols := map[string]bool{\"a\": true, \"b\": true} // ins.Columns\nfor _, ref := range valuesFuncRefs {\n    if !cols[ref] {\n        return fmt.Errorf(\"unknown column %q in field list\", ref)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"unknown column\") && strings.Contains(err.Error(), \"field list\") {\n    // fix statement: add missing column to INSERT list\n}","preventionTips":["Only use VALUES(col) for columns present in the INSERT column list","Check column-name spelling in ON DUPLICATE KEY UPDATE clauses","Add tests for dynamically generated upsert statements"],"tags":["vitess","vtgate","upsert","sql-syntax","unknown-column"],"backgroundTag":"unknown-column-in-field-list","analyzedSha":"01a25a7d176f94613b8d59d799f438380a8760e4","analyzedAt":"2026-09-01T17:28:30.605Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}