googleapis/mcp-toolbox · error

unable to parse row: %w

Error message

unable to parse row: %w

What it means

results.Scan failed to copy the current row into the destination slice in RunSQL — a value could not be converted into the allocated scan target for that column.

Source

Thrown at internal/sources/tidb/tidb.go:141

	// create an array of values for each column, which can be re-used to scan each row
	rawValues := make([]any, len(cols))
	values := make([]any, len(cols))
	for i := range rawValues {
		values[i] = &rawValues[i]
	}
	defer results.Close()

	colTypes, err := results.ColumnTypes()
	if err != nil {
		return nil, fmt.Errorf("unable to get column types: %w", err)
	}

	out := []any{}
	for results.Next() {
		err := results.Scan(values...)
		if err != nil {
			return nil, fmt.Errorf("unable to parse row: %w", err)
		}
		vMap := make(map[string]any)
		for i, name := range cols {
			val := rawValues[i]
			if val == nil {
				vMap[name] = nil
				continue
			}

			// mysql driver return []uint8 type for "TEXT", "VARCHAR", and "NVARCHAR"
			// we'll need to cast it back to string
			switch colTypes[i].DatabaseTypeName() {
			case "JSON":
				// unmarshal JSON data before storing to prevent double
				// marshaling
				byteVal, ok := val.([]byte)
				if !ok {
					return nil, fmt.Errorf("expected []byte for JSON column, but got %T", val)

View on GitHub (pinned to 8cc6e09de2)

Solutions

  1. Inspect the wrapped error for the failing column
  2. Cast the problematic column in the SQL (e.g. CONVERT/CAST)
  3. Check for NULL handling mismatches
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at internal/sources/tidb/tidb.go:141 when the library encounters an invalid state.

Common situations: See trigger scenarios.

Understand the failure class


AI-assisted analysis of googleapis/mcp-toolbox@8cc6e09de2 (2026-09-05). Data as JSON: /api/errors/21e7233bf7ba60af. Report an issue: GitHub.