{"record":{"id":"1cb93b28b1aa10e1","repo":"t8y2/dbx","slug":"invalid-attribute-number-q","errorCode":null,"errorMessage":"invalid attribute number %q","messagePattern":"invalid attribute number %q","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agents/drivers/kingbase-go/kingbase_metadata.go","lineNumber":1630,"sourceCode":"\tcase nil:\n\t\treturn []int{}, nil\n\tcase string:\n\t\tvalue = typed\n\tcase []byte:\n\t\tvalue = string(typed)\n\tdefault:\n\t\tvalue = fmt.Sprint(typed)\n\t}\n\tvalue = strings.TrimSpace(strings.Trim(value, \"{}[]\"))\n\tif value == \"\" {\n\t\treturn []int{}, nil\n\t}\n\tparts := strings.FieldsFunc(value, func(r rune) bool { return r == ',' || r == ' ' || r == '\\t' })\n\tresult := make([]int, 0, len(parts))\n\tfor _, part := range parts {\n\t\tnumber, err := strconv.Atoi(strings.TrimSpace(part))\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"invalid attribute number %q\", part)\n\t\t}\n\t\tresult = append(result, number)\n\t}\n\treturn result, nil\n}\n\nfunc (s *server) relationAttributesByNumber(catalog, prefix, schema, table string) (map[int]string, error) {\n\tquery := fmt.Sprintf(`SELECT a.attnum, a.attname\nFROM %s.%s_attribute a JOIN %s.%s_class c ON c.oid = a.attrelid\nJOIN %s.%s_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname = %s AND c.relname = %s AND a.attnum > 0 AND NOT a.attisdropped`, catalog, prefix, catalog, prefix, catalog, prefix, quoteLiteral(schema), quoteLiteral(table))\n\trows, err := s.metadataQuery(query)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tdefer rows.Close()\n\tresult := map[int]string{}\n\tfor rows.Next() {","sourceCodeStart":1612,"sourceCodeEnd":1648,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/agents/drivers/kingbase-go/kingbase_metadata.go#L1612-L1648","documentation":"Produced by parseCatalogAttributeNumbers when a token split out of a catalog attribute-number list (indkey, conkey, confkey) is not a valid integer. The helper expects the raw value to be a brace/bracket-delimited, comma/space separated list of integers like \"1 2 3\"; strconv.Atoi fails on anything else. It is always wrapped by callers (\"failed to parse index/foreign key ... columns\").","triggerScenarios":"Any catalog metadata listing (indexes or foreign keys via listIndexesWithoutOrdinality / listForeignKeysFromCatalog) where the scanned conkey/confkey/indkey value, after trimming \"{}[]\", splits into tokens containing non-numeric characters — e.g. expression-index placeholders with unexpected values, corrupted catalog rows, or a driver delivering the array in an unexpected textual form.","commonSituations":"Connecting to a Kingbase version whose int2vector/int2[] text rendering differs (e.g. extra characters, quoted elements); a driver type-mapping change causing the array to arrive as a formatted structure whose fmt.Sprint output isn't a plain integer list; hand-edited or corrupted catalog data.","solutions":["Read the %q token in the message to see exactly which value is unparseable","Run the underlying catalog query manually (SELECT indkey/conkey/confkey ...) to inspect the raw format the server returns","Fix the data: drop/recreate the affected index or constraint so the catalog regenerates a numeric list","Align driver/compat mode or upgrade the driver so the array type is scanned as a plain string of integers"],"exampleFix":"// before: bad catalog value \"1 2 x\" fails\nnums, err := parseCatalogAttributeNumbers(raw) // invalid attribute number \"x\"\n// after: repair the catalog entry\n// find the constraint/index and recreate it: ALTER TABLE ... DROP CONSTRAINT fk_x; ALTER TABLE ... ADD CONSTRAINT fk_x FOREIGN KEY ... ;\nnums, err := parseCatalogAttributeNumbers(raw) // []int{1,2}","handlingStrategy":"validation","validationCode":"// Go: validate the raw attribute list looks like integers before calling APIs that parse it\nfunc looksLikeAttributeNumbers(raw any) bool {\n    var s string\n    switch v := raw.(type) {\n    case nil:\n        return true\n    case string:\n        s = v\n    case []byte:\n        s = string(v)\n    default:\n        s = fmt.Sprint(v)\n    }\n    for _, tok := range strings.FieldsFunc(strings.Trim(strings.TrimSpace(s), \"{}[]\"), func(r rune) bool { return r == ',' || r == ' ' || r == '\\t' }) {\n        if _, err := strconv.Atoi(strings.TrimSpace(tok)); err != nil {\n            return false\n        }\n    }\n    return true\n}","typeGuard":"func isValidAttributeNumberList(raw any) bool {\n    s, ok := raw.(string)\n    if !ok {\n        b, isBytes := raw.([]byte)\n        if !isBytes { return raw == nil }\n        s = string(b)\n    }\n    s = strings.TrimSpace(strings.Trim(s, \"{}[]\"))\n    if s == \"\" { return true }\n    for _, tok := range strings.FieldsFunc(s, func(r rune) bool { return r == ',' || r == ' ' || r == '\\t' }) {\n        if _, err := strconv.Atoi(tok); err != nil { return false }\n    }\n    return true\n}","tryCatchPattern":null,"preventionTips":["Check conkey/confkey/indkey as text (cast to ::text) when debugging to see the exact server-side format","Keep catalog data clean: recreate constraints/indexes instead of hand-editing system tables","Test metadata queries against every Kingbase version you support, especially legacy V7","If you control the scan, scan array columns as text so formatting surprises surface early"],"tags":["go","parsing","kingbase","catalog","database"],"backgroundTag":"catalog-attribute-parse-failed","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}