{"record":{"id":"e5baafeadfddd7a6","repo":"t8y2/dbx","slug":"failed-to-read-composite-fields-w-e5baaf","errorCode":null,"errorMessage":"failed to read composite fields: %w","messagePattern":"failed to read composite fields: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"agents/drivers/vastbase-go/vastbase_metadata.go","lineNumber":748,"sourceCode":"\tindex := 0\n\tfor rows.Next() {\n\t\tvar label string\n\t\tvar sortOrder float64\n\t\tif err := rows.Scan(&label, &sortOrder); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\t// enumsortorder is float4; ALTER TYPE ... ADD VALUE BEFORE/AFTER can\n\t\t// yield fractional values. Use the ORDER BY position for a unique key.\n\t\tindex++\n\t\tmembers = append(members, customTypeMember{Ordinal: int32(index), EnumValue: &label})\n\t}\n\treturn members, rows.Err()\n}\n\nfunc (s *server) customTypeCompositeMembers(sqlTemplate string, typrelid int64) ([]customTypeMember, error) {\n\trows, err := s.metadataQuery(fmt.Sprintf(sqlTemplate, typrelid, typrelid))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to read composite fields: %w\", err)\n\t}\n\tdefer rows.Close()\n\tvar members []customTypeMember\n\tfor rows.Next() {\n\t\tvar member customTypeMember\n\t\tvar hasDefault bool\n\t\tvar comment sql.NullString\n\t\tif err := rows.Scan(&member.Name, &member.DataType, &member.Ordinal, &member.Nullable, &hasDefault, &member.Default, &comment); err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t\tif !hasDefault {\n\t\t\tmember.Default = nil\n\t\t}\n\t\tmember.Comment = nullStringPtr(comment)\n\t\tmembers = append(members, member)\n\t}\n\treturn members, rows.Err()\n}","sourceCodeStart":730,"sourceCodeEnd":766,"githubUrl":"https://github.com/t8y2/dbx/blob/c0390bff16418b651f4728520d99adf8ce48829a/agents/drivers/vastbase-go/vastbase_metadata.go#L730-L766","documentation":"This error wraps a failure of the catalog query that reads composite type fields (attribute names, types, ordinals) for a composite custom type, returned by customTypeCompositeMembers when metadataQuery fails. Like the enum variant, the composite type row was found; only reading its member fields failed.","triggerScenarios":"Requesting details of a composite type when the composite-members metadata query errors: connection loss, missing catalog privileges on pg_attribute/pg_type joins, or catalog query templates mismatched to the server (sys_catalog vs pg_catalog mode).","commonSituations":"Introspecting composite types with a limited-privilege role; transient network failures; running against a Vastbase build whose catalog layout differs from the assumed template.","solutions":["Re-check connectivity and retry; inspect the wrapped cause for the underlying DB error.","Grant the introspection role SELECT on pg_attribute/pg_type (or sys_catalog equivalents).","Ensure the driver's catalog mode (postgresCatalog flag) matches the target server.","If the wrapped error is structural (unknown column), update the driver or adjust catalog query templates."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"if err := db.Ping(); err != nil { return err }\nvar n int\nif err := db.QueryRow(\"SELECT COUNT(*) FROM pg_attribute LIMIT 1\").Scan(&n); err != nil {\n    return fmt.Errorf(\"no catalog attribute access: %w\", err)\n}","typeGuard":null,"tryCatchPattern":"details, err := srv.CustomTypeDetails(schema, name)\nif err != nil && strings.Contains(err.Error(), \"failed to read composite fields\") {\n    if isTransient(errors.Unwrap(err)) { /* retry with backoff */ }\n}","preventionTips":["Ensure the introspection role can read pg_attribute/pg_type.","Retry transient network failures with backoff.","Verify driver/server version compatibility before large introspection jobs."],"tags":["vastbase","metadata","database","composite-types"],"backgroundTag":"metadata-query-failed","analyzedSha":"c0390bff16418b651f4728520d99adf8ce48829a","analyzedAt":"2026-09-05T23:05:10.900Z","contentChangedAt":"2026-09-05T23:05:10.900Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}