{"record":{"id":"4254320a67dc1466","repo":"googleapis/mcp-toolbox","slug":"unable-to-parse-row-w-425432","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/oceanbase/oceanbase.go","lineNumber":134,"sourceCode":"\n\t// create an array of values for each column, which can be re-used to scan each row\n\trawValues := make([]any, len(cols))\n\tvalues := make([]any, len(cols))\n\tfor i := range rawValues {\n\t\tvalues[i] = &rawValues[i]\n\t}\n\tdefer results.Close()\n\n\tcolTypes, err := results.ColumnTypes()\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"unable to get column types: %w\", err)\n\t}\n\n\tout := []any{}\n\tfor results.Next() {\n\t\terr := results.Scan(values...)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"unable to parse row: %w\", err)\n\t\t}\n\t\tvMap := make(map[string]any)\n\t\tfor i, name := range cols {\n\t\t\tval := rawValues[i]\n\t\t\tif val == nil {\n\t\t\t\tvMap[name] = nil\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// oceanbase uses mysql driver\n\t\t\tvMap[name], err = mysqlcommon.ConvertToType(colTypes[i], val)\n\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"errors encountered when converting values: %w\", err)\n\t\t\t}\n\t\t}\n\t\tout = append(out, vMap)\n\t}\n","sourceCodeStart":116,"sourceCodeEnd":152,"githubUrl":"https://github.com/googleapis/mcp-toolbox/blob/8cc6e09de2ad7b8bffc77751799585a1401a48eb/internal/sources/oceanbase/oceanbase.go#L116-L152","documentation":"OceanBase RunSQL scans each row of a query result into pre-allocated value holders; when database/sql's Scan cannot convert a column value into the target Go type (e.g. a NULL into a non-nullable holder or a type mismatch), it wraps the driver error with this message.","triggerScenarios":"Calling the OceanBase RunSQL tool with a query whose returned column value cannot be scanned into rawValues, such as unsupported column types or NULLs where a non-nil target is expected.","commonSituations":"Queries returning exotic OceanBase/MySQL column types (e.g. BIT, JSON, spatial types) that the go-sql-driver does not decode; schema drift where a column type changed after the query was written.","solutions":["Check the wrapped %w driver error to identify the failing column and value","Adjust the SQL to cast unsupported columns (e.g. CAST(col AS CHAR))","Ensure parseTime=true DSN settings match DATETIME/TIMESTAMP usage","Update the go-sql-driver/mysql and mysqlcommon converters to a version supporting the type"],"exampleFix":"// before\nSELECT data FROM t;\n// after\nSELECT CAST(data AS CHAR) AS data FROM t;","handlingStrategy":"try-catch","validationCode":"// validate column types before relying on values\nrows, _ := db.Query(sql)\ncts, _ := rows.ColumnTypes()\nfor i, ct := range cts {\n    if len(ct.ScanType() == nil) > 0 { /* nullable holders required */ }\n}","typeGuard":"func hasNonNull(v any) bool { return v != nil }","tryCatchPattern":"out, err := oceanbaseSource.RunSQL(ctx, sql)\nif err != nil {\n    var scanErr *fmt.WrapError\n    if strings.Contains(err.Error(), \"unable to parse row\") {\n        // inspect offending column, adjust SQL casts\n    }\n    return err\n}","preventionTips":["CAST unsupported column types to CHAR in SQL","Use NULL-safe holders (sql.RawBytes/any) for possibly-null columns","Test queries against the real schema before deploying","Keep the mysql driver version current"],"tags":["database","scan","row-parsing","oceanbase"],"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"}