{"record":{"id":"01a878f400a63e86","repo":"googleapis/mcp-toolbox","slug":"unable-to-parse-row-w-01a878","errorCode":null,"errorMessage":"unable to parse row: %w","messagePattern":"unable to parse row: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/sources/firebird/firebird.go","lineNumber":127,"sourceCode":"\tdefer rows.Close()\n\n\tcols, err := rows.Columns()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to get columns: %w\", err)\n\t}\n\n\tvalues := make([]any, len(cols))\n\tscanArgs := make([]any, len(values))\n\tfor i := range values {\n\t\tscanArgs[i] = &values[i]\n\t}\n\n\tout := []any{}\n\tfor rows.Next() {\n\n\t\terr = rows.Scan(scanArgs...)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to parse row: %w\", err)\n\t\t}\n\n\t\tvMap := make(map[string]any)\n\t\tfor i, col := range cols {\n\t\t\tif b, ok := values[i].([]byte); ok {\n\t\t\t\tvMap[col] = string(b)\n\t\t\t} else {\n\t\t\t\tvMap[col] = values[i]\n\t\t\t}\n\t\t}\n\t\tout = append(out, vMap)\n\t}\n\n\tif err := rows.Err(); err != nil {\n\t\treturn nil, fmt.Errorf(\"error iterating rows: %w\", err)\n\t}\n\n\t// In most cases, DML/DDL statements like INSERT, UPDATE, CREATE, etc. might return no rows","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/sources/firebird/firebird.go#L109-L145","documentation":"Wraps rows.Scan failures while iterating result rows in RunSQL. Scan fails when a column value cannot be converted into the *interface{} destination — usually a driver-level type (e.g. Firebird BLOB subtype, numeric/decimal, timestamp with unusual precision) the firebirdsql driver returns in a form database/sql rejects.","triggerScenarios":"RunSQL hits a row containing a column type the driver cannot scan into any (e.g. malformed BLOB/ARRAY columns, oversized DECIMAL, NULL handling bug in the driver, or charset decoding failure).","commonSituations":"SELECT * on tables with BLOB or array columns; Firebird dialect 1 legacy column types; non-UTF8 character-set databases producing undecodable strings; driver version bugs with TIMESTAMP/TIME types.","solutions":["Cast problematic columns in SQL (e.g. CAST(blob_col AS VARCHAR(...)) or SUBSTRING) instead of selecting raw BLOB/ARRAY columns","Upgrade the firebirdsql driver to the latest version for scan fixes","Set a compatible connection charset (e.g. UTF8) in the DSN","Narrow the SELECT list to plain scalar columns"],"exampleFix":"// before\nerr = rows.Scan(scanArgs...)\nif err != nil {\n    return nil, fmt.Errorf(\"unable to parse row: %w\", err)\n}\n// after\nerr = rows.Scan(scanArgs...)\nif err != nil {\n    return nil, fmt.Errorf(\"unable to parse row %d: %w\", len(out), err)\n}","handlingStrategy":"validation","validationCode":"// Avoid raw BLOB/ARRAY columns in the SELECT list\nfor _, col := range problematicTypes {\n    if strings.Contains(strings.ToUpper(statement), col) {\n        return fmt.Errorf(\"cast %s to VARCHAR in SQL to avoid scan errors\", col)\n    }\n}","typeGuard":"func isScanTypeError(err error) bool {\n    return strings.Contains(err.Error(), \"unsupported Scan\") || strings.Contains(err.Error(), \"converting\")\n}","tryCatchPattern":"err = rows.Scan(scanArgs...)\nif err != nil {\n    if isScanTypeError(err) {\n        return nil, fmt.Errorf(\"unsupported column type at row %d; CAST the column in SQL: %w\", len(out), err)\n    }\n    return nil, fmt.Errorf(\"unable to parse row %d: %w\", len(out), err)\n}","preventionTips":["CAST BLOB/ARRAY/DECIMAL columns to scalar types in SQL","Set an explicit UTF8-compatible connection charset in the DSN","Scan with sql.RawBytes or sql.Null* types for nullable/odd columns","Add a CI query covering the widest-schema table to catch scan regressions"],"tags":["firebird","scan","data-type","blob"],"backgroundTag":"row-scan-type-mismatch","analyzedSha":"8cc6e09de2ad7b8bffc77751799585a1401a48eb","analyzedAt":"2026-09-05T01:10:36.887Z","contentChangedAt":"2026-09-05T01:10:36.887Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}