Error while scanning column of type `array<decimal(10,2)>` into Go type `[]float64`
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Ejecuta la reproducción reportada de Test_Float64_Conversion y, después, lee internal/rows/arrowbased/columnValues.go alrededor de listValueContainer.Value, identificado como el origen del valor de tipo string. Se considera completado cuando el escaneo de una columna array<decimal(10,2)> en []float64 se realiza correctamente sin el error de conversión de database/sql reportado.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
I have a table that has a column AMOUNTS with a type array<decimal(10,2)>, which I expect to scan into a field type []float64.
This is the test I wrote to reproduce it:
func (s *DatabricksRepositorySuite) Test_Float64_Conversion() {
query := `SELECT AMOUNTS FROM components WHERE AMOUNTS IS NOT NULL AND array_size(AMOUNTS) > 0 LIMIT 1`
var result []float64
err := s.repository.db.QueryRow(query).Scan(&result)
s.NoError(err)
}
When I run my query, I get this error:
sql: Scan error on column index 0, name "AMOUNTS": unsupported Scan, storing driver.Value type string into type *[]float64
Source
This error comes from the standard library in Go: the value for that field is provided by the SDK as a string, but the destination is []float64, so it fails. I also dove into Databricks' SDK source code and found the place [2] where the string is generated.
[1] Golang source - convertAssignRows
[2] Databricks SDK - listValueContainer.Value
Workaround
I created a custom type for the fields I have that use arrays:
import (
"database/sql/driver"
"encoding/json"
"errors"
)
type databricksArray[T any] struct {
parsedValue []T
}
func (f *databricksArray[T]) Scan(value interface{}) error {
switch typedValue := value.(type) {
case []T:
f.parsedValue = typedValue
return nil
case string:
return f.parseString(typedValue)
default:
return errors.New("error while handling databricks type")
}
}
func (f *databricksArray[T]) parseString(value string) error {
// This is a workaround for Databricks returning float arrays as strings
// Example: `[1.0, 2.0, 3.0]`
// We need to convert it to an array
// This should be removed if/when Databricks fixes this issue
valueBytes := []byte(value)
var parsedValue []T
if err := json.Unmarshal(valueBytes, &parsedValue); err != nil {
return err
}
f.parsedValue = parsedValue
return nil
}
func (f *databricksArray[T]) Value() (driver.Value, error) {
return f.parsedValue, nil
}
func (f *databricksArray[T]) Slice() []T {
if f == nil {
return nil
}
return f.parsedValue
}
So my field
Amount []float64 `db:"AMOUNTS"`
is now
Amount databricksArray[float64] `db:"AMOUNTS"`
and I call Amount.Slice() when I want to read its value.
- Lenguaje dominante
- Go
- Estrellas
- 53
- Forks
- 67
- Merge medio
- 21 h 29 min
- PR fusionados (30 d)
- 12
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de databricks/databricks-sql-go
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
databricks/databricks-sql-go#476 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 64/100
databricks/databricks-sql-go#490 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 55/100
databricks/databricks-sql-go#481 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 52/100
databricks/databricks-sql-go#480 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
databricks/databricks-sql-go#475 · 1 comentario ·
Los mantenedores suelen responder en 1 día
Todos los issues de databricks/databricks-sql-go
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 90/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
NVIDIA/k8s-device-plugin#2076 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 84/100
Los mantenedores suelen responder en 1 día
-
agentic-workflows
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
area/release kind/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
kubernetes-sigs/kueue#16455 · 1 comentario ·
Los mantenedores suelen responder en 1 día