jackc/pgx · error

anyArrayArrayReflect: cannot scan multi-dimensional array…

Error message

anyArrayArrayReflect: cannot scan multi-dimensional array into %v

What it means

SetDimensions on anyArrayArrayReflect received more than one array dimension, but the reflection-based target is a flat (one-dimensional) Go slice. Multidimensional PostgreSQL arrays can only be scanned into types implementing ArrayIndexGetter for nested dimensions, e.g. [][]T.

Solutions

  1. Use a nested slice type ([][]T) matching the array's dimensions
  2. Flatten the array in SQL before scanning
  3. Scan into a type that accepts multi-dimensional arrays such as pgtype.Array
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at pgtype/builtin_wrappers.go:936 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of jackc/pgx@ec1a0befd2 (2026-08-04). Data as JSON: /api/errors/28ad976c7e0b94e9. Report an issue: GitHub.

Appendix: source

Thrown at pgtype/builtin_wrappers.go:936

func (a anyArrayArrayReflect) Dimensions() []ArrayDimension {
	return []ArrayDimension{{Length: int32(a.array.Len()), LowerBound: 1}}
}

func (a anyArrayArrayReflect) Index(i int) any {
	return a.array.Index(i).Interface()
}

func (a anyArrayArrayReflect) IndexType() any {
	return reflect.New(a.array.Type().Elem()).Elem().Interface()
}

func (a *anyArrayArrayReflect) SetDimensions(dimensions []ArrayDimension) error {
	if dimensions == nil {
		return fmt.Errorf("anyArrayArrayReflect: cannot scan NULL into %v", a.array.Type().String())
	}

	if len(dimensions) != 1 {
		return fmt.Errorf("anyArrayArrayReflect: cannot scan multi-dimensional array into %v", a.array.Type().String())
	}

	if int(dimensions[0].Length) != a.array.Len() {
		return fmt.Errorf("anyArrayArrayReflect: cannot scan array with length %v into %v", dimensions[0].Length, a.array.Type().String())
	}

	return nil
}

func (a *anyArrayArrayReflect) ScanIndex(i int) any {
	return a.array.Index(i).Addr().Interface()
}

func (a *anyArrayArrayReflect) ScanIndexType() any {
	return reflect.New(a.array.Type().Elem()).Interface()
}

View on GitHub (pinned to ec1a0befd2)