{"record":{"id":"d6e312ea942b2feb","repo":"go-gorm/gorm","slug":"unsupported-select-args-v-v","errorCode":null,"errorMessage":"unsupported select args %v %v","messagePattern":"unsupported select args (.+?) (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"chainable_api.go","lineNumber":126,"sourceCode":"//\t// Select name and age of user using multiple arguments\n//\tdb.Select(\"name\", \"age\").Find(&users)\n//\t// Select name and age of user using an array\n//\tdb.Select([]string{\"name\", \"age\"}).Find(&users)\nfunc (db *DB) Select(query interface{}, args ...interface{}) (tx *DB) {\n\ttx = db.getInstance()\n\n\tswitch v := query.(type) {\n\tcase []string:\n\t\ttx.Statement.Selects = v\n\n\t\tfor _, arg := range args {\n\t\t\tswitch arg := arg.(type) {\n\t\t\tcase string:\n\t\t\t\ttx.Statement.Selects = append(tx.Statement.Selects, arg)\n\t\t\tcase []string:\n\t\t\t\ttx.Statement.Selects = append(tx.Statement.Selects, arg...)\n\t\t\tdefault:\n\t\t\t\ttx.AddError(fmt.Errorf(\"unsupported select args %v %v\", query, args))\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\n\t\tif clause, ok := tx.Statement.Clauses[\"SELECT\"]; ok {\n\t\t\tclause.Expression = nil\n\t\t\ttx.Statement.Clauses[\"SELECT\"] = clause\n\t\t}\n\tcase string:\n\t\tif strings.Count(v, \"?\") >= len(args) && len(args) > 0 {\n\t\t\ttx.Statement.AddClause(clause.Select{\n\t\t\t\tDistinct:   db.Statement.Distinct,\n\t\t\t\tExpression: clause.Expr{SQL: v, Vars: args},\n\t\t\t})\n\t\t} else if strings.Count(v, \"@\") > 0 && len(args) > 0 {\n\t\t\ttx.Statement.AddClause(clause.Select{\n\t\t\t\tDistinct:   db.Statement.Distinct,\n\t\t\t\tExpression: clause.NamedExpr{SQL: v, Vars: args},","sourceCodeStart":108,"sourceCodeEnd":144,"githubUrl":"https://github.com/go-gorm/gorm/blob/1d6ce99528060be18a42be09aca8d39efcb47f28/chainable_api.go#L108-L144","documentation":"db.Select accepts either []string (plus optional string/[]string variadic args) or a string template with '?' placeholders. If query is []string but an arg is neither string nor []string (e.g. int, struct), GORM adds fmt.Errorf(\"unsupported select args %v %v\", query, args) and stops building the SELECT clause. It is a client-side argument-type validation error, not SQL.","triggerScenarios":"db.Select([]string{\"id\", \"name\"}, 5) or Select([]string{\"name\"}, someStruct); also dynamically building args and letting a non-string type slip in (interface{} slices from config or JSON).","commonSituations":"Passing constants for a template Select into the []string form: Select([]string{\"name\"}, clause.Eq{...}); config-driven column lists where one entry is a number; refactors moving args from Select(\"?\", x) to the list form without converting x to string.","solutions":["Keep list-form Select args strings only: convert values with fmt.Sprint(v).","For expression-based selection use the template form Select(\"price * ? AS total\", qty).","Validate/normalize column lists at config load time (all entries must be strings).","Check tx.Error right after Select in dynamic query builders to fail fast."],"exampleFix":"// before\ndb.Select([]string{\"name\"}, 42).Find(&users)\n\n// after\ndb.Select([]string{\"name\", fmt.Sprint(42)}).Find(&users)\n// or template form:\ndb.Select(\"?\", 42).Find(&users)","handlingStrategy":"validation","validationCode":"func validSelectArgs(args ...interface{}) error {\n    for _, a := range args {\n        switch a.(type) {\n        case string, []string:\n        default:\n            return fmt.Errorf(\"Select arg %v must be string or []string\", a)\n        }\n    }\n    return nil\n}\n// normalize before calling Select:\ncols := toStrings(configColumns) // all entries strings\ndb.Select(cols)","typeGuard":"func isSelectArgOK(v interface{}) bool {\n    switch v.(type) {\n    case string, []string: return true\n    default: return false\n    }\n}","tryCatchPattern":"tx := db.Select(cols, args...)\nif tx.Error != nil && strings.Contains(tx.Error.Error(), \"unsupported select args\") {\n    // convert non-string args via fmt.Sprint and rebuild the Select\n}","preventionTips":["Use the list form Select([]string{...}) only with strings; use the template form Select(\"?\", v) for values.","Normalize config-driven column lists to []string at load time.","Check tx.Error immediately after Select in dynamic builders - it fails before any SQL runs."],"tags":["gorm","select","query-builder","argument-validation"],"backgroundTag":null,"analyzedSha":"1d6ce99528060be18a42be09aca8d39efcb47f28","analyzedAt":"2026-08-15T13:01:23.433Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}